Julia中的零填充FFT

时间:2016-09-27 09:55:43

标签: fft julia zero-pad

如何在Julia中计算fft零填充到特定长度?当然,我可以在我的向量中附加零,但这看起来很尴尬。

我在文档中找不到任何相关内容,调用methods(fft)似乎也没有提出任何相关的方法签名。我找不到与plan_fft相关的任何内容。

2 个答案:

答案 0 :(得分:2)

我不认为有任何关键字参数可以做到这一点或类似的东西,如果这就是你要找的东西?

nextpow2()nextprod()函数可用于获取要输入fft()的数组的大小。然后,您可以创建一个更有效的零数组,并用数据填充它。或者你可以将理想大小和数组大小之间的差异追加到你的数组中(前者更好,如果你计算了很多fft&s;那么你可以通过重新填充它来重用它时间)。

评论datpad = [dat; zeros(eltype(dat), nextprod(length(dat)) - length(dat)]

中的单行

http://docs.julialang.org/en/release-0.5/stdlib/math/?highlight=fft#signal-processing如果你还没有检查出来的话!

答案 1 :(得分:0)

如果我没弄错的话,Julia使用FFTW进行FFT。我不记得在FFTW手册中看到有关在不操纵输入数据的情况下自动执行零填充FFT的任何内容。

如果您对速度不感兴趣并且仅使用FFT作为离散傅里叶变换(DFT)的简写,则可以使用任意频率二进制采样的DFT函数进行DFT,或者仅手动运行变换。它将不再是O(N log N)操作,但它确实避免了手动填充原始数据向量,您可以根据需要对变换的采样进行间隔,例如,对您感兴趣的频谱部分进行过采样,或者忽略您不关心的部分。

例如,要使DFT矩阵以频率f采样:

M = exp( -2im*pi * f/Fs * (0:N-1)' )

其中Fs是数据向量的采样率,N是数据向量的长度。 f也是频率值的向量。应用矩阵乘法:

y = M * x

如果DFT矩阵太大,只需在循环中应用它的每一行。