2016-09-27 138 views
2

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

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

回答

2

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

nextpow2()nextprod()函数对于获取数组的大小以输入到fft()很有用。然后,您可以创建一个更高效的零数组并填充数据。或者你可以将理想大小和数组大小之间的差异追加到数组中(如果你计算大量的fft,那么前者更好,因为每次只需重新填充它就可以重用输入数组)。

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

http://docs.julialang.org/en/release-0.5/stdlib/math/?highlight=fft#signal-processing如果一个班轮你还没有检查到了!

+0

令人惊讶的是,考虑到填充参数在Matlab和Numpy中非常靠前并居中。手动填充在REPL中很麻烦,并分配额外的内存。我想实现我自己的包装方法,零垫是一个解决方案。 – DNF

+0

是的,如果你打算经常在REPL中使用,那么这可能是一条路。你可以通过'datpad = [dat;零(eltype(dat),nextprod(length(dat)) - length(dat)]' –

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矩阵变得太大,只需将它的每一行应用到一个循环中即可。