]> git.sesse.net Git - kdenlive/blob - src/lib/audio/fftCorrelation.cpp
Working on FFT based correlation
[kdenlive] / src / lib / audio / fftCorrelation.cpp
1 #include "fftCorrelation.h"
2
3 extern "C"
4 {
5 #include "../external/kiss_fft/tools/kiss_fftr.h"
6 }
7
8 #include <QTime>
9 #include <QDebug>
10 #include <algorithm>
11
12 void FFTCorrelation::correlate(float *left, int leftSize, float *right, int rightSize,
13                           float **out_correlationData, int &out_size)
14 {
15     QTime time;
16     time.start();
17
18     int largestSize = leftSize;
19     if (rightSize > largestSize) {
20         largestSize = rightSize;
21     }
22
23     int size = 64;
24     while (size/2 < largestSize) {
25         size = size << 1;
26     }
27
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];
33
34
35     float leftData[size];
36     float rightData[size];
37     *out_correlationData = new float[size];
38
39     std::fill(leftData, leftData+size, 0);
40     std::fill(rightData, rightData+size, 0);
41
42     std::copy(left, left+leftSize, leftData);
43     std::copy(right, right+rightSize, rightData);
44
45     kiss_fftr(fftConfig, leftData, leftFFT);
46     kiss_fftr(fftConfig, rightData, rightFFT);
47
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;
51     }
52
53     kiss_fftri(ifftConfig, correlatedFFT, *out_correlationData);
54     out_size = size;
55
56     qDebug() << "FFT correlation computed. Time taken: " << time.elapsed() << " ms";
57 }