使用C++ STL进行离散傅里叶变换(DFT)

4
我尝试计算这个数组x_1的DFT。这应该非常简单,但我的值太低了。我的代码有什么问题吗?请不要提供其他示例的链接 - 我只是想找到修复我的代码的方法。
#include <iostream>
#include <complex>
#include <cassert>

int main ()
{
    const unsigned int N = 20;

    const double x_1[N] = {0, 0.3, 0.6, 0.8, 1, 1, 0.9, 0.7, 0.5, 0.2, 0.2, 0.5, 0.7, 0.9, 1, 1, 0.8, 0.6, 0.3, 0};

    for(unsigned int k = 0; k < N; k++)
    {
        std::complex<double> sum(0.0,0.0);
        for(unsigned int j = 0; j < N; j++)
        {
            int integers = -2*j*k;
            std::complex<double> my_exponent(0.0, M_PI/N*(double)integers);
            sum += x_1[j] * std::exp(my_exponent);
        }
        std::cout << abs(sum)/N << std::endl;
    }
    return 0;
} 

2
你知道给定输入的期望输出值是什么吗? - sergico
是的,我认识它们,它们要高得多 - 所以我一定是错了。第11个值应该在0.48左右。 - Johannes
2个回答

5
std::cout << abs(sum)/N << std::endl;

为什么要除以N?

系数是没有进行除法的。请参考维基百科

这些是我用Matlab得到的值:

12.0000000000000 + 0.00000000000000i
-0.971586454726535 - 0.153884176858763i
-4.26246117974981 - 1.38495759172886i   
-0.0712959999079796 - 0.0363271264002681i   
-0.473606797749979 - 0.344095480117793i
0.00000000000000 + 0.00000000000000i
-0.237538820250189 - 0.326944137602412i
0.0185095954079375 + 0.0363271264002681i
-0.0263932022500213 - 0.0812299240582274i
0.0243728592265771 + 0.153884176858763i
0.00000000000000 + 0.00000000000000i    
0.0243728592265771 - 0.153884176858763i
-0.0263932022500213 + 0.0812299240582274i
0.0185095954079375 - 0.0363271264002681i    
-0.237538820250189 + 0.326944137602412i 
0.00000000000000 + 0.00000000000000i    
-0.473606797749979 + 0.344095480117793i 
-0.0712959999079796 + 0.0363271264002681i
-4.26246117974981 + 1.38495759172886i   
-0.971586454726535 + 0.153884176858763i

当我使用std::cout << sum << std::endl;打印输出时,我看到的值大致相同。


我将为我的练习做这个。这不可能是错误的原因。 - Johannes
谢谢您尝试使用Matlab,那么计算一定是正确的...为什么第一个值(12.0)这么高? - Johannes
2
DC 值是所有值的总和。如果你把所有的值加起来,就会得到 12。 - BertR
@Johannes:这个解决了你的问题吗?如果是的话,你可以投票并接受这个答案吗?谢谢 :-) - BertR
其实,我不知道我的结果出了什么问题。但是你的MATLAB输出显示我的代码是正确的。我会在下周找出更多信息,但我认为你应该得到一个“接受” :) - Johannes
现在我知道了。我在输入时犯了一个复制粘贴错误。不过算法完全正确。无论如何还是谢谢。 - Johannes

0

我认为这一行代码:integers = -2*j*k 不应该加负号,因为这不是反变换。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接