21xrx.com
2025-06-29 05:43:06 Sunday
文章检索 我的文章 写文章
C++实现FFT算法
2023-06-23 09:51:11 深夜i     29     0
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算法,我们可以更好地理解数字信号处理领域的基本原理,更加灵活和高效地处理各种数据。

  
  

评论区

    相似文章