You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++实现FFT算法结果异常求助:按流程图编写但输出不符

FFT实现结果不符问题排查

我正尝试按照流程图用C++实现数组的FFT计算,本以为按流程图实现会很简单,但输出结果始终与预期不符。已重新检查所有复数乘法步骤,确认符合算法要求,但计算结果仍不正确。

我知道可以使用complex等模块通过更现代、简便的方法实现FFT,但我想弄清楚当前代码出错的原因。

测试用例

测试数组:{1, 2, 3, 4, 4, 3, 2, 1, 1, 2, 3, 4, 4, 3, 2, 1}

输出对比

实际输出

实数部分:40 0 0 0 -1.75736 -6.54712 -8.61313 -7.08239 0 0 0 0 0 0 0 0
虚数部分:0 0 0 0 4.24264 -2.71191 -8.61313 7.08239 0 0 0 0 0 0 0 0

预期结果

(40,0) (0,0) (-11.6569,-4.82843) (0,0) (0,0) (0,0) (-0.343146,-0.828427) (0,0) (0,0) (0,0) (-0.343146,0.828427) (0,0) (0,0) (0,0) (-11.6569,4.82843) (0,0)

实现代码

#include<iostream>
using namespace std;


double xreal[100] = {1, 2, 3, 4, 4, 3, 2, 1, 1, 2, 3, 4, 4, 3, 2, 1}, ximag[100];
int gamma = 4;

int itbtr(int m);

void fft(int gamma, double xreal[100], double ximag[100]){
    int n2, nu1;
    int N = 1<<gamma;
 
    int l = 1;
    n2 = N/2;
    nu1 = gamma - 1;
    int k = 0;


    while(l <= gamma) {
        while(k < N) {
            int I = 1;
            while(I <= n2)
            {
                int M = int(k >> nu1);
                int P = itbtr(M);
  
                double arg = 6.283185 * P / N;

                double cosarg = cos(arg);
                double sinarg = sin(arg);

                double treal = cosarg * xreal[k + n2] - ximag[k + n2] * sinarg;
                double timag = sinarg * xreal[k + n2] + cosarg * ximag[k + n2];

                xreal[k + n2] = xreal[k] - treal;
                ximag[k + n2] = ximag[k] - timag;

                xreal[k] = xreal[k] + treal;
                ximag[k] = ximag[k] + timag;

                k++;
                I++;
            }
            k += n2;
        }
        l++;
        n2 /= 2;
        nu1 --;
        k = 0;
    }

    if(l > gamma){
        while(k <= N - 1){
            int i = itbtr(k);
            if(i > k) swap(xreal[k], xreal[i]), swap(ximag[k], ximag[i]);
            k ++ ;
        }
    }
}

//bit reversal
int itbtr(int k){
    int m = k;
    int newn = 0;
    while(m){
        newn *= 2;
        newn += m % 2;
        m /= 2;
    }
    return newn;
}


int main(){
    fft(gamma, xreal, ximag);
    for(int i = 0; i < pow(2, gamma); i++)
    cout<<xreal[i]<<" ";
    cout<<endl;
    for(int i = 0; i < pow(2, gamma); i++)
    cout<<ximag[i]<<" ";
}

我严格将流程图附带的Pascal代码转换为C++,同时对照了相关公式,还实现了基于矩阵乘法的DFT程序来对比结果,恳请帮忙排查问题。


内容的提问来源于stack exchange,提问作者anonymous_wolf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 13:16:08