首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >kissfft缩放

kissfft缩放
EN

Stack Overflow用户
提问于 2011-04-12 06:01:29
回答 2查看 6.6K关注 0票数 8

我希望使用FFT和kissfft库来计算快速相关性,并且缩放需要精确。需要什么缩放(向前和向后)?我应该使用什么值来缩放我的数据?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-12 08:32:25

3个最常见的FFT缩放因子是:

  • 1.0正向快速傅立叶变换,1.0/N反向快速傅立叶变换
  • 1.0 /N正向快速傅立叶变换,1.0双向反向快速傅立叶变换,快速傅立叶变换和IFFT

如果文档中有任何可能的歧义,并且对于用户期望“正确”的任何缩放,最好只是将已知(1.0浮点或255整数)振幅和FFT长度中的精确周期的纯正弦波馈送到所讨论的FFT (和/或IFFT),并查看缩放是否与上面的一个匹配,可能与上面的一个相差2倍或sqrt(2),或者所需的缩放是完全不同的。

例如,在您的环境中为您的数据类型编写一个kissfft单元测试。

票数 11
EN

Stack Overflow用户

发布于 2011-04-12 10:57:56

将每个频率响应乘以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) ...

代码语言:javascript
复制
#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;
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5628056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档