复FFT然后逆FFT MATLAB

时间:2012-08-12 19:38:00

标签: matlab transform fft inverse

我在Matlab中使用FFT函数试图分析行波激光模型的输出。

模型的时域是(实数,虚数)形式,其思想是将FFT应用于复数输出,以获得频域中的相位和幅度信息:

%load time_domain field data
data = load('fft_data.asc');

% Calc total energy in the time domain
N = size(data,1);
dt = data(2,1) - data (1,1);
field_td = complex (data(:,4), data(:,5));


wavelength = 1550e-9;
df = 1/N/dt;
frequency = (1:N)*df;
dl = wavelength^2/3e8/N/dt;
lambda = -(1:N)*dl +wavelength + N*dl/2;

%Calc FFT
FT = fft(field_td);
FT = fftshift(FT);
counter=1;
phase=angle(FT);
amptry=abs(FT);
unwraptry=unwrap(phase);

在展开之后,将最佳拟合应用于感兴趣区域中的相位,然后从相位本身中减去,以试图消除感兴趣区域中相位的波长依赖性。

for i=1:N % correct phase and produce new IFFT input
    bestfit(i)=1.679*(10^10)*lambda(i)-26160;
    correctedphase(i)=unwraptry(i)-bestfit(i);
    ReverseFFTinput(i)= complex(amptry(i)*cos(correctedphase(i)),amptry(i)*sin(correctedphase(i)));
end

手动执行最佳拟合后,我现在具有如上所示的反向FFT输入。

pleasework=ifft(ReverseFFTinput);

我现在可以从中提取时域中的相位和幅度信息:

newphasetime=angle(pleasework);
newamplitude=abs(pleasework);

然而,尽管相位输出与时域输入相比有很大不同

blue=output of phase in time domain after inverse FFT back

校正数据的幅度似乎变化不大(如果有的话),

enter image description here enter image description here

尽管相位有所缩放,但仍然存在问题。从物理上讲这似乎是不正确的,因为我的理解是去除相位的波长依赖性应该“压缩”脉冲输入,即缩短脉冲宽度但提高峰值。

我的主要问题是我是否未能正确使用逆FFT,或者前向FFT或两者都没有,或者这类似于窗口化还是归一化问题?

抱歉这个冗长的问题!并提前感谢。

1 个答案:

答案 0 :(得分:4)

你实际上看到了两种效果。

首先是预期的一个。你在谈论“消除相位的波长依赖性”。如果你做到了 - 完全将相位归零 - 你实际上会得到一个稍微压缩的峰值。 你实际做的是为相位添加线性函数。这不会压缩任何东西;这是一个众所周知的转变,相当于在时域中移动峰值。只是傅立叶变换的教科书属性。

然后是非预期的。您可以将使用fft获得的频谱与fftshift进行转换,以便更好地显示。因此,在使用ifft将其转换回来之前,您需要首先应用ifftshift。如果不这样做,频谱在频域中有效地移位。这导致您的时域相位被添加为时间的线性函数,因此过去几乎为零的相邻点之间的差异现在大约为pi。