理解和实现快速傅里叶变换

计算科学 C++ 傅里叶变换
2021-12-08 05:57:50

我需要用 C++ 编写快速傅立叶变换,我指的是维基百科中的这个公式:快速傅里叶变换

但是由于某种原因,当我简单地输入 (1,1) (1,1) (1,1) (1,1) for by vector 时,我没有得到正确的输出v. 这是我的代码:

#include <iostream>
#include <complex>
#include <cmath>
#include <time.h>

using namespace std;
typedef complex<double> dcomp;


int main() {
    const int N = 4;
    dcomp sum1 = dcomp(0.0, 0.0);
    dcomp sum2 = dcomp(0.0, 0.0);
    dcomp *X = new dcomp[N];
    dcomp *v = new dcomp[N];
    for(int i = 0; i < N; i++) {
        v[i] = dcomp(1.0, 1.0);
    }

    for(int k = 0; k < N; k++) {
        for(int m = 0; m < N/2.0; m++) {
            double inside = (-2*M_PI/N)*(2*m)*k;
            sum1 = sum1 + v[2*m] * dcomp(cos(inside), sin(inside));
        }
        for(int m = 0; m < N/2.0; m++) {
            double inside1 = (-2*M_PI/N)*(2*m+1)*k;
            sum2 = sum2 + v[2*m + 1] * dcomp(cos(inside1), sin(inside1));    
        }

        X[k] = sum1 + sum2;
        cout << X[k] << endl;
    }






    return 0;
}

如果您只看一下公式,这很容易阅读我实际上在做同样的事情,但我的输出是 (4,4) (4,4) (4,4) (4,4)

它应该是: (2,2) (0,0) (0,0) (0,0)

谁能帮助我并指出我哪里出错了?

1个回答

与其让我们为您调试作业,我建议您阅读Jake Vanderplas 的这篇博客文章,其中包含对 FFT 算法的精彩解释以及高度可读的 Python 实现。