2013-09-21 36 views
3

我想爲一個項目設置FFT,真的沒有得到一個清晰的圖片... 基本上,我使用Audio Units從該設備的麥克風。然後我想對該數據執行FFT。這是我目前瞭解的內容:我需要爲我的數據設置循環緩衝區。在每個填充的緩衝區中,我應用Hann window,然後執行FFT。但是,我仍然需要一些重疊幫助。爲了獲得更精確的結果,我明白我需要使用這expecially,因爲我正在使用窗口。但是,我找不到這樣的事...... 這裏是我迄今(用於基音檢測):使用Apple的加速框架,FFT,漢恩窗口和重疊

// Setup ------------- 
UInt32 log2N   = 10; // 1024 samples 
UInt32 N    = (1 << log2N); 
FFTSetup FFTSettings = vDSP_create_fftsetup(log2N, kFFTRadix2); 
COMPLEX_SPLIT FFTData; 
FFTData.realp   = (float *) malloc(sizeof(float) * N/2); 
FFTData.imagp   = (float *) malloc(sizeof(float) * N/2); 
float * hannWindow = (float *) malloc(sizeof(float) * N); 

// create an array of floats to represent a hann window 
vDSP_hann_window(hannWindow, N, 0); 

// FFT Time ---------- 
// Moving data from A to B via hann window 
vDSP_vmul(A, 1, hannWindow, 1, B, 1, N);         

// Converting data in B into split complex form 
vDSP_ctoz((COMPLEX *) B, 2, &FFTData, 1, N/2); 

// Doing the FFT 
vDSP_fft_zrip(FFTSettings, &FFTData, 1, log2N, kFFTDirection_Forward); 

// calculating square of magnitude for each value 
vDSP_zvmags(&FFTData, 1, FFTData.realp, 1, N/2); 

// Inverse FFT 
vDSP_fft_zrip(FFTSettings, &FFTData, 1, log2N, kFFTDirection_Inverse); 

// Storing the autocorrelation results in B 
vDSP_ztoc(&FFTData, 1, (COMPLEX *)B, 2, N/2); 

vDSP_Length lastZeroCrosssing; 
vDSP_Length zeroCrossingCount; 
vDSP_nzcros(B, 1, N, &lastZeroCrossing, &zeroCrossingCount, N); 

// Cleanup ----------- 
vDSP_destroy_fftsetup(FFTSettings); 
free(FFTOutput.realp); 
free(FFTOutput.imagp); 
free(hannWindow); 

那麼,我怎麼會包括重疊?而且,任何代碼片段都會受到歡迎。由於

UPDATE:

這個項目的最終目標是做音頻的指紋,接近實時地,所以我需要的結果儘可能準確 - 這樣的重疊。爲了這個目的,我想我實際上可以將所有部分從反向刪除。

回答

1

實際上你並不需要需要重疊 - 通常幀被重疊以在時間軸上提供更高的分辨率,例如,繪製頻譜圖或估計音符開始時間。您現在可以讓代碼不重疊地工作,因爲它不那麼複雜,然後再決定是否需要更高的時間軸分辨率。

如果您決定要添加,然後重複你將需要保存以前緩衝的塊(例如50%),然後爲每個新的緩衝區,你會處理兩個完整的緩衝區如下:

    新緩衝器的舊緩衝液+第一的50%的過程
  • 最後50%
  • 處理新的緩衝區100%
  • 節省新緩衝區的最後50%爲下一次迭代

對於每不同的重疊百分比適用類似的邏輯。

請注意,增加超過某一點的重疊可能會產生反作用,因爲所需的處理帶寬大大增加,分辨率增益很小。

+0

請參閱有關問題的更新。謝謝 –

+0

確定 - 請參閱我的答案的最後部分了解如何進行重疊。 –

+0

我正在考慮將採樣率降低到16kHz左右,而不是典型的44.1KHz。這應該允許我在不增加處理帶寬的情況下添加更大的重疊。無論如何都會試試這個,讓你知道它是怎麼回事 –