首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >傅里叶级数求和的快速方法?

傅里叶级数求和的快速方法?
EN

Stack Overflow用户
提问于 2011-09-29 14:18:25
回答 2查看 261关注 0票数 0

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

代码语言:javascript
复制
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;
}

有没有更快的方法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-29 18:42:00

一种更简单的解决方案是将不需要的系数置零,然后用FFTW进行IFFT。这将比做上面的IDFT高效得多。

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

票数 6
EN

Stack Overflow用户

发布于 2011-09-30 01:24:12

如果您的长度接近或大于log( numCoefs ),那么计算复杂度为O(n*log(n))的IFFT很可能会更快,而且会为您预先优化。除了你想保留的系数外,只需将所有的柱子置零,如果你想要一个真实的结果,请确保也保留它们的负频率复数共轭。

如果您的对数相对于numCoefs (长度)很小,那么您可以尝试的其他优化方法包括:如果您实际上不需要超过6位数的精度,则可以使用sinf()cosf(),以及在内部循环之外预先计算omega*i (尽管您的编译器应该为您做这件事,除非您的优化设置为低或关闭)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7593245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档