声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2169|回复: 4

[编程技巧] STFT短时傅立叶变换程序有问题说我mesh数据维度有问题,求指导

[复制链接]
发表于 2016-11-6 23:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x

  1. function [Spec,Freq] = STFT(Sig,nLevel,WinLen,SampFreq)
  2. %计算离散信号的短时Fourier变换
  3. %   Sig:待分析信号
  4. %nLevel:频率轴长度划分(默认值512)
  5. %WinLen:汉宁窗长度(默认值64)
  6. %SamFreq:信号的采样频率(默认值1)


  7. if(nargin<1),
  8.     error ('At least one parameter required!');
  9. end;

  10. Sig = real(Sig);
  11. SigLen=length(Sig);
  12. if(nargin<4),
  13.     SampFreq = 1;
  14. end
  15. if(nargin<3),
  16.     WinLen=64;
  17. end
  18. if (nargin<2),
  19.     nLevel=513;
  20. end


  21. nLevel=ceil(nLevel/2)*2+1;
  22. WinLen=ceil(WinLen/2)*2+1;
  23. WinFun=exp(-6*linspace(-1,1,WinLen).^2);
  24. WinFun=WinFun/norm(WinFun);
  25. Lh=(WinLen-1)/2;
  26. Ln=(nLevel-1)/2;
  27. Spec=zeros(nLevel,SigLen);

  28. wait=waitbar(0,'Under calculation,please wait...');
  29. for iLoop =1:SigLen,
  30.     waitbar(iLoop/SigLen,wait);
  31.     iLeft=min([iLoop-1,Lh,Ln]);
  32.     iRight=min([SigLen-iLoop,Lh,Ln]);
  33.     iIndex=iLeft:iRight;
  34.     iIndex1=iIndex+iLoop;
  35.     iIndex2=iIndex+Lh+1;
  36.     Index=iIndex+Ln+1;
  37.     Spec(Index,iLoop)=Sig(iIndex1).*conj(WinFun(iIndex2));
  38. end;


  39. close(wait);
  40. Spec=fft(Spec);
  41. Spec=abs(Spec(1:(end-1)/2,:));
  42. Freq=linspace(0,0.5,(nLevel-1)/2)*SampFreq;
  43. t=(0:(SigLen))/SampFreq;
  44. clf
  45. set(gcf,'Position',[20 100 500 430]);
  46. set(gcf,'Color','w');
  47. axes('Position',[0.1 0.45 0.53 0.5]);
  48. mesh(t,Freq,Spec);
  49. axis([min(t) max(t) 0 max(Freq)]);
  50. colorbar
  51. xlabel('t/s');
  52. ylabel('f/Hz');
  53. title('STFT时频谱图');
  54. axes('Position',[0.1 0.1 0.55 0.25]);
  55. polt(t,Sig);
  56. axis tight
  57. ylabel('x(t)');
  58. title('时域波形');
  59. axes('Position',[0.73 0.45 0.24 0.5]);
  60. PSP=abs(fft(Sig));
  61. Freq=linspace(0,1,SigLen)*SampFreq;
  62. plot(PSP(1:end/2),Freq(1:end/2));
  63. tiltle('频谱');



  64.    
  65.         
复制代码
回复
分享到:

使用道具 举报

 楼主| 发表于 2016-11-6 23:18 | 显示全部楼层
  1. SampFreq = 100;
  2. t = 0:1/SampFreq:5;
  3. Sig=sin(2*pi*(5*t+4*t.^2));
  4. Sig=Sig+sin(2*pi*(45*t-4*t.^2));
  5. STFT(Sig,512,128,100);
复制代码

上面的这个是要画的函数..
发表于 2016-11-7 08:34 | 显示全部楼层
数据没有一一对应吧
发表于 2017-6-5 23:55 | 显示全部楼层
学习了~~~
发表于 2017-6-6 13:42 | 显示全部楼层
提示你索引超出维度了吗 注意数据矩阵的对应关系
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-4-24 07:47 , Processed in 0.121003 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表