簡體   English   中英

Matlab:對於偶數實函數,FFT復數結果,IFFT實際結果

[英]Matlab: for even real functions, FFT complex result, IFFT real result

我正在測試Matlab中FFT和IFFT函數的有效性。

我可以將這些函數的輸出與一個眾所周知的數學事實進行比較:偶數,實數函數的傅里葉變換(如以0為中心的高斯),是另一個偶數,實數函數(FFT [真實,0居中高斯] =真實,0居中的高斯)。 這個事實應該適用於FFT和IFFT。

首先我制作網格:

nx = 256; % grid total pixel count
X = 500; % grid size (um)
dx = X/nx; %  grid spacing (um)
x = linspace(-nx/2,nx/2-1,nx)*dx; % x grid (um)

df = 1/(nx*dx); % spectral grid spacing (1/um)
f = linspace(-nx/2,nx/2-1,nx)*df; % f grid (1/um)

我制作了高斯:

A = 1; % magnitude (arbitrary units) 
x_fwhm = 7; % Full width at half maximum diameter (um)

x0 = x_fwhm/sqrt(2*log(2)); % 1/e^2 radius (um)
y = A*exp(-2*x.^2./(x0)^2); % Gaussian (arbitrary units) 

並使用FFT應用傅里葉變換:

yFFT = fftshift(fft(fftshift(y))); 

或者,使用IFFT:

yIFFT = fftshift(ifft(fftshift(y))); 

繪制結果: 顯示的野兔是(a)在空間中定義的高斯:y,(b)FFT(y)的實部,(c)如果IFFT(y),(d)FFT(y)的虛部和(e)的實部IFFT(y)的虛部。

IFFT做得很好:yIFFT是純粹的高斯。 然而,FFT產生一個復數:存在一個非常小的虛部。 這很好,因為在傅里葉變換算法中應該預期會出現錯誤,並且無論如何它都可以忽略不計。 令我困惑的是為什么 IFFT中根本沒有錯誤 FFT和IFFT算法有很大不同嗎?

***注意:fftshift和ifftshift在這里是等價的,因為我的數組具有偶數個元素。

處理實值時域信號是一種相當普遍的現象。 因此ifft函數具有對頻域中出現的相應對稱性的內置處理,如文檔的“算法”部分所述:

ifft函數測試Y中的向量是否是共軛對稱的。 當第i 元素滿足v(i) = conj(v([1,end:-1:2]))時,向量v是共軛對稱的。 如果Y中的矢量是共軛對稱的,則逆變換計算更快並且輸出是實數。

換言之, ifft構建的虛部yIFFT是恰好為0,因為它檢測到您的輸入具有共軛對稱。

另一方面,即使時域信號相對較少,Mathworks也不認為有必要在fft函數中執行類似的測試。 也就是說,您仍然可以通過使用ifft函數計算FFT來利用共軛對稱性測試

% compute fft(x,[],dim) using ifft:
size(x,dim) * conj(ifft(conj(x),[],dim))

您的代碼中存在錯誤:

yFFT = fftshift(fft(fftshift(y)));

應該讀

yFFT = fftshift(fft(ifftshift(y)));

ifftshift功能將原點從中間移動到最左邊的bin。 fftshift將原點從最左邊的bin移動到中間。 對於 偶數大小的 奇數大小的數組,這兩個操作類似但不相同。 請注意,您的逆變換會遇到同樣的問題, 但是沒有出現錯誤,正如SleuthEye所解釋的那樣。 [沒關系,我覺得我有點困惑,你的情況應該沒有區別。]

也,

linspace(-nx/2,nx/2-1,nx)

會寫得更好

-nx/2 : nx/2-1

鑒於nx是偶數。 它更短,但由於計算事物的方式,它也可能有一個較小的數值誤差(可能沒有區別,但我嘗試在步長為1時避免linspace

暫無
暫無

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

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