【问题标题】:What could parametrs of FFT function meanFFT函数的参数是什么意思
【发布时间】: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 “有错误。”:从不在描述软件行为时只写一个这样的句子。 总是具体描述计算机做了什么。例如,说明显示的确切错误消息,或显示产生的确切输出。此外,请说明预期的行为。

标签: c++ fft


【解决方案1】:

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

代码对数据执行一次基二蝶式传递。要使用它来计算 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);

有错误。

从for (j = 0; j &lt; l; j++),我们看到循环中j的最大值是l-1。从for (i = 0; i &lt; m; i++),我们看到i 的最大值是m-1。然后在i0 = (i &lt;&lt; 1) + (j * m &lt;&lt; 1) 中,我们有i0 = ((m-1) &lt;&lt; 1) + ((l-1) * m &lt;&lt; 1) = (m-1)*2 + (l-1) * m * 2 = 2*m - 2 + l*m*2 - m*2 = 2*m*l - 2。在i1 = i0 + (m * l &lt;&lt; 1) 中,我们有i1 = 2*m*l - 2 + (m * l * 2) = 4*m*l - 2。代码使用a[i1 + 1]时,索引为i1 + 1 = 4*m*l - 2 + 1 = 4*m*l - 1。

因此a 必须有一个索引为4*m*l - 1 的元素,因此它必须至少有4*m*l 元素。 b 所需的大小可以类似地计算并且是相同的。

当您在 m 设置为 3 和 l 设置为 8 的情况下调用 fft 时,a 必须有 4•3•8 = 96 个元素。您的示例代码显示了四个元素。因此,数组溢出,代码失败。

我认为l 应该等于 2m 是不正确的。更有可能的是,4*m*l 不应在同一完整 FFT 计算中对 fft 的调用之间变化,并且由于 a 和 b 包含每个复数的两个 double 元素,4*m*l 应该是两倍被转换的信号中复杂元素的数量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-09
    • 2020-05-15
    • 1970-01-01
    • 2013-07-07
    • 2020-12-16
    相关资源
    最近更新 更多