2017-08-20 198 views
4

我試圖實現split-step fourier方法來求解光學中的非線性薛定諤方程。它基本上分別對待線性部分和非線性部分。它利用傅里葉變換和時域非線性部分解決了線性部分。matlab中fft,ifft和fftshift的使用

下面的代碼從一本書複製:

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,特別是當我試圖求解這種情況下的微分方程時?

感謝

+0

我們需要看到什麼'omega'是,通常你需要用'fftshift'等。當你假設你的頻率是以零爲中心的,因爲'fft'和'ifft'假定輸入/輸出爲零開始。你能發佈一個簡短但完整的例子嗎? –

+0

編輯代碼 – Physicist

回答

0

您可以通過繪製信號圖像和注意到了明顯的差異,像我一樣,當我試圖相同的部分澄清你的疑問。

首先,使用fftshift和ifftshift或不取決於你正在處理的信號類型。

  1. FFT功能考慮您的信號,從0開始,不像大多數情況下,我們通常在信號處理中使用。與ifft一樣。

  2. 您的實際負側被認爲是反轉,並轉移到最右邊,基本上是從例如讓您的主線劇情-5〜5爲0〜10

  3. 這就是我們使用fftshift重新排列數據讓它回到 居中在0.

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

    好吧,讓事情簡單按照這個開關的情況下 -

開關(信號): {

案例(信號既有-ve和+已經零件,以零爲中心):

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

案例(信號已經是無序的):

  • 直接申請FFT或IFFT。
  • 如果您想以自然類型查看結果,請將fftshift應用於結果。

案例(同時運用這兩種FFT和IFFT):

  • 下去,這樣很好。擔心信號,當你執行一個操作

}

+0

謝謝,但在我的例子中,爲什麼'fftshift'在開始時使用,但沒有在主循環中使用? – Physicist