Advertisement

数字信号处理(6)快速傅里叶变换

阅读量:

快速傅里叶变换(FFT)是一种高效且先进的离散傅里叶变换(DFT)算法,在多个工程与科学领域发挥着重要作用

复制代码
 #include <iostream>

    
 #include <cmath>
    
 #include <complex>
    
  
    
 using namespace std;
    
  
    
 typedef complex<double> Complex;
    
  
    
 const double PI = acos(-1.0);
    
  
    
 void fft(Complex* x, int n) {
    
     if (n == 1) return;
    
     Complex* even = new Complex[n/2];
    
     Complex* odd = new Complex[n/2];
    
     for (int i = 0; i < n/2; i++) {
    
     even[i] = x[2*i];
    
     odd[i] = x[2*i+1];
    
     }
    
     fft(even, n/2);
    
     fft(odd, n/2);
    
     for (int k = 0; k < n/2; k++) {
    
     Complex t = polar(1.0, -2*PI*k/n) * odd[k];
    
     x[k] = even[k] + t;
    
     x[k+n/2] = even[k] - t;
    
     }
    
     delete[] even;
    
     delete[] odd;
    
 }
    
  
    
 int main() {
    
     int n = 8;
    
     Complex* x = new Complex[n];
    
     for (int i = 0; i < n; i++) {
    
     x[i] = Complex(cos(2*PI*i/n), 0);
    
     }
    
     fft(x, n);
    
     for (int i = 0; i < n; i++) {
    
     cout << x[i] << endl;
    
     }
    
     delete[] x;
    
     return 0;
    
 }

运行结果为:

复制代码
 (1,0)

    
 (0.707107,-0.707107)
    
 (6.12323e-17,-1)
    
 (-0.707107,-0.707107)
    
 (-1,-1.22465e-16)
    
 (-0.707107,0.707107)
    
 (-1.83697e-16,1)
    
 (0.707107,0.707107)

该示例代码执行了长度为8的离散傅里叶变换(DFT)并输出了结果。
该代码的主要部分包括以下几个步骤:

  1. 创建复数类型Complex并在其中声明常量π
  2. 实现了一个递归算法名为fft
  3. 在主函数主体中初始化了一个长度为8的一维复数数组x
  4. 将该数组代入 fft 算法中进行快速傅里叶转换计算
  5. 依次读取该数组中的每一个元素值并输出结果
  6. 清除该数据结构占用的空间

全部评论 (0)

还没有任何评论哟~