我尝试使用Excel(2007)内置的FFT功能,但是,它需要我有2^n个数据点,而我没有。我试过两种方法,结果给予不一样:1.用零填充数据值,以使N(数据点数)达到最接近的2的幂1.使用分治法,即如果我有112个数据点,则对64、32、16进行FFT(112=64+32+16)哪一个是更好的方法?我很舒服写VBA宏,但我正在寻找一个算法,不需要N是2的幂的约束。有人能帮助吗?
eni9jsuy1#
将数据拆分为更小的位将导致错误的输出,特别是对于较小数量的数据点。用零填充是一个更好的主意,也是FFT的通用方法。如果你对FFT的替代方法感兴趣,octave会为你做,大多数Matlab文档都适用,所以你应该没有问题。
mzsu5hc02#
用零填充是正确的方向,但请记住,如果要进行变换以估计频率内容,则需要window function,并且应将其应用于短块(即,如果有2000个点,则应用2000个点的Hann窗口,然后填充到2048并计算变换)。如果你正在开发一个插件,你可能会考虑使用众多FFT库中的一个。我是Marc Borgerding的KISS FFT的忠实粉丝。它为许多块大小提供快速转换,基本上是任何块大小,可以分解成数字2、3、4和/或5。但它不处理质数大小的块。它是用非常简单的C编写的。因此应该很容易移植到C#。或者,this SO question建议一些可以在. NET中使用的库。
woobm2wo3#
用零填充2^n是FFT算法的要求。可能是对已知时间序列的测试(例如,单个频率的简单正弦或余弦),当你对它进行FFT时,你应该得到一个单一的频率(狄拉克δ函数),否则就是错误的,用2的整数次幂,用零填充等等。
k75qkfdt4#
可以用零填充,也可以使用支持任意大小的FFT库,https://github.com/altomani/XL-FFT就是这样一个库。它将FFT实现为具有LAMBDA函数的纯公式(即,没有任何VBA代码)。对于2的幂长度,它使用递归基数-2 Cooley-Tukey algorithm,对于其他长度,使用将计算减少到2的幂的Bluestein's algorithm版本。
LAMBDA
4条答案
按热度按时间eni9jsuy1#
将数据拆分为更小的位将导致错误的输出,特别是对于较小数量的数据点。
用零填充是一个更好的主意,也是FFT的通用方法。如果你对FFT的替代方法感兴趣,octave会为你做,大多数Matlab文档都适用,所以你应该没有问题。
mzsu5hc02#
用零填充是正确的方向,但请记住,如果要进行变换以估计频率内容,则需要window function,并且应将其应用于短块(即,如果有2000个点,则应用2000个点的Hann窗口,然后填充到2048并计算变换)。
如果你正在开发一个插件,你可能会考虑使用众多FFT库中的一个。我是Marc Borgerding的KISS FFT的忠实粉丝。它为许多块大小提供快速转换,基本上是任何块大小,可以分解成数字2、3、4和/或5。但它不处理质数大小的块。它是用非常简单的C编写的。因此应该很容易移植到C#。或者,this SO question建议一些可以在. NET中使用的库。
woobm2wo3#
用零填充
2^n是FFT算法的要求。
可能是对已知时间序列的测试(例如,单个频率的简单正弦或余弦),当你对它进行FFT时,你应该得到一个单一的频率(狄拉克δ函数),否则就是错误的,用2的整数次幂,用零填充等等。
k75qkfdt4#
可以用零填充,也可以使用支持任意大小的FFT库,https://github.com/altomani/XL-FFT就是这样一个库。
它将FFT实现为具有
LAMBDA
函数的纯公式(即,没有任何VBA代码)。对于2的幂长度,它使用递归基数-2 Cooley-Tukey algorithm,对于其他长度,使用将计算减少到2的幂的Bluestein's algorithm版本。