我希望使用 FFT 和 Kissfft 库计算快速相关性,并且缩放需要精确。什么缩放是必要的(向前和向后),我用什么值来缩放我的数据?
问问题
6666 次
2 回答
11
3 个最常见的 FFT 比例因子是:
1.0 正向 FFT,1.0/N 反向 FFT
1.0/N 正向 FFT,1.0 反向 FFT
1.0/sqrt(N) 双向,FFT & IFFT
考虑到文档中可能存在的任何歧义,以及用户期望对其目的“正确”的任何缩放,最好只提供一个已知(1.0 浮点或 255 整数)幅度且在 FFT 长度中精确周期性的纯正弦波有问题的 FFT(和/或 IFFT),并查看缩放是否与上述之一匹配,可能与上述之一不同 2X 或 sqrt(2),或者所需的缩放完全不同。
例如,在您的环境中为您的数据类型编写一个kissfft 单元测试。
于 2011-04-12T00:32:25.063 回答
6
将每个频率响应乘以 1/sqrt(N),总比例为 1/N
在伪代码中:
ifft( fft(x)*conj( fft(y) )/N ) == circular_correlation(x,y)
至少这对于具有浮点类型的 kisfft 是正确的。
以下 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;
}
于 2011-04-12T02:57:55.707 回答