2015-09-04 163 views
0

我有一個固定採樣率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

回答

1

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 []變量的代碼中。