逆傅里叶变换
傅里叶变换的主要好处之一是它能够在不丢失信息的情况下反向回到时域。让我们考虑一下前面例子中使用的相同信号:
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')