這是一個棘手的問題,因爲通常沒有正確的答案。雖然可能有一些錯誤的答案。我會盡力解釋。如果答案有點太羅嗦,你總是可以跳到摘要部分,看看它是否有幫助。
陷阱
疑難雜症#1:
當您使用Matlab的fft
(或你的情況fft2
)功能,輸出的第一個元素(在你的情況X(1,1)
)表示DC bias。如果您隨後在輸出端上撥打fftshift
,則所有情況都會以DC偏置爲中心的方式轉移。在二維情況下,它看起來是這樣的:
請注意,這是在框的左上角點被移到中央。雖然這是一個完全有效的數據表示,但我們必須小心,因爲我們有更改了(1,1)箱的含義。如果我在這一點上嘗試進行逆變換,那麼輸出結果就會錯誤!
B = ifft2(fft2(A)); % B is equal to A
C = ifft2(fftshift(fft2(A))); % C is not equal to A
疑難雜症#2:
的ifftshift
功能應該被認爲是作爲fftshift
操作的逆操作。不應該認爲這是一種適用於ifft
操作的轉變。出於這個原因,我覺得這個函數的名字很具誤導性。
以我的經驗,這是最常見的一種ifftshift
到上一頁的fft
/ifft
功能,併爲fftshift
遵循fft
/ifft
功能。事實上,我會走這麼遠說,如果你發現自己在做下面的事情之一,你可能已經犯了一個錯誤:
B = ifftshift(ifft(A)); % Don't do this
C = fft(fftshift(A)); % Don't do this either
以下有益音符在Matlab documentation for ifftshift
發現
注意:ifftshift
將取消fftshift
的結果。如果矩陣X
包含奇數個元素,則必須完成ifftshift(fftshift(X))
以獲得原始的X
。簡單地執行fftshift(X)
兩次將不會產生X
。
例如:
B = ifftshift(fftshift(A)); % B is equal to A
C = fftshift(fftshift(A)); % C is not equal to A
疑難雜症#3:
的DFT具有許多有趣的性質,其中之一是一個真實的,即使序列的DFT是真實的,即使。我們經常可以將這個事實用作簡單的完整性檢查。如果我們在fft
函數中放入一個真正的,甚至是連續的序列,並找回那些並非真實甚至是不真實的東西,那我們就有問題了。
當涉及到DFT時,我們必須仔細注意偶函數的樣子。序列號3 2 1 0 1 2 3
似乎是偶數,對吧?左半部分是右半部分的鏡像。如果序列的第四個元素代表t=0
,則此將爲。但是,由於FFT算法的設置方式,第一個元素始終表示t=0
元素。
我們可以通過在FFT之前執行ifftshift
操作來解決該問題,以便將中心移至第一個元素。請注意,對於長度均勻的序列,假定元素x[N/2+1]
爲中心。
A1 = [ 3 2 1 0 1 2 3 ]; % A1 real, even sequence about A1(4)
B1 = fft(ifftshift(A1)); % B1 is a real, even sequence
C1 = fft(A1); % C1 is _not_ a real, even sequence
abs(B1) == abs(C1) % B1 and C1 differ only in phase
A2 = [ 0 1 2 3 3 2 1 ]; % A2 real, even sequence about A2(0)
B2= fft(ifftshift(A2)); % B2 is _not_ a real, even sequence
C2= fft(A2); % C2 is a real, even sequence
abs(B2) == abs(C2) % B2 and C2 differ only in phase
你可以通過最後一個例子中看到的,這將是不正確說 「總是使用ifftshift
fft
之前。」如果我的數據的第一個元素已經是t=0
元素,該怎麼辦?然後申請ifftshift
將是錯誤事情要做。
摘要
一般而言,ifftshift
應該只用於之前施加fft
/ifft
。函數fft
和ifft
始終假定數據的第一個元素分別代表t=0
和f=0
。在使用這些功能時,您應該問自己的主要問題是「t=0
(或f=0
)在我的數據中的位置?」和「我希望他們住在哪裏?「
一般來說,fftshift
應該只施加fft
/ifft
後使用。這些函數的輸出被賦予這樣的第一要素分別爲f=0
和t=0
代表。如果你想重新排列數據,使得f=0
和t=0
元素出現在中央,然後fftshift
是正確的答案。
不具有正是你正在使用的數據代表了更深入的瞭解,這將是很難說是否有任何ifftshift
或fftshift
個功能是必要的。請注意,有很多情況下,您可以正確使用fft
/fft2
和ifft
/ifft2
而無需調用fftshift
或ifftshift
。
如果你可以多說一點你正在做的事情,這將有所幫助。就目前而言,您的代碼將無法運行,並且沒有任何關於這些代碼片段的含義。 – nispio
嗨,我添加了一些代碼的解釋,我希望現在更清楚,基本上我想將p和q轉換爲傅立葉域,在傅立葉域中創建另一個方程C,然後返回到時域和方程C應該給Z. – user2009114