1 #include "fftCorrelation.h"
5 #include "../external/kiss_fft/tools/kiss_fftr.h"
12 void FFTCorrelation::correlate(float *left, int leftSize, float *right, int rightSize,
13 float **out_correlationData, int &out_size)
18 int largestSize = leftSize;
19 if (rightSize > largestSize) {
20 largestSize = rightSize;
24 while (size/2 < largestSize) {
28 kiss_fftr_cfg fftConfig = kiss_fftr_alloc(size, false,NULL,NULL);
29 kiss_fftr_cfg ifftConfig = kiss_fftr_alloc(size, true, NULL,NULL);
30 kiss_fft_cpx leftFFT[size/2];
31 kiss_fft_cpx rightFFT[size/2];
32 kiss_fft_cpx correlatedFFT[size/2];
36 float rightData[size];
37 *out_correlationData = new float[size];
39 std::fill(leftData, leftData+size, 0);
40 std::fill(rightData, rightData+size, 0);
42 std::copy(left, left+leftSize, leftData);
43 std::copy(right, right+rightSize, rightData);
45 kiss_fftr(fftConfig, leftData, leftFFT);
46 kiss_fftr(fftConfig, rightData, rightFFT);
48 for (int i = 0; i < size/2; i++) {
49 correlatedFFT[i].r = leftFFT[i].r*rightFFT[i].r - leftFFT[i].i*rightFFT[i].i;
50 correlatedFFT[i].i = leftFFT[i].r*rightFFT[i].i + leftFFT[i].i*rightFFT[i].r;
53 kiss_fftri(ifftConfig, correlatedFFT, *out_correlationData);
56 qDebug() << "FFT correlation computed. Time taken: " << time.elapsed() << " ms";