【问题标题】:FFT number of input samplesFFT 输入样本数
【发布时间】:2014-10-09 01:16:04
【问题描述】:

我想知道如果我使用 10000 个样本并进行 fft,与我的样本正好等于 2 的 n 次方时相比,我的结果会大不相同,或者它只会影响进行 fft 的速度? Matlab 会自动补零吗? 或者我应该做零填充?

更多信息:

我正在使用 matlab 版本 2012b,fft 函数对我的样本执行 dft。我有 10 分钟的时域数据,采样率为 50 KHz。我的工作类型需要我在 200 毫秒的窗口中划分时域数据。在这些 200 毫秒的窗口上执行 fft 之后,我对不同的窗口结果进行平均。在 50Hz 频率系统中 200ms 以 50Khz 采样意味着每次 fft 操作大约有 10000 个样本。

问候,阿里

【问题讨论】:

    标签: matlab fft sample


    【解决方案1】:

    Matlab 的 fft 基于 fftw 库,它计算任何 n 的 O(n*log(n)) 运算结果(请参阅http://www.fftw.org/fftw-paper-ieee.pdf),因此您不会获得零速度增益填充数据。

    Matlab 不会自动补零,由您决定是否执行。时域中的零填充相当于在频域中插入数据(请参阅https://dsp.stackexchange.com/a/745/10782)。

    【讨论】:

    • 是的,它是 O(n log n),但这并不一定意味着它们不会针对 2 的幂进行优化,对吧?
    • FFTW 针对小素数(2、3、5、7、11、13、IIRC)的乘积进行了优化。 2^n 是最好的,但只要你没有大的质因数,它应该仍然可以正常工作。
    【解决方案2】:

    FFT 的原始 Cooley-Tukey 形式仅限于 2 的幂。很多人仍然停留在这种思维方式中。即使是教授们仍然延续这样的神话,即 FFT 需要 2^K 才能快速。事实上,现代 FFT 库使用混合基数方法。它允许对小素数集合的大小进行快速转换。通常,对 {2,3,5} 进行因式分解的数字非常快。如果不是,则将零填充到下一个 小素数集合的数字,但不是(必然)2 的幂。

    顺便说一句,有一些技巧可以在技术上使用大素数实现 O(n log n) 可扩展性,例如 Chirp-Z 和 Rader 的 Prime 算法,但它们前面通常有一个非常大的常数,应该是尽可能避免。

    底线:您的大小 10000 很好地分解了 {2,3,5},因此对于大多数现代 FFT 实现(甚至是 Kissfft )来说它会很快。如有疑问,请进行基准测试!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-10
      • 2021-11-14
      • 1970-01-01
      相关资源
      最近更新 更多