声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2179|回复: 8

[HHT] 做eemd的希尔伯特谱的时候为什么显示的是灰色条块状的呢?

[复制链接]
发表于 2014-2-26 13:52 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 我爱振动 于 2014-2-26 14:26 编辑

蓝色.jpg QQ截图20140226134956.jpg
用的是网上的程序,各位有知道什么原因的吗?先谢谢了啊~
程序如下
N=1000;
n=1:N;
fs=1000;
t=n/fs;
fx=10;
fy=50;
x=cos(2*pi*fx*t);
y=10*cos(2*pi*fy*t);
z=x+y;
data=z;
imf=eemd(data,0.2,100);                        
[A,f,t]=hhspectrum(imf);        
[E,t,Cenf]=toimage(A,f);            
disp_hhs(E)
网上的蓝色图形,灰色是我自己程序的图形

回复
分享到:

使用道具 举报

发表于 2014-5-21 18:49 | 显示全部楼层
本帖最后由 牛小贱 于 2014-5-22 12:53 编辑

画谱图的程序太简陋了吧,给你一个我的你看看,是从一本书里弄的:机械故障诊断中的现代信号处理方法
程序代码:
  1. function [Spectrum,freq]=Book_HHT(Sig)                    %计算HHT的主程序
  2. if(nargin<1),
  3.     error('At least one input is needed');
  4. end
  5. Imf=emd(Sig);                           %对信号进行经验模式分解
  6. [nImf,SigLen]=size(Imf);
  7. t=1:SigLen;
  8. HHSpectrum=zeros(max(1,nImf-1),SigLen);
  9. AmpSpectrum=zeros(max(1,nImf-1),SigLen);
  10. for k=1:nImf-1,
  11.      Imf0=real(Imf(k,:));
  12.      [freq,Amp]=InstFreq(Imf0);                      %用hilbert变换估计每个本征模分量的瞬时频率和功率
  13.      HHSpectrum(k,:)=freq';
  14.      AmpSpectrum(k,:)=Amp';
  15. end

  16. %组合所有本征模分量的瞬时频率和瞬时功率为Hilbert谱

  17. MaxFreq=max(max(HHSpectrum));
  18. MaxFreq=ceil(MaxFreq/0.5)*0.5;
  19. NumFreq=128;
  20. freq=linspace(0,MaxFreq,NumFreq);
  21. Spectrum=zeros(NumFreq,SigLen);
  22. Temp=HHSpectrum;
  23. Temp=min(round((Temp/MaxFreq)*NumFreq)+1,NumFreq);
  24. for k=1:nImf-1,
  25.      for n=1:SigLen,
  26.          Spectrum(Temp(k,n),n)=Spectrum(Temp(k,n),n)+AmpSpectrum(k,n);
  27.      end
  28. end
  29. %显示信号的Hilbert谱
  30. %  clf;
  31. mesh(t,freq,Spectrum);
  32. colormap jet;
  33. axis([min(t) max(t) min(freq) max(freq)]);
  34. shading interp;
  35. title('Hilbert-Huang spectrum');
  36. ylabel('Frequency');
  37.   xlabel('Time');
  38. %  function [Imf] =Emd (Sig)             %对信号进行经验模式分解
  39. %  if(nargin<1),
  40. %       error('At least one input is needed!');
  41. %  end
  42. % Sig=Sig';
  43. % SigLen=length(Sig);
  44. % t=1:SigLen;
  45. % c=Sig;
  46. % Imf = [ ];
  47. % nLoop=1;
  48. % MaxLoop=1000;
  49. % [IndMax,IndMin]=ExtrPoint(c);                          %提取信号的极值点;极大值点和极小值点
  50. % [Index_zer]=ZeroPoint(c);                             %提取信号的零点
  51. % NExtr = length(IndMin) + length(IndMax);               %极值点个数
  52. % NZero=length(Index_zer);                              %零点个数
  53. % Bool=1;
  54. % NEtd=2;
  55. % IMFNum=0;
  56. % while( NExtr > 2 && Bool > 0),
  57. %     h=c;
  58. %     nLoop=1;
  59. %     SD=1;
  60. % while((SD>0.3||(abs(NZero-NExtr)>1))&&(NExtr>2)&&nLoop<MaxLoop)    %镜像拓展序列
  61. %   LMaxEtd=fliplr(IndMax(1:min(end,NEtd)));
  62. %   LMinEtd=fliplr(IndMin(1:min(end,NEtd)));
  63. %   hlMaxEtd=h(LMaxEtd);
  64. %   hlMinEtd=h(LMinEtd);
  65. %   LMaxEtd=-LMaxEtd+1;
  66. %   LMinEtd=-LMinEtd+1;
  67. %   RMaxEtd=fliplr(IndMax(max(end-NEtd+1,1):end));
  68. %   RMinEtd=fliplr(IndMin(max(end-NEtd+1,1):end));
  69. %   hrMaxEtd=h(RMaxEtd);
  70. %   hrMinEtd=h(RMinEtd);
  71. %   RMaxEtd=2*SigLen-RMaxEtd;
  72. %   RMinEtd=2*SigLen-RMinEtd;
  73. % %计算信号的上包络线
  74. %   Max_Env=interp1([LMaxEtd t(IndMax) RMaxEtd],[hlMaxEtd h(IndMax) hrMaxEtd],t,'spline');
  75. % %计算信号的下包络线
  76. %   Min_Env=interp1([LMinEtd t(IndMin) RMinEtd],[hlMinEtd h(IndMin) hrMinEtd],t,'spline');
  77. %   Mean_Env=(Max_Env+Min_Env)/2;                 %计算上下包络线的平均值
  78. %   Preh=h;
  79. %   h=h-Mean_Env;
  80. %   alarm=1.0e-08;
  81. %   SD=sum(((Preh-h).^2)./(Preh.^2+alarm));
  82. %   [IndMax,IndMin]=ExtrPoint(h);                 %提取信号的极值点            
  83. %   [Index_zer]=ZeroPoint(h);                     %提取信号的零点
  84. %   NExtr=length(IndMin)+length(IndMax);
  85. %   NZero=length(Index_zer);
  86. %   nLoop=nLoop+1;
  87. % end %提取到一个本征模分量
  88. % IMFNum=IMFNum+1;
  89. % disp([num2str(IMFNum),'IMFs have been obtained']);
  90. % Imf=[Imf;h];
  91. % c=c-h;
  92. % [IndMax,IndMin]=ExtrPoint(c);                    %提取信号的极值点      
  93. % [Index_zer]=ZeroPoint(c);                        %提取信号的零点
  94. % NExtr=length(IndMin)+length(IndMax);
  95. % NZero=length(Index_zer);
  96. %   Bool=1;
  97. %   if((range(c)/range(Sig))<2e-4),
  98. %       Bool=-1;
  99. %   end
  100. % end
  101. % Imf=[Imf;c];
  102. % [n, m]=size(Imf);
  103. % xCor=[ ];
  104. % %
  105. % norm_Sig=(Sig-mean(Sig))/std(Sig);
  106. % for i=1:n-1,
  107. %     norm_Imf=(Imf(i,:)-mean(Imf(i,:)))/std(Imf(i,:));
  108. %     Coef=xcorr(norm_Sig,norm_Imf)/SigLen;
  109. %     xCor=[xCor max(abs(Coef))];
  110. % end
  111. % k=find(xCor>max(xCor)/8);
  112. % disp([num2str(length(k)),'IMFs have been selected.']);
  113. % Temp=zeros(length(k)+1,SigLen);
  114. % Temp1=Sig;
  115. % for i=1:length(k),
  116. %     Temp(i,:)=Imf(k(i),:);
  117. %     Temp1=Temp1-Imf(k(i),:);
  118. % end
  119. % Temp(length(k)+1,:)=Temp1; %最后一个为残差分量
  120. % Imf=Temp;

  121. function[Pos_max,Pos_min]=ExtrPoint(Sig)                                    %提取信号的极大值和极小值点

  122. if(nargin==0)
  123.     error('At least one input is required');
  124. end
  125. SigLen=length(Sig);
  126. DSig=diff(Sig);
  127. DSig1=DSig(1:end-1);
  128. DSig2=DSig(2:end);
  129. Pos_min=find(DSig1.*DSig2<0 & DSig1<0)+1;
  130. Pos_max=find(DSig1.*DSig2<0 & DSig1>0)+1;
  131. Pos_max=sort([Pos_max]);
  132. Pos_min=sort([Pos_min]);
  133. function [PZero]=ZeroPoint(Sig)                                             %提取信号的过零点   
  134. if(nargin==0)
  135.     error('At least one input is required');
  136. end
  137. SigLen=length(Sig);
  138. s1=Sig(1:SigLen-1);
  139. s2=Sig(2:SigLen);
  140. PZero=find(s1.*s2<0);
  141. IndZero=find(Sig==0);
  142. if(~isempty(IndZero)),
  143.     zero=find(Sig==0);
  144.     DZero=diff([0 zero 0]);
  145.     LZero=find(DZero==1);
  146.     RZero=find(DZero==-1)-1;
  147.     IndZero=round((LZero+RZero)/2);
  148.     PZero=sort([PZero IndZero]);
  149. end
  150. function[freq,Amp]=InstFreq(Sig)                                            %计算信号的瞬时频率和功率
  151.     %  freq:信号的瞬时频率
  152.     %  Amp :信号的瞬时功率
  153. if(nargin==0),
  154.     error('At least one input is required');
  155. end;
  156. SigLen=length(Sig);
  157. x=hilbert(real(Sig));                                                       %计算信号的Hilbert变换
  158. Amp=abs(x);                                                                 %计算信号的瞬时功率
  159. freq=(angle(-x(2:SigLen).*conj(x(1:SigLen-1)))+pi)/(2*pi);                  %计算信号的瞬时功率
  160. freq=[freq(1) freq];
  161. std_freq=std(freq);
  162. k=3;
  163. threshold=k*std_freq+mean(freq);
  164. warm= freq>threshold;
  165. freq(warm)=mean(freq);
  166. threshold=-k*std_freq+mean(freq);
  167. warm= find(freq<threshold);
  168. freq(warm)=mean(freq);     
复制代码




程序代码.txt

5.44 KB, 下载次数: 22

点评

建议你以后发程序代码的时候,尽量不要以附件的形式,而是以“<>代码”功能~呵呵。谢谢你积极参与论坛的讨论!现在论坛百废待兴,需要积极活跃的成员,继续努力~  发表于 2014-5-22 12:54

评分

1

查看全部评分

发表于 2014-6-5 01:03 | 显示全部楼层
求程序,楼主能不能把你的程序贴上来
发表于 2014-9-13 09:58 | 显示全部楼层
hht123 发表于 2014-5-21 18:49
画谱图的程序太简陋了吧,给你一个我的你看看,是从一本书里弄的:机械故障诊断中的现代信号处理方法
程序 ...

怎么这么复杂啊。。。唉,顿时感觉自己学得太少了。。。。
发表于 2014-9-13 09:59 | 显示全部楼层
好像用colormap设置一下就可以了吧
发表于 2016-10-17 20:51 | 显示全部楼层
楼主你这个问题解决了么?
发表于 2016-10-18 08:21 | 显示全部楼层
colormap就行
发表于 2016-10-18 08:26 | 显示全部楼层
你程序中的imf=eemd(data,0.2,100);  对吗????
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-12-23 15:43 , Processed in 0.080299 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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