0

我已经使用 FFTW 生成了系数,现在我想重建原始数据,但只使用第一个numCoefs系数而不是所有系数。目前我正在使用下面的代码,这很慢:

for ( unsigned int i = 0; i < length; ++i )
{
    double sum = 0;
    for ( unsigned int j = 0; j < numCoefs; ++j )
    {
        sum += ( coefs[j][0] * cos( j * omega * i ) ) + ( coefs[j][1] * sin( j * omega * i ) );
    }
    data[i] = sum;
}

有更快的方法吗?

4

2 回答 2

6

一个更简单的解决方案是将不需要的系数归零,然后使用 FFTW 进行 IFFT。这将比执行上述 IDFT 更有效。

请注意,当您执行此类操作时,您可能会在时域中得到一些伪像 - 您实际上是在频域中乘以阶跃函数,这相当于与时域中的 sinc 函数进行卷积。为了减少时域中产生的“振铃”,您应该使用窗口函数来平滑非零和零系数之间的过渡。

于 2011-09-29T10:42:00.307 回答
1

如果您的numCoefs值接近或大于 log(length),那么计算复杂度为 O(n*log(n)) 的 IFFT 很可能会更快,并且会为您预先优化。只需将除要保留的系数之外的所有 bin 归零,如果您想要真正的结果,请确保也保留它们的负频率复共轭。

如果您numCoefs相对于 log(length) 较小,那么您可以尝试的其他优化包括使用sinf()并且cosf()如果您真的不需要超过 6 位的精度,以及在内部循环之外预先计算 omega*i(尽管您的编译器应该除非您将优化设置设置为低或关闭,否则请务必为您执行此操作)。

于 2011-09-29T17:24:11.573 回答