如何从录音中的采样率计算FFT点

时间:2015-09-04 14:03:36

标签: android audio signal-processing fft 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。我尝试使用这些值,但声音出现噪音。谢谢。 参考链接为here

1 个答案:

答案 0 :(得分:1)

FFT算法不关心采样率。我知道这听起来有些不直观,但输出的每个样本(称为bin)表示内容的幅度(SAMPLING_FREQUENCY / FFT_POINTS)Hz宽。

MAGIC_SCALE只是一个扩展数据的值,在处理双打时没有真正的影响。如果它是使用16位整数的DFFT,那么你需要一个缩放因子来确保输入在计算过程中不会饱和/溢出。

请注意,FFT函数永远不会被告知SAMPLING_FREQUENCY或MAGIC_SCALE是什么。

在44100和1024的情况下,每个箱是~43Hz的谱内容。在16000的情况下,它是~15Hz。

如果44100有效且16000没有,则问题可能出在管理audioBuffer []变量的代码中。