【问题标题】:KissFFT and Power of TwoKissFFT 和二的幂
【发布时间】:2014-10-28 17:19:52
【问题描述】:

我在很多不同的地方读到过,FFT 算法需要输入数组大小为 2 的幂,例如 512 或 1024。我还发现了许多不同的计算 FFT 的算法,例如 Cooley- Tuckey 和 Bluestein(这个也适用于像 2、3、5、7 这样的素数因子)。

好吧,我正在使用 KissFFT 并输入一个长度为 200 的数组。为什么它可以工作?有人知道在这种情况下发生了什么吗?是将大小截断为 128 (2^7),还是使用其他算法?如果它使用另一种算法,它是否仍然给出正确的答案,但需要更长的时间来计算? (在这种情况下,时间对我来说实际上不是问题。)

【问题讨论】:

  • 当我前段时间实现 FFT 时,我一直在将数据长度调整为 2^n(并用零填充“新单元格”)并且它工作正常,因此可以以这种方式实现

标签: algorithm fft kissfft


【解决方案1】:

我终于找到了一些有用的信息,这里是:

  • 首先,Cooley 和 Tukey 算法 link

  • 第二,MATLAB: “您可以使用 nextpow2 填充您传递给 fft 的信号。当信号长度不是 2 的精确幂时,这样做可以加快 FFT 的计算。” link

谢谢大家

【讨论】:

    【解决方案2】:

    如果你绝对必须有一个长度不是 2 的幂的 FFT,那么至少有两种方法可以合理有效地做到这一点:

    (1) 如果你想要的长度是小数的乘积,你可以概括当长度是 2 的精确幂时使用的方法。

    (2) 实际上,您可以使用比该任意长度更长的向量完成的卷积构建具有任意长度的 FFT,并且这些较长向量的长度可以是 2 的幂,这意味着您可以通过卷积进行 FFT通过二次方 FFT。参见例如http://www.engineeringproductivitytools.com/stuff/T0001/PT11.HTM。这利用了 AB = (A-B)^2 - A^2 - B^2 的恒等式。您希望得到一个看起来有点像 f(Xi) exp(ij) 的项的总和。使用卷积,您可以将看起来有点像 f(Xi)exp(-i^2) 的东西与 exp((i-j)^2) 结合起来,这样指数相加就可以得到 exp(-2ij+j^2) 并且您可以在后处理中去掉 j^2 - 参考资料向您展示了如何正确执行此操作,因此指数实际上是正确的,当然。

    【讨论】:

      猜你喜欢
      • 2011-11-28
      • 2011-08-03
      • 1970-01-01
      • 1970-01-01
      • 2012-07-22
      • 1970-01-01
      • 1970-01-01
      • 2015-12-01
      • 2021-09-15
      相关资源
      最近更新 更多