代码之家  ›  专栏  ›  技术社区  ›  Phillip

理解onWaveFormDataCapture字节数组格式

  •  0
  • Phillip  · 技术社区  · 6 年前

    我在分析Android上的音频信号。先用麦克风试了一下,成功了。现在我正在尝试将FFT应用到MP3数据源上 Visualizer.OnDataCaptureListener * onWaveFormDataCapture 链接到的方法 MediaPlayer . 有一个字节数组叫做 byte[] waveform 当对这些数据应用FFT时,我得到了频谱泄漏或重叠。

    public void onWaveFormDataCapture(Visualizer visualizer, byte[] waveform, int samplingRate)
    

    我试图通过在for循环中使用下面的代码将数据转换成-1..1范围;

            // waveform varies in range of -128..+127
            raw[i] = (double) waveform[i];
            // change it to range -1..1
            raw[i] /= 128.0;
    

    raw 进入fft缓冲区;

            fftre[i] = raw[i];
            fftim[i] = 0;
    

            fft.fft(fftre, fftim); // in: audio signal, out: fft data
    

    作为最后的过程,我把它们转换成以分贝为单位的大小,然后在屏幕上画出频率

            // Ignore the first fft data which is DC component
            for (i = 1, j = 0; i < waveform.length / 2; i++, j++)
            {
                magnitude = (fftre[i] * fftre[i] + fftim[i] * fftim[i]);
                magnitudes[j] = 20.0 * Math.log10(Math.sqrt(magnitude) + 1e-5); // [dB]
            }
    

    当我播放从20Hz到20kHz的扫频信号时,我看不到麦克风上看到的东西。它不画一条单独的行走线,而是画几条对称的走远或走近的线。不知何故,在可视化工具的另一端有一个较弱的对称信号。 同样的代码使用32768而不是128除法工作在麦克风输入与录音非常好。

    我哪里做错了? (是的,我知道有一个直接的fft输出)

    1 回复  |  直到 6 年前
        1
  •  3
  •   greeble31    6 年前

    raw[i] = (double) waveform[i] 导致意外的无符号到有符号的转换,并且 raw 当信号经过127/-128边界时,偏置到大约128直流电平时,一个小正弦波最终变成一个高振幅的修正方波。这就产生了一系列有趣的谐波(这导致了你所说的“对称线来来往往”)。

    更改为 (double) (waveform[i] & 0xFF) 所以转换后的值在0到255之间,而不是-128到127之间。