如何从录音中的采样率计算 FFT 点
How to compute FFT point from sampling rate in audio recording
我有一个固定采样率的示例代码,录音中的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。我尝试使用该值,但声音出现噪音。谢谢。
引用 link 是 here
FFT 算法不关心采样率。我知道这听起来有点不直观,但输出的每个样本(称为 bin)代表内容的大小,即 (SAMPLING_FREQUENCY / FFT_POINTS) Hz 宽。
MAGIC_SCALE 只是一个缩放数据的值,在处理双打时不会产生真正的影响。如果它是使用 16 位整数的 DFFT,您将有一个比例因子来确保您的输入在计算期间不会 saturate/overflow。
请注意,FFT 函数从未被告知 SAMPLING_FREQUENCY 或 MAGIC_SCALE 是什么。
在 44100 和 1024 的情况下,每个 bin 都是 ~43 Hz 的频谱内容。在 16000 的情况下,它是 ~15Hz。
如果 44100 有效而 16000 无效,则问题可能出在管理 audioBuffer[] 变量的代码中。
我有一个固定采样率的示例代码,录音中的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。我尝试使用该值,但声音出现噪音。谢谢。
引用 link 是 here
FFT 算法不关心采样率。我知道这听起来有点不直观,但输出的每个样本(称为 bin)代表内容的大小,即 (SAMPLING_FREQUENCY / FFT_POINTS) Hz 宽。
MAGIC_SCALE 只是一个缩放数据的值,在处理双打时不会产生真正的影响。如果它是使用 16 位整数的 DFFT,您将有一个比例因子来确保您的输入在计算期间不会 saturate/overflow。
请注意,FFT 函数从未被告知 SAMPLING_FREQUENCY 或 MAGIC_SCALE 是什么。
在 44100 和 1024 的情况下,每个 bin 都是 ~43 Hz 的频谱内容。在 16000 的情况下,它是 ~15Hz。
如果 44100 有效而 16000 无效,则问题可能出在管理 audioBuffer[] 变量的代码中。