GSL 快速傅里叶变换 - 双值高斯?

Posted

技术标签:

【中文标题】GSL 快速傅里叶变换 - 双值高斯?【英文标题】:GSL Fast-Fourier Transform - Double-Valued Gaussian? 【发布时间】:2016-05-03 21:49:15 【问题描述】:

我想要做的只是评估高斯的傅立叶变换(当然是作为测试),但我得到的看起来像一个双值函数,如下图所示。当你仔细观察高斯的尾部时,你可以看到 FFT 返回的值实际上是在正负之间振荡,使得 DFT 看起来“双值”。 为什么会这样?有没有办法解决这个问题(当然不只是绘制复模数)?

#include <gsl/gsl_fft_complex.h>
#include <gsl/gsl_errno.h>
#include <fstream>
#include <iostream>
#include <iomanip> 

#define REAL(z,i) ((z)[2*(i)]) //complex arrays stored as    [Re(z0),Im(z0),Re(z1),Im(z1),...]
#define IMAG(z,i) ((z)[2*(i)+1])
#define MODU(z,i) ((z)[2*(i)])*((z)[2*(i)])+((z)[2*(i)+1])*((z)[2*(i)+1])
#define PI 3.14159265359

using namespace std;

int main()

    int n = pow(2,9);
    double data[2*n];
    double N = (double) n;

    ofstream file_out("out.txt");

    double xmin=-10.;
    double xmax=10.;
    double dx=(xmax-xmin)/N;
    double x=xmin;

    for (int i=0; i<n; ++i)
        REAL(data,i)=exp(-100.*x*x);
        IMAG(data,i)=0.;
        x+=dx;
    

    gsl_fft_complex_radix2_forward(data, 1, n); 

    for (int i=0; i<n; ++i)
        file_out<<(i-n/2)<<"    "<<REAL(data,((i+n/2)%n))<<'\n';
    

    file_out.close();

【问题讨论】:

当它真的没有物理意义时,你会继续绘制真实的部分。绘制绝对值就可以了。 【参考方案1】:

您正在绘制真正的组件,例如偶数或余弦分量。请注意,整数频率 N 的余弦波在中间为 -1 和中间为 1 之间切换,因为 N 从奇数增加到偶数。因此,DFT 窗口输入中间的任何噪声都可能导致 DFT 结果中的各种实部发生切换(除非该噪声与所有这些 DFT 基向量完全正交)。

【讨论】:

以上是关于GSL 快速傅里叶变换 - 双值高斯?的主要内容,如果未能解决你的问题,请参考以下文章

一维高斯核的傅里叶变换

OpenCV C++(十)----傅里叶变换

傅里叶变换通俗解释及快速傅里叶变换的python实现

音频算法入门-傅里叶变换

关于快速傅里叶变换

快速傅里叶变换fft