C++ FFT函数的参数意味着什么

C++ FFT函数的参数意味着什么,c++,fft,C++,Fft,我试图理解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 &

我试图理解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;
        }
    }
}

有错误。

此代码只是FFT的一部分<代码>输入一个<代码>b被输出<代码>w包含预计算的权重
l
是FFT中当前点处的多个细分
m
是每个分区的元素数。
a
b
w
中的数据是交错的复数数据。数组中的每对
元素由一个复数的实部和虚部组成

代码对数据执行一个基数为2的蝶形传递。要使用它来计算FFT,必须使用
l
m
的特定值和
w
中的权重多次调用它。由于对于每个调用,输入在
a
中,输出在
b
中,因此调用方必须使用至少两个缓冲区,并在它们之间交替进行对例程的连续调用

从在
i0
i2
中执行的索引来看,数据似乎正在稍微重新排列。这可能旨在以“自然”顺序而不是在简单实现中发生的位反转顺序产生FFT的最终结果

但当我尝试这样做时:

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);
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);
有错误


从(j=0;j中,我们可以看到循环中
j
的最大值是
l-1
。从(i=0;i中,我们可以看到
i
的最大值是
m-1
。然后在
i0=(i此代码只是FFT的一部分。
a
被输入。
b
被输出。
w
包含预计算的权重。
l
是FFT中当前点处的许多细分。
m
是每个分区的元素数。
a
b
w
中的数据是交错排列的complex data数组中的每对
元素由一个复数的实部和虚部组成

代码对数据执行一个基数二蝶形传递。要使用它来计算FFT,必须使用
l
m
的特定值和
w
中的权重多次调用它。因为对于每个调用,输入在
a
中,输出在
b
中,调用方必须使用至少两个缓冲区并在它们之间交替进行对例程的连续调用

从在
i0
i2
中执行的索引来看,数据似乎被稍微重新排列。这可能是为了以“自然”顺序产生FFT的最终结果,而不是简单实现中出现的位颠倒顺序

但当我尝试这样做时:

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);
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);
有错误

for(j=0;j
,我们看到循环中
j
的最大值是
l-1
。从
for(i=0;i
,我们看到
i
的最大值是
m-1
。然后在
i0=(i表示“有错误”):在描述软件行为时,不要只写这样一句话。请始终明确描述计算机所做的操作。例如,说明显示的确切错误消息,或显示生成的确切输出。此外,请说明预期的行为。Re“有错误”:在描述软件行为时,不要只写这样的句子。请始终明确描述计算机所做的操作。例如,说明显示的确切错误消息,或显示生成的确切输出。此外,请说明预期的行为。