1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
|
static float* calculateAutocorrelationUsingFFT(float *m_samples) {
// calculate autocorrelation according to the Wiener–Khinchin theorem
// prepare calculation
FFTSetup m_fftSetup = vDSP_create_fftsetup(LOG_2N, kFFTRadix2);
DSPSplitComplex m_splitComplex;
m_splitComplex.realp = (float *)malloc(sizeof(float)*N/2);
m_splitComplex.imagp = (float *)malloc(sizeof(float)*N/2);
vDSP_ctoz((DSPComplex *)m_samples, 2, &m_splitComplex, 1, N/2);
// perform FFT
vDSP_fft_zrip(m_fftSetup, &m_splitComplex, 1, LOG_2N, kFFTDirection_Forward);
// calculate the absolute squares respectively the squared magnitudes
vDSP_zvmags(&m_splitComplex, 1, m_splitComplex.realp, 1, N/2);
memset(m_splitComplex.imagp, 0, sizeof(float)*N/2);
// perform IFFT
vDSP_fft_zrip(m_fftSetup, &m_splitComplex, 1, LOG_2N, kFFTDirection_Inverse);
// store autocorrelation result vector
vDSP_ztoc(&m_splitComplex, 1, (DSPComplex *)m_samples, 2, N/2);
return m_samples;
} |