我在分析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输出)