我正在使用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);然而,尽管相位的输出与时域中的输入相比有很大的不同

校正数据的振幅似乎变化很小(如果有变化的话!),


尽管阶段的缩放。从物理上讲,这似乎是不正确的,因为我的理解是,消除与波长有关的相位应该“压缩”脉冲输入,即缩短脉冲宽度,但提高峰值。
我的主要问题是,我是否没有正确地使用反向FFT,或者前向FFT,或者两者都有,或者这是一个窗口或标准化问题?
很抱歉这个长篇大论的问题!提前谢谢你。
发布于 2012-08-22 03:50:51
你实际上看到了两种效果。
首先是预期的结果。你说的是“消除相位对波长的依赖性”。如果你确实这样做了--将相位完全归零--你实际上会得到一个稍微压缩的峰值。你实际要做的就是在相位中添加一个线性函数。这不会压缩任何东西;这是一种众所周知的变换,相当于在时域中移动峰值。只是傅里叶变换的教科书性质。
然后是意想不到的。您可以使用fftshift转换使用fft获得的光谱,以获得更好的显示效果。因此,在使用ifft将其转换回之前,您需要首先应用ifftshift。如果你不这样做,频谱实际上是在频域中移动的。这导致你的时域相位被添加了一个时间的线性函数,所以过去接近于零的邻近点之间的差现在大约是π。
https://stackoverflow.com/questions/11925281
复制相似问题