我正在为一个项目设置FFT
,但是没有很清晰的概念...
基本上,我使用Audio Units
从设备的麦克风获取数据。然后我想对那些数据做FFT
。目前我的理解是:我需要为我的数据设置一个环形缓冲区。在每个填满的缓冲区上,我应用一个Hann窗口
,然后做一个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);
那么我应该在哪里以及如何包含重叠?同时,任何代码片段都将不胜感激。谢谢。
更新:
该项目的最终目标是对音频进行指纹识别,尽可能接近实时,因此我需要尽可能准确的结果 - 因此需要重叠。出于这个目的,我认为我实际上可以删除从反转到清理的所有部分。