我想爲一個項目設置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:
這個項目的最終目標是做音頻的指紋,接近實時地,所以我需要的結果儘可能準確 - 這樣的重疊。爲了這個目的,我想我實際上可以將所有部分從反向刪除。
請參閱有關問題的更新。謝謝 –
確定 - 請參閱我的答案的最後部分了解如何進行重疊。 –
我正在考慮將採樣率降低到16kHz左右,而不是典型的44.1KHz。這應該允許我在不增加處理帶寬的情況下添加更大的重疊。無論如何都會試試這個,讓你知道它是怎麼回事 –