我想知道如果我使用10000个样本并执行fft,我的结果将会有很大的不同,相比之下我的样本恰好等于2的幂,或者它只影响fft的速度? Matlab是否自动进行零填充? 或者我应该做零填充?
进一步的信息:
我正在使用matlab版本2012b,fft函数来对我的样本执行dft。我有10分钟的时域数据,采样率为50 KHz。我的工作类型需要我在200毫秒的窗口中分配时域数据。在这些200毫秒的窗口上执行fft后,我在不同的窗口结果上取平均值。 50 Hz频率系统中的200 ms,以50Khz采样,意味着每次fft操作大约10000个样本。
问候,阿里
答案 0 :(得分:5)
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)都会很快。如果有疑问,请进行基准测试!
答案 1 :(得分:0)
Matlab的fft
基于fftw库,它计算任何n的O(n * log(n))运算结果(见http://www.fftw.org/fftw-paper-ieee.pdf),因此你不会获得增益速度为零填充数据。
Matlab不会自动进行零填充,这取决于你是否做到了。时域中的零填充相当于在频域中插入数据(请参阅https://dsp.stackexchange.com/a/745/10782)。