逆傅立葉變換
傅立葉變換的主要好處之一是它能夠在不丟失資訊的情況下反向回到時域。讓我們考慮一下前面例子中使用的相同訊號:
A1=10; % Amplitude 1
A2=10; % Amplitude 2
w1=2*pi*0.2; % Angular frequency 1
w2=2*pi*0.225; % Angular frequency 2
Ts=1; % Sampling time
N=64; % Number of process samples to be generated
K=1; % Number of independent process realizations
sgm=1; % Standard deviation of the noise
n=repmat([0:N-1].',1,K); % Generate resolution
phi1=repmat(rand(1,K)*2*pi,N,1); % Random phase matrix 1
phi2=repmat(rand(1,K)*2*pi,N,1); % Random phase matrix 2
x=A1*sin(w1*n*Ts+phi1)+A2*sin(w2*n*Ts+phi2)+sgm*randn(N,K); % Resulting Signal
NFFT=256; % FFT length
F=fft(x,NFFT); % FFT result of time domain signal
如果我們在 Matlab 中開啟 F
,我們會發現它是一個複數矩陣,一個實部和一個虛部。根據定義,為了恢復原始時域訊號,我們需要 Real(表示幅度變化)和 Imaginary(表示相位變化),因此要返回時域,人們可能只想:
TD = ifft(F,NFFT); %Returns the Inverse of F in Time Domain
請注意,返回的 TD 將是長度 256,因為我們將 NFFT 設定為 256,但是,x 的長度僅為 64,因此 Matlab 將填充零到 TD 變換的末尾。因此,例如,如果 NFFT 為 1024 且長度為 64,則返回的 TD 將為 64 + 960 個零。還要注意,由於浮點舍入,你可能得到類似 3.1 * 10e-20 的東西,但是對於一般用途:對於任何 X,ifft(fft(X)
)等於 X 到舍入誤差。
讓我們說一下,在轉換之後,我們做了一些事情,只剩下 FFT 的 REAL 部分:
R = real(F); %Give the Real Part of the FFT
TDR = ifft(R,NFFT); %Give the Time Domain of the Real Part of the FFT
這意味著我們正在失去 FFT 的虛部,因此,我們在這個逆過程中丟失了資訊。為了保留原始而不丟失資訊,你應該始終使用 imag
保留 FFT 的虛部,並將你的函式應用於兩者或實部。
figure
subplot(3,1,1)
plot(x);xlabel('time samples');ylabel('magnitude');title('Original Time Domain Signal')
subplot(3,1,2)
plot(TD(1:64));xlabel('time samples');ylabel('magnitude');title('Inverse Fourier Transformed - Time Domain Signal')
subplot(3,1,3)
plot(TDR(1:64));xlabel('time samples');ylabel('magnitude');title('Real part of IFFT transformed Time Domain Signal')