【发布时间】:2019-11-22 20:34:13
【问题描述】:
我正在尝试理解 FFT 算法。 这是代码
void fft(double *a, double *b, double *w, int m, int l)
{
int i, i0, i1, i2, i3, j;
double u, v, wi, wr;
for (j = 0; j < l; j++) {
wr = w[j << 1];
wi = w[j << 1 + 1];
for (i = 0; i < m; i++) {
i0 = (i << 1) + (j * m << 1);
i1 = i0 + (m * l << 1);
i2 = (i << 1) + (j * m << 2);
i3 = i2 + (m << 1);
u = a[i0] - a[i1];
v = a[i0 + 1] - a[i1 + 1];
b[i2] = a[i0] + a[i1];
b[i2 + 1] = a[i0 + 1] + a[i1 + 1];
b[i3] = wr * u - wi * v;
b[i3 + 1] = wr * v + wi * u;
}
}
}
如果我猜对了,输入数组 W,其中每个奇数都是实数,偶数是 imag。 A 和 B 是复数结果的虚部和实部 我还发现 l = 2**m
但是当我尝试这样做时:
double a[4] = { 0, 0, 0, 0 };
double b[4] = { 0, 0, 0, 0 };
double w[8] = { 1, 0, 0, 0, 0, 0, 0, 0 };
int m = 3;
int l = 8;
fft(a, b, w, m, l);
有错误。
【问题讨论】:
-
Re “有错误。”:从不在描述软件行为时只写一个这样的句子。 总是具体描述计算机做了什么。例如,说明显示的确切错误消息,或显示产生的确切输出。此外,请说明预期的行为。