21xrx.com
2024-12-27 20:24:19 Friday
登录
文章检索 我的文章 写文章
C++实现FFT算法
2023-06-23 09:51:11 深夜i     --     --
C++ FFT算法 数学 信号处理 快速傅里叶变换

FFT(快速傅里叶变换)是一种用于实现DFT(离散傅里叶变换)的高效算法。在信号处理、图像处理和数据压缩等领域都有广泛的应用。在C++中,实现FFT算法可以使用STL库的复数类和递归函数。

首先,我们需要导入复数头文件:


#include <complex>

using namespace std;

然后,我们定义一个复数类型:


typedef complex<double> Complex;

下面是FFT函数的实现:


void FFT(vector<Complex>& a, bool inverse=false){

  int n = a.size();

  if(n <= 1) return;

  vector<Complex> a0(n/2), a1(n/2);

  for(int i = 0; i < n/2; i++){

    a0[i] = a[2*i];

    a1[i] = a[2*i+1];

  }

  FFT(a0, inverse);

  FFT(a1, inverse);

  double angle = 2*acos(-1)/n*(inverse?-1:1);

  Complex w(1), wn(cos(angle), sin(angle));

  for(int i = 0; i < n/2; i++){

    a[i] = a0[i] + w*a1[i];

    a[i+n/2] = a0[i] - w*a1[i];

    if(inverse){

      a[i] /= 2;

      a[i+n/2] /= 2;

    }

    w *= wn;

  }

}

在FFT函数中,我们先检查向量a的大小是否为1,如果是,则直接返回。否则,我们将a分成两个较小的向量a0和a1,分别进行FFT运算,然后将它们合并为一个向量。每次合并使用旋转因子w = e^(-2*π*i*k/n),其中k是频率,n是FFT长度。在递归过程中,我们通过反转输入元素的顺序来实现倒位序(bit reversal)算法,以提高计算效率。

最后,我们可以在主函数中使用FFT函数:


int main(){

  vector<Complex> a(4);

  a[0] = 1;

  a[1] = 2;

  a[2] = 3;

  a[3] = 4;

  FFT(a);

  for(int i = 0; i < 4; i++){

    cout << a[i] << " ";

  }

  return 0;

}

输出结果为:


(10,0) (-2,-2) (-2,0) (-2,2)

这表示对于输入向量2,经过FFT变换后,得到的频谱为{10,-2-2i,-2,2+2i}。

综上所述,C++实现FFT算法非常简单,并且可以高效地处理大量数据。通过了解和应用FFT算法,我们可以更好地理解数字信号处理领域的基本原理,更加灵活和高效地处理各种数据。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复