Signal processing 基斯夫特标度

Signal processing 基斯夫特标度,signal-processing,fft,correlation,kissfft,Signal Processing,Fft,Correlation,Kissfft,我希望使用FFT和kissfft库计算快速相关性,并且缩放需要精确。什么样的缩放是必要的(向前和向后),我使用什么值来缩放数据?最常见的三个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),并查看缩放是否匹配上述其

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

最常见的三个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),或者所需的缩放是完全不同的


e、 g.在您的环境中为您的数据类型编写一个单元测试。

将每个频率响应乘以1/sqrt(N),总体比例为1/N

在伪代码中:

ifft(fft(x)*conj(fft(y))/N)=循环相关(x,y)

至少对于浮点类型的kisft是这样

<>下面的C++示例代码的输出应该是类似于

的 [1,3i,0 0….]与自身的循环相关性=(10,0),(1.19796e-10,3),(-4.91499e-08,1.11519e-15),(1.77301e-08,-1.19588e-08)

#包括
#包括
#包括“kiss_fft.h”
使用名称空间std;
int main()
{
常数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::复合物x[nfft];
标准:复合外汇[nfft];
memset(x,0,sizeof(x));
x[0]=1;
x[1]=std::complex(0,3);
接吻快速傅立叶变换(fwd,(接吻快速傅立叶变换cpx*)x,(接吻快速傅立叶变换cpx*)fx);

对于(int k=0;kYes),我应该更具体一些。我希望有人能省去我自己发现缩放的麻烦(针对kissfft),但是我自己做的,我可以告诉你,我必须将逆比例缩放1/N。当然,为了提高效率,最初省略了缩放,但在计算相关性时,这一点很重要。对于自相关性来说,这并不重要,因为结果是成比例的,但重要的是当你计算类似于DF有两个精确的术语要添加到末尾。更详细的信息,在kiss_fftr(真实FFT的实现)上测试:正向fftr通过
nfft/2
缩放振幅,而反向fftr通过
2
缩放振幅,而不考虑nfft。要获得原始振幅,必须分别通过
2/nfft
1/2
缩放。(这解释了为什么在串联进行正向和反向fft时必须按
1/nfft
进行缩放。)我使用的代码是:
ifft(fft(x)*conj(fft(y)))/N==corr
与kissfft v1_2_9;是的。很抱歉一开始就把你搞错了。我已经更新了描述,以匹配我的代码实际在做什么。这就是我最终要做的,但我希望有人知道可以帮我省去麻烦。这通常是一个很好的建议。如果你不知道,你不会相信FFT文献有多混乱t有以下不同的表示:)
#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;
}