我有一种算法,可以将序列零填充到4N,执行FFT,并且仅使用生成的4N中最低的N个频率点。想知道如何更快地完成此操作?

评论

@Dilip。我将使用FFTW或IMKL库。我当然可以使用我的kissfft库,但是相对于其他库来说,它在速度上处于劣势

我删除了您回复的评论,因为我的意思是按频率抽取,但改为按时间抽取。但是请看这里的蝴蝶图。如果为$ 4N $ -FFT的前两个阶段编写一些代码以考虑大量的零并跳过相应的乘法,则可以调用FFT库子例程$ 4 $乘以$ N $ -FFT输入向量是“满”的。当然,每个子例程调用只需要$ N / 4 $的输出。

#1 楼

如果您只有几个垃圾箱,那么以下内容可能对您非常有效:
1。只需在您需要的每个频率上进行DFT。
2。对每个有问题的频率使用Goertzel算法。

评论


$ \ begingroup $
马克说他需要从$ 4N $中取出$ N $垃圾箱,因此1)似乎不是一个合理的选择。 Goertzel算法具有诸如接收数据时进行在线计算,存储量小等优点,但是每个bin需要$ 2N + 4 $乘法,而通过Horner规则作为多项式求值的每个bin只需$ N $乘法。因此,2)似乎也不是一个特别合理的选择。
$ \ endgroup $
– Dilip Sarwate
2011年11月10日23:01

$ \ begingroup $
你是对的,在阅读问题时我以某种方式错过了细节。当我回答时,我在想:“天哪,很高兴知道他想要多少个垃圾箱……”猜猜我应该在回答之前重新阅读问题。
$ \ endgroup $
–雅各布
2011年11月11日15:29

#2 楼

零填充到4倍长度,计算更长的FFT,然后仅使用底部的1/4档,产生的结果与原始长度FFT的加窗Sinc插值几乎相同。
并使用具有适当窗口宽度的三相Sinc内插内核进行内插。

#3 楼

时域的零填充为您提供了更高的频率解决方案,但没有新的信息,因此它实质上提供了在频域中的内插。根据信号的性质和所需的精度,您可以通过对N个点进行常规FFT获得额外的频率点,并进行适当的插值(线性,样条,pchip,sinc等)。

评论


$ \ begingroup $
令$ x(z)= \ sum_ {i = 0} ^ {N-1} x_iz ^ {i} $为度数N-1 $的多项式(可能具有复杂系数$ x_i $)。我们以$ N $点$ \ alpha ^ n,0 \ leq n \ leq N-1 $进行评估,其中$ \ alpha = \ exp(-j2 \ pi / N)$是第N个根统一获得$ N $数字$ X_n = x(\ alpha ^ n)$。这些是单位圆上等距的$ N $处$ x(z)$的值。我们真正想要的是$ \ beta ^ n,0 \ leq n \ leq N-1 $处$ x(z)$的值,其中$ \ beta = \ exp(-j2 \ pi / 4N)$ $ N $指向单位圆的第一象限。我看不到线性,样条曲线等插值如何工作。请解释。
$ \ endgroup $
– Dilip Sarwate
2011年11月10日19:31

$ \ begingroup $
不好意思,我之前的评论中倒数第二个句子应该是单位圆的第四象限。因为$ \ beta ^ 4 = \ alpha $,所以已经通过FFT计算了每四个期望值$ x(\ beta ^ {4k})$:$ x(\ beta ^ {4k})= x(\ alpha ^ k)$。
$ \ endgroup $
– Dilip Sarwate
11年10月10日在20:07

$ \ begingroup $
我怀疑完成像样的内插比完成较大的FFT还要困难。
$ \ endgroup $
–马克·博格丁
2011年11月10日在20:30

$ \ begingroup $
假设您有128点FFT和12800Hz采样率。 128点FFT给出0Hz,100Hz,200 Hz,300Hz等的值。零填充的作用是将频率分辨率提高到0 Hz,25Hz,50 Hz,100Hz等。这可以看作是插值问题。对我来说,数学上精确的您需要进行128阶的圆形正弦插值。那当然不值得打扰,但根据应用程序和所需的精度,低得多的插值就足够了
$ \ endgroup $
–希尔马
2011年11月11日14:32