умножьте каждый частотный отклик на 1 / sqrt (N) для общего масштабирования 1 / N
В псевдокоде:
ifft( fft(x)*conj( fft(y) )/N ) == circular_correlation(x,y)
По крайней мере, это верно для кисффта с типами с плавающей запятой.
Вывод следующего примера кода на c ++ должен выглядеть примерно так:
круговая корреляция [1, 3i, 0 0 ....] с самим собой = (10,0), (1.19796e-10,3), (- 4.91499e-08,1.11519e- 15), (1.77301e-08, -1.19588e-08) ...
#include <complex>
#include <iostream>
#include "kiss_fft.h"
using namespace std;
int main()
{
const int nfft=256;
kiss_fft_cfg fwd = kiss_fft_alloc(nfft,0,NULL,NULL);
kiss_fft_cfg inv = kiss_fft_alloc(nfft,1,NULL,NULL);
std::complex<float> x[nfft];
std::complex<float> fx[nfft];
memset(x,0,sizeof(x));
x[0] = 1;
x[1] = std::complex<float>(0,3);
kiss_fft(fwd,(kiss_fft_cpx*)x,(kiss_fft_cpx*)fx);
for (int k=0;k<nfft;++k) {
fx[k] = fx[k] * conj(fx[k]);
fx[k] *= 1./nfft;
}
kiss_fft(inv,(kiss_fft_cpx*)fx,(kiss_fft_cpx*)x);
cout << "the circular correlation of [1, 3i, 0 0 ....] with itself = ";
cout
<< x[0] << ","
<< x[1] << ","
<< x[2] << ","
<< x[3] << " ... " << endl;
kiss_fft_free(fwd);
kiss_fft_free(inv);
return 0;
}