如何从音频录制中的采样率计算FFT点
问题描述:
我有一个固定采样率fft点的音频录制示例代码。此代码是如何从音频录制中的采样率计算FFT点
private static final String FILE_NAME = "audiorecordtest.raw";
private static final int SAMPLING_RATE = 44100;
private static final int FFT_POINTS = 1024;
private static final int MAGIC_SCALE = 10;
private void proceed() {
double temp;
Complex[] y;
Complex[] complexSignal = new Complex[FFT_POINTS];
for (int i=0; i<FFT_POINTS; i++) {
temp = (double)((audioBuffer[2*i] & 0xFF) | (audioBuffer[2*i+1] << 8))/32768.0F;
complexSignal[i] = new Complex(temp * MAGIC_SCALE, 0d);
}
y = FFT.fft(complexSignal);
/*
* See http://developer.android.com/reference/android/media/audiofx/Visualizer.html#getFft(byte[]) for format explanation
*/
final byte[] y_byte = new byte[y.length*2];
y_byte[0] = (byte) y[0].re();
y_byte[1] = (byte) y[y.length - 1].re();
for (int i = 1; i < y.length - 1; i++) {
y_byte[i*2] = (byte) y[i].re();
y_byte[i*2+1] = (byte) y[i].im();
}
if (handler != null) {
handler.onFftDataCapture(y_byte);
}
}
该代码用于记录音频录制的原始文件。但是,我想将SAMPLING_RATE
更改为16000.我可以使用相同的FFT_POINTS是否是1024?如果不是,请告诉我如何计算它和MAGIC_SCALE。我试图使用该值,但声音出现噪音。谢谢。 参考链接是here
答
FFT算法不关心采样率。我知道这听起来有些不直观,但是每个输出样本(称为bin)代表(SAMPLING_FREQUENCY/FFT_POINTS)Hz宽度内容的大小。
MAGIC_SCALE只是一个扩展数据的价值,在处理双打时不会产生真正的影响。如果它是一个使用16位整数的DFFT,则需要一个缩放因子来确保输入在计算过程中不会饱和/溢出。
请注意,FFT函数永远不会告诉SAMPLING_FREQUENCY或MAGIC_SCALE是什么。
在44100和1024的情况下,每个bin是〜43Hz的频谱内容。在16000的情况下,它是〜15Hz。
如果44100有效并且16000不可用,则问题可能出在管理audioBuffer []变量的代码中。