短时傅立叶变换的代码程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
—
短时傅立叶变换试验
为了克服傅立叶变换的时频局部化方面的不足,也是为了对时域信号作局部分析,于1946年提出了窗口傅立叶变换(简记为WFT )。
WFT 的公式形式
()(,)()()jwt R Gf w b f t w t b e dt -=-⎰()(,)()()jwt R
Gf w b f t w t b e dt -=-⎰ 其中,实函数w(t)为是时窗函数,窗函数w(t)具有较强的衰减性,所以要精心选择窗函数。
下面是一个短时傅立叶变换的代码程序
function timefreq(x,Nw,window)
% 待分析信号,行向量,Nw 时窗宽度
、
subplot(2,2,1);
plot(real(x));%描绘待分析信号
X=fft(x);%快速傅里叶变换
X=fftshift(X);%调整0频位置
subplot(2,2,2);
plot(abs(X));%描绘幅度谱
Lap=Nw/2;%重叠宽度
Tn=(length(x)-Lap)/(Nw-Lap);%计算分段数目
'
nfft=2^ceil(log2(Nw));%做fft 的点数
TF=zeros(Tn,nfft);%时频矩阵
for i=1:Tn
if(strcmp(window,'rec'))
Xw=x((i-1)*10+1:i*10+10);%加窗矩形处理
elseif(strcmp(window,'Hamming'))
Xw=x((i-1)*10+1:i*10+10).*Hamming(Nw)';%加hamming 处理
elseif(strcmp(window,'Blackman'))
(
Xw=x((i-1)*10+1:i*10+10).*Blackman(Nw)';%加black 处理
elseif(strcmp(window,'Gauss'))
Xw=x((i-1)*10+1:i*10+10).*Gauss(Nw)';%加Gauss 处理
else
return;
end
temp=fft(Xw,nfft);%求fft
temp=fftshift(temp);%调整0频位置
;
TF(i,:)=temp;%保存分段fft 结果
end
%绘制时频分析结果
subplot(2,2,3);
fnew=((1:nfft)-nfft/2)/nfft;
tnew=(1:Tn)*Lap;
[F,T]=meshgrid(fnew,tnew);
mesh(T,F,abs(TF));
|
xlabel('n');ylabel('w');zlabel('Gf'); subplot(2,2,4);
contour(T,F,abs(TF));
xlabel('n');ylabel('w');
例子:clc ;clear;
N=400;
x=zeros(1,N);
;
T=0:N-1;
x=exp(j*4*pi*(T/80).^2);
figure(1);
timefreq(x,20,’rec’);
figure(2);
timefreq(x,20,’Blackman’);