kissfft scaling

我希望使用FFT和Kissfft库来计算快速相关性,并且缩放需要精确。需要进行哪些缩放(向前和向后)以及我使用什么值来扩展数据?     
已邀请:
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的单元测试。     
将每个频率响应乘以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;
}
    

要回复问题请先登录注册