【问题标题】:Help with EXCEL Fast Fourier Transform帮助 EXCEL 快速傅里叶变换
【发布时间】:2010-12-21 18:19:50
【问题描述】:

我正在尝试使用 Excel 的 (2007) 内置 FFT 功能,但是,它要求我有 2^n 个数据点 - 我没有。

我尝试了两件事,都给出了不同的结果:

  1. 用零填充数据值,使 N(数据点的数量)达到最接近 2 的幂
  2. 使用分而治之的方法,即,如果我有 112 个数据点,则对 64、32、16 进行 FFT (112=64+32+16)

哪种方法更好?我很乐意编写 VBA 宏,但我正在寻找一种不需要 N 为 2 的幂的约束的算法。有人可以帮忙吗?

【问题讨论】:

  • 请记住,您始终可以计算离散傅里叶变换,即 O(n^2)

标签: excel fft vba


【解决方案1】:

将数据分成更小的位会导致错误输出,尤其是对于较少数量的数据点。

用零填充是一个更好的主意,也是 FFT 的一般方法。如果您对进行 FFT 的另一种方法感兴趣,octave 会为您完成,并且大多数 Matlab 文档都适用,因此您应该没有问题。

【讨论】:

  • 另外,我认为 octave 实现不会强迫你给它 2^n 个样本。
  • 除非是不同的算法,我很想知道他们是如何管理它的。
  • 我想在 Excel 中做,基本上我正在尝试为 Excel 开发一个插件来做这个分析。
  • +1。绝对用零填充。计算量的增加并没有明显增加,尤其是N 小到 2^20 或更小。
  • 您也可以截断您的数据,但由于您更接近 128,而不是 64 填充可能更好。我很确定零填充将为您的数据提供最真实的频谱。这可能值得一读zone.ni.com/devzone/cda/tut/p/id/4880
【解决方案2】:

用零填充是正确的方向,但请记住,如果您正在执行转换以估计频率内容,您将需要一个window function,并且应该将其应用于短块(即,如果你有 2000 个点,应用一个 2000 个点的 Hann 窗口,然后填充到 2048 并计算变换)。

如果您正在开发插件,您可以考虑使用现有的众多 FFT 库之一。我是 Marc Borgerding 的 KISS FFT 的忠实粉丝。它为许多块大小提供快速转换,基本上是任何可以分解为数字 2、3、4 和/或 5 的块大小。但它不处理素数大小的块。它是用非常简单的 C 编写的,所以应该很容易移植到 C#。或者,this SO question 建议了一些可以在 .NET 中使用的库。

【讨论】:

    【解决方案3】:

    用零填充

    2^n 是 FFT 算法的要求。

    可能是对已知时间序列的测试(例如,单一频率的简单正弦或余弦)。当你 FFT 时,你应该得到一个单一的频率(狄拉克三角函数)。其他任何事情都是错误。使用 2 的整数幂,用零填充等。

    【讨论】:

    • 2^n 不只是一个“值得拥有”的属性吗?我认为任何复合数的块大小都受益于 FFT 核心的分而治之方法。
    • 当我上次阅读有关 FFT 时,这是一项要求;我不知道 Excel 实现的细节,所以我不能发誓它会接受什么,不接受什么。
    • 2^n aka radix 2 恰好是 FFT 的最常见实现,但还有很多其他可能的大小 - 它们通常使用小素数的基数,有时单独使用,例如radix 3 或 radix 5,有时结合使用,又名 mixed radix FFT。如果您指定的大小不是 2^n,FFTW 将尝试使用混合基数 FFT。
    • 好的,你能告诉我们 Excel 是否使用了不常见的实现吗?我猜他们正在使用这种常见的做事方式。
    • 我怀疑 Excel 只有一个基数 2 实现,所以你需要用零填充到 2^n。
    猜你喜欢
    • 2011-04-09
    • 2011-07-12
    • 2017-09-14
    • 2022-10-15
    • 2012-12-10
    • 2010-12-13
    • 2013-03-31
    • 2012-05-25
    • 2015-08-19
    相关资源
    最近更新 更多