首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >复FFT和逆FFT MATLAB

复FFT和逆FFT MATLAB
EN

Stack Overflow用户
提问于 2012-08-13 03:38:00
回答 1查看 5.4K关注 0票数 4

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

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

代码语言:javascript
复制
%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);

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

代码语言:javascript
复制
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输入。

代码语言:javascript
复制
pleasework=ifft(ReverseFFTinput);

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

代码语言:javascript
复制
newphasetime=angle(pleasework);
newamplitude=abs(pleasework);

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

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

尽管阶段的缩放。从物理上讲,这似乎是不正确的,因为我的理解是,消除与波长有关的相位应该“压缩”脉冲输入,即缩短脉冲宽度,但提高峰值。

我的主要问题是,我是否没有正确地使用反向FFT,或者前向FFT,或者两者都有,或者这是一个窗口或标准化问题?

很抱歉这个长篇大论的问题!提前谢谢你。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-22 03:50:51

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

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

然后是意想不到的。您可以使用fftshift转换使用fft获得的光谱,以获得更好的显示效果。因此,在使用ifft将其转换回之前,您需要首先应用ifftshift。如果你不这样做,频谱实际上是在频域中移动的。这导致你的时域相位被添加了一个时间的线性函数,所以过去接近于零的邻近点之间的差现在大约是π。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11925281

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档