无法将复杂的<double>转换为double

时间:2017-06-09 01:26:54

标签: c++ compiler-errors fft

我正在尝试修复一个我发现的程序,因此它需要的值不同于它本身的测试值。程序应该能够获取一个表示数学函数的值作为信号,输出应该是对该信号的快速傅立叶变换。以下是我已在代码中修复的内容:

E:E="SA"

当我尝试编译它时,我会向我展示这个

  

错误:无法在初始化|

中将'std :: complex'转换为'double'

在第34行,在本部分标记的行上:

#include <complex>
#include <iostream>
#include <valarray>

#define fnc(x) (x)

const double PI = 3.141592653589793238460;

typedef std::valarray<double> CArray;

union{
    double d;
    int i;
}num,i;


void fft(CArray& x)
{
    const size_t N = x.size();
    if (N <= 1) return;

    // divide
    CArray even = x[std::slice(0, N/2, 2)];
    CArray  odd = x[std::slice(1, N/2, 2)];

    // conquer
    fft(even);
    fft(odd);

    // combine
    for (size_t k = 0; k < N/2; ++k)
    {
        double t = std::polar(1.0, -2 * PI * k / N) * odd[k];
        x[k    ] = even[k] + t;
        x[k+N/2] = even[k] - t;
    }
}
    //Complex f = 1.0 / sqrt(N);
    //for (unsigned int i = 0; i < N; i++)
    //  x[i] *= f;

int main()
{
    num.d=513;
    double test[num.i];
    for(i.i=1; i.i < num.i;++i.i)
        test[i.i] = (double)fnc(i.i);
    CArray data(test, num.d);

    // forward fft
    fft(data);

    std::cout << "fft" << std::endl;
    for (i.i = 0; i.i < num.i; ++i.i)
    {
        std::cout << data[i.i] << std::endl;
    }
    return 0;
}

pesizaly这一个:

    for (size_t k = 0; k < N/2; ++k)
    {
        double t = std::polar(1.0, -2 * PI * k / N) * odd[k];
        x[k    ] = even[k] + t;
        x[k+N/2] = even[k] - t;
    }

如果有人能告诉我如何解决这个问题,我会非常自信。 为了更好地参考,这是原始代码,万一有人可以告诉我一个更好的方法来修复它,以便它可以满足我想要的。

        double t = std::polar(1.0, -2 * PI * k / N) * odd[k];

聚苯乙烯。如果有人知道我需要的更好的代码,我也可以使用它。

2 个答案:

答案 0 :(得分:1)

std::complex<double>double是不兼容的类型。

改变这个:

double t = std::polar(1.0, -2 * PI * k / N) * odd[k];

到此:

std::complex<double> t = std::polar(1.0, -2 * PI * k / N) * odd[k];

因为std::polar返回:

  

复杂的笛卡尔等价于由rho和theta形成的极地格式。

答案 1 :(得分:0)

错误消息非常明确:std::polar返回std::complex,而不是double。查看其余代码,可能只需更改t的类型?