短时傅里叶变换matlab程序.
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
function [Spec,Freq]=STFT(Sig,nLevel,WinLen,SampFreq %计算离散信号的短时傅里叶变换;
% Sig 待分析信号;
% nLevel 频率轴长度划分(默认值512);
% WinLen 汉宁窗长度(默认值 64);
% SampFreq 信号的采样频率(默认值1);
if (nargin <1,
error('At least one parameter required!';
end;
Sig=real(Sig;
SigLen=length(Sig;
if (nargin <4,
SampFreq=1;
end
if (nargin <3,
WinLen=64;
end
if (nargin <2,
nLevel=513;
end
nLevel=ceil(nLevel/2*2+1;
WinLen=ceil(WinLen/2*2+1;
WinFun=exp(-6*linspace(-1,1,WinLen.^2;
WinFun=WinFun/norm(WinFun;
Lh=(WinLen-1/2;
Ln=(nLevel-1/2;
Spec=zeros(nLevel,SigLen;
wait=waitbar(0,'Under calculation,please wait...';
for iLoop=1:SigLen,
waitbar(iLoop/SigLen,wait;
iLeft=min([iLoop-1,Lh,Ln];
iRight=min([SigLen-iLoop,Lh,Ln];
iIndex=-iLeft:iRight;
iIndex1=iIndex+iLoop;
iIndex2=iIndex+Lh+1;
Index=iIndex+Ln+1;
Spec(Index,iLoop=Sig(iIndex1.*conj(WinFun(iIndex2; end; close(wait;
Spec=fft(Spec;
Spec=abs(Spec(1:(end-1/2,:;
Freq=linspace(0,0.5,(nLevel-1/2*SampFreq; t=(0:(SigLen-1/SampFreq;
clf
set(gcf,'Position',[20 100 500 430]; set(gcf,'Color','w';
axes('Position',[0.1 0.45 0.53 0.5]; mesh(t,Freq,Spec;
axis([min(t max(t 0 max(Freq]; colorbar
xlabel('t/s';
ylabel('f/Hz';
title('STFT时频谱图';
axes('Position',[0.1 0.1 0.55 0.25]; plot(t,Sig;
axis tight
ylabel('x(t';
title('时域波形';
axes('Position',[0.73 0.45 0.24 0.5]; PSP=abs(fft(Sig;
Freq=linspace(0,1,SigLen*SampFreq; plot(PSP(1:end/2,Freq(1:end/2; title('频谱';