我正在尝试修复一个我发现的程序,因此它需要的值不同于它本身的测试值。程序应该能够获取一个表示数学函数的值作为信号,输出应该是对该信号的快速傅立叶变换。以下是我已在代码中修复的内容:
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];
聚苯乙烯。如果有人知道我需要的更好的代码,我也可以使用它。
答案 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
的类型?