如何仅高效地计算零填充FFT的低系数


14

我有一种算法,可以将序列零填充到4N,执行FFT,并且仅使用生成的4N中最低的N个频率点。

这似乎是很多浪费的工作,有什么想法可以更快地完成此工作吗?


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

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

Answers:


2

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


马克说他需要4 N中的垃圾箱,因此1)似乎不是一个合理的选择。Goertzel算法具有诸如接收数据时进行在线计算,存储量小等优点,但是每个bin 需要2 N + 4乘法,而通过Horner规则计算为多项式求值的每个bin仅需要N乘法。因此,2)似乎也不是一个特别合理的选择。N4N2N+4N
Dilip Sarwate

您是对的,在阅读问题时,我以某种方式错过了细节。当我回答时,我在想:“天哪,很高兴知道他想要多少个垃圾箱……”猜猜我应该在回答之前重新阅读问题。
雅各布

2

零填充到4倍长度,计算更长的FFT,然后仅使用底部的第1/4个bin,产生的结果与原始长度FFT的加窗Sinc插值几乎相同。

因此,只需使用原始FFT长度并使用具有适当窗口宽度的三相Sinc内插内核进行内插即可。


0

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


是次数为N 1的多项式(可能具有复系数x i)。我们在评估它Ñα Ñ0 Ñ ñ - 1,其中α = EXP - Ĵ 2 π / Ñ Ñx(z)=i=0N1xizixiN1Nαn,0nN1α=exp(j2π/N)N统一个根得到号码X Ñ = X α Ñ。这些是单位圆上N个等距点处的x z 值。我们真正需要的是的值X ż β Ñ0 Ñ ñ - 1,其中β = EXP - Ĵ 2 π / 4 Ñ ,其是NXn=x(αn)x(z)Nx(z)βn,0nN1β=exp(j2π/4N)单位圆的第一象限上的 N个点。我看不到线性,样条曲线等插值如何工作。请解释。N
Dilip Sarwate

抱歉,我在先前的评论中倒数第二句应该是单位圆的第四个象限。由于,每第四个所需的值X β 4 ķ已经被计算由FFT: X β 4 ķ= X α ķβ4=αx(β4k)x(β4k)=x(αk)
Dilip Sarwate

我怀疑很难进行像样的内插比执行较大的FFT还要困难。
Mark Borgerding 2011年

假设您有128点FFT和12800Hz采样率。128点FFT给出0Hz,100Hz,200 Hz,300Hz等的值。零填充的作用是将频率分辨率提高到0 Hz,25Hz,50 Hz,100Hz等。这可以看作是插值问题。对我来说,数学上需要精确执行128阶正弦圆弧插值。那当然不值得打扰,但是根据应用程序和所需的精度,低阶插值就足够了
Hilmar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.