簡體   English   中英

在matlab中使用fft,ifft和fftshift

[英]use of fft, ifft and fftshift in matlab

我試圖實現分步傅立葉方法來解決光學中的非線性薛定諤方程。 它主要分別處理線性部分和非線性部分。 它通過傅立葉變換和時域中的非線性部分來求解線性部分。

從書中復制以下代碼:

alpha = 0
beta_2 = 1
gamma = 1

T = linspace(-5,5,2^13);
delta_T = T(2)-T(1);

L = max(size(A));
delta_omega = 1/L/delta_T*2*pi;
omega = (-L/2:1:L/2-1)*delta_omega;

A = 2*sech(T);
A_t = A;
step_num = 1000;
h = 0.5*pi/step_num;
results = zeros(L,step_num);

A_f = fftshift(fft(A_t));
for n=1:step_num
    A_f = A_f.*exp(-alpha*(h/2)-1i*beta_2/2*omega.^2*(h/2));
    A_t = ifft(A_f);
    A_t = A_t.*exp(1i*gamma*(abs(A_t).^2*h));
    A_f = fft(A_t);
    A_f = A_f.*exp(-alpha*(h/2)-1i*beta_2/2*omega.^2*(h/2));
    A_t = ifft(A_f);
    results(:,n) = abs(A_t);
end

其中A_t是脈沖(要求解的函數)。 我不明白的是,在一開始就使用fftshift零頻率轉移到中心,但隨后在循環后,它並沒有fftshift 我嘗試將fftshift添加到主循環中,或者在開始時將其刪除。 兩者都給出了錯誤的結果,為什么呢? 一般來說,我什么時候應該使用fftshiftifftshift ,特別是當我試圖像這種情況那樣解決微分方程時?

謝謝

您可以通過將信號繪制為圖像並注意到明顯的差異來部分地澄清您的疑問,就像我在嘗試相同時所做的那樣。

首先,使用fftshift和ifftshift取決於你正在做什么類型的信號。

  1. fft函數認為您的信號從0開始,與我們通常用於信號處理的大多數情況不同。 與ifft相同。

  2. 你的實際負面被認為是倒置並轉移到最右邊,基本上使你從實例-5到5的實際情節為0到10。

  3. 這就是我們使用fftshift重新排列數據以使其回到0中心的位置。

  4. 如果你想將信號轉換回無序形式來計算fft或ifft(你基本上應該這樣),你應該使用ifftshift。 它沒有轉移ifft。 它與fftshift相反。

    好的,為了簡化這個開關案例 -

開關 (信號):{

情況 (信號有-ve和+ ve部分,以零為中心):

  • 應用ifftshift使其在fft或ifft之前無序
  • 將fftshift應用於結果以獲得與信號形式相同的輸出。

案例 (信號已經無序):

  • 直接申請fft或ifft。
  • 如果要以自然類型查看,請將fftshift應用於結果。

案例 (同時應用fft和ifft):

  • 繼續,沒關系。 執行單個操作時擔心信號

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM