2016-09-27 94 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矩陣變得太大,只需將它的每一行應用到一個循環中即可。