用希尔伯特黄变换(HHT)求时频谱和边际谱
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.什么是HHT?
HHT就是先将信号进行经验模态分解(EMD分解),然后将分解后的每个IMF 分量进行Hilbert变换,得到信号的时频属性的一种时频分析方法。
2.EMD分解的步骤。
EMD分解的流程图如下:
3.实例演示。
给定频率分别为10Hz和35Hz的两个正弦信号相叠加的复合信号,采样频率fs=2048Hz的信号,表达式如下:y=5sin(2*pi*10t)+5*sin(2*pi*35t)
(1)为了对比,先用fft对求上述信号的幅频和相频曲线。
1.function fftfenxi
2.clear;clc;
3.N=2048;
4.%fft默认计算的信号是从0开始的
5.t=linspace(1,2,N);deta=t(2)-t(1);1/deta
6.x=5*sin(2*pi*10*t)+5*sin(2*pi*35*t);
7.%N1=256;N2=512;w1=0.2*2*pi;w2=0.3*2*pi;w3=0.4*2*pi;
8.%
x=(t>=-200&t<=-200+N1*deta).*sin(w1*t)+(t>-200+N1*deta&t<=-200+N2*deta).*sin(w2*t)+(t>-200+N2*deta&t<=200).*s
in(w3*t);
9.y=x;
10.m=0:N-1;
11.f=1./(N*deta)*m;%可以查看课本就是这样定义横坐标频率范围的
12.%下面计算的Y就是x(t)的傅里叶变换数值
13.%Y=exp(i*4*pi*f).*fft(y)%将计算出来的频谱乘以exp(i*4*pi*f)得到频移后[-2,2]之间的频谱值
14.Y=fft(y);
15.z=sqrt(Y.*conj(Y));
16.plot(f(1:100),z(1:100));
17.title('幅频曲线')
18.xiangwei=angle(Y);
19.figure(2)
20.plot(f,xiangwei)
21.title('相频曲线')
22.figure(3)
23.plot(t,y,'r')
24.%axis([-2,2,0,1.2])
25.title('原始信号')
复制代码
(2)用Hilbert变换直接求该信号的瞬时频率
1.clear;clc;clf;
2.%假设待分析的函数是z=t^3
3.N=2048;
4.%fft默认计算的信号是从0开始的
5.t=linspace(1,2,N);deta=t(2)-t(1);fs=1/deta;
6.x=5*sin(2*pi*10*t)+5*sin(2*pi*35*t);
7.z=x;
8.hx=hilbert(z);
9.xr=real(hx);xi=imag(hx);
10.%计算瞬时振幅
11.sz=sqrt(xr.^2+xi.^2);
12.%计算瞬时相位
13.sx=angle(hx);
14.%计算瞬时频率
15.dt=diff(t);
16.dx=diff(sx);
17.sp=dx./dt;
18.plot(t(1:N-1),sp)
19.title('瞬时频率')
复制代码
小结:傅里叶变换不能得到瞬时频率,即不能得到某个时刻的频率值。
Hilbert变换是求取瞬时频率的方法,但如
果只用Hilbert变换求出来的瞬时频率也不准确。
(出现负频,实际上负频没有意义!)(3)用HHT求取信号的时频谱与边际谱
1.function HHT
2.clear;clc;clf;
3.N=2048;
4.%fft默认计算的信号是从0开始的
5.t=linspace(1,2,N);deta=t(2)-t(1);fs=1/deta;
6.x=5*sin(2*pi*10*t)+5*sin(2*pi*35*t);
7.z=x;
8.c=emd(z);
9.
10.%计算每个IMF分量及最后一个剩余分量residual与原始信号的相关性
11.[m,n]=size(c);
12.for i=1:m;
13.a=corrcoef(c(i,:),z);
14.xg(i)=a(1,2);
15.end
16.xg;
17.
18.for i=1:m-1
19.%--------------------------------------------------------------------
20.%计算各IMF的方差贡献率
21.%定义:方差为平方的均值减去均值的平方
22.%均值的平方
23.%imfp2=mean(c(i,:),2).^2
24.%平方的均值
25.%imf2p=mean(c(i,:).^2,2)
26.%各个IMF的方差
27.mse(i)=mean(c(i,:).^2,2)-mean(c(i,:),2).^2;
28.end;
29.mmse=sum(mse);
30.for i=1:m-1
31.mse(i)=mean(c(i,:).^2,2)-mean(c(i,:),2).^2;
32.%方差百分比,也就是方差贡献率
33.mseb(i)=mse(i)/mmse*100;
34.%显示各个IMF的方差和贡献率
35.end;
36.%画出每个IMF分量及最后一个剩余分量residual的图形
37.figure(1)
38.for i=1:m-1
39.disp(['imf',int2str(i)]);disp([mse(i)mseb(i)]);
40.end;
41.subplot(m+1,1,1)
42.plot(t,z)
43.set(gca,'fontname','times New Roman')
44.set(gca,'fontsize',14.0)
45.ylabel(['signal','Amplitude'])
46.
47.for i=1:m-1
48.subplot(m+1,1,i+1);
49.set(gcf,'color','w')
50.plot(t,c(i,:),'k')
51.set(gca,'fontname','times New Roman')
52.set(gca,'fontsize',14.0)
53.ylabel(['imf',int2str(i)])
54.end
55.subplot(m+1,1,m+1);
56.set(gcf,'color','w')
57.plot(t,c(m,:),'k')
58.set(gca,'fontname','times New Roman')
59.set(gca,'fontsize',14.0)
60.ylabel(['r',int2str(m-1)])
61.
62.%画出每个IMF分量及剩余分量residual的幅频曲线
63.figure(2)
64.subplot(m+1,1,1)
65.set(gcf,'color','w')
66.[f,z]=fftfenxi(t,z);
67.plot(f,z,'k')
68.set(gca,'fontname','times New Roman')
69.set(gca,'fontsize',14.0)
70.ylabel(['initial signal',int2str(m-1),'Amplitude'])
71.
72.for i=1:m-1
73.subplot(m+1,1,i+1);
74.set(gcf,'color','w')
75.[f,z]=fftfenxi(t,c(i,:));
76.plot(f,z,'k')
77.set(gca,'fontname','times New Roman')
78.set(gca,'fontsize',14.0)
79.ylabel(['imf',int2str(i),'Amplitude'])
80.end
81.subplot(m+1,1,m+1);
82.set(gcf,'color','w')
83.[f,z]=fftfenxi(t,c(m,:));
84.plot(f,z,'k')
85.set(gca,'fontname','times New Roman')
86.set(gca,'fontsize',14.0)
87.ylabel(['r',int2str(m-1),'Amplitude'])
88.
89.hx=hilbert(z);
90.xr=real(hx);xi=imag(hx);
91.%计算瞬时振幅
92.sz=sqrt(xr.^2+xi.^2);
93.%计算瞬时相位
94.sx=angle(hx);
95.%计算瞬时频率
96.dt=diff(t);
97.dx=diff(sx);
98.sp=dx./dt;
99.figure(6)
100.plot(t(1:N-1),sp)
101.title('瞬时频率')
102.
103.%计算HHT时频谱和边际谱
104.[A,fa,tt]=hhspectrum(c);
105.[E,tt1]=toimage(A,fa,tt,length(tt));
106.figure(3)
107.disp_hhs(E,tt1)%二维图显示HHT时频谱,E是求得的HHT谱108.pause
109.figure(4)
110.for i=1:size(c,1)
111.faa=fa(i,:);
112.[FA,TT1]=meshgrid(faa,tt1);%三维图显示HHT时频图
113.surf(FA,TT1,E)
114.title('HHT时频谱三维显示')
115.hold on
116.end
117.hold off
118.E=flipud(E);
119.for k=1:size(E,1)
120.bjp(k)=sum(E(k,:))*1/fs;
121.end
122.f=(1:N-2)/N*(fs/2);
123.figure(5)
124.plot(f,bjp);
125.xlabel('频率/Hz');
126.ylabel('信号幅值');
127.title('信号边际谱')%要求边际谱必须先对信号进行EMD分解128.
129.function[A,f,tt]=hhspectrum(x,t,l,aff)
130.
131.error(nargchk(1,4,nargin));
132.
133.if nargin<2
134.
135.t=1:size(x,2);
136.
137.end
138.
139.if nargin<3
140.
141.l=1;
142.
143.end
144.
145.if nargin<4
146.
147.aff=0;
148.
149.end
150.
151.if min(size(x))==1
152.if size(x,2)==1
153.x=x';
154.if nargin<2
155.t=1:size(x,2);
156.end
157.end
158.Nmodes=1;
159.else
160.Nmodes=size(x,1);
161.end
162.
163.lt=length(t);
164.
165.tt=t((l+1):(lt-l));
166.
167.for i=1:Nmodes
168.
169.an(i,:)=hilbert(x(i,:)')';
170.f(i,:)=instfreq(an(i,:)',tt,l)';
171.A=abs(an(:,l+1:end-l));
172.
173.if aff
174.disprog(i,Nmodes,max(Nmodes,100))
175.end
176.
177.end
178.
179.
180.function disp_hhs(im,t,inf)
181.
182.%DISP_HHS(im,t,inf)
183.%displays in a new figure the spectrum contained in matrix"im" 184.%(amplitudes in log).
185.%
186.%inputs:-im:image matrix(e.g.,output of"toimage") 187.%-t(optional):time instants(e.g.,output of"toimage") 188.%-inf(optional):-dynamic range in dB(wrt max)
189.%default:inf=-20
190.%
191.%utilisation:disp_hhs(im);disp_hhs(im,t);disp_hhs(im,inf) 192.%disp_hhs(im,t,inf)
193.
194.figure
195.colormap(bone)
196.colormap(1-colormap);
197.
198.if nargin==1
199.inf=-20;
200.t=1:size(im,2);
201.
202.end
203.
204.if nargin==2
205.if length(t)==1
206.inf=t;
207.t=1:size(im,2);
208.else
209.inf=-20;
210.end
211.end
212.
213.if inf>=0
214.error('inf doit etre<0')
215.end
216.
217.M=max(max(im));
218.
219.im=log10(im/M+1e-300);
220.
221.inf=inf/10;
222.
223.
224.imagesc(t,fliplr((1:size(im,1))/(2*size(im,1))),im,[inf,0]);
225.set(gca,'YDir','normal')
226.xlabel(['time'])
227.ylabel(['normalized frequency'])
228.title('Hilbert-Huang spectrum')
229.function[f,z]=fftfenxi(t,y)
230.L=length(t);N=2^nextpow2(L);
231.%fft默认计算的信号是从0开始的
232.t=linspace(t(1),t(L),N);deta=t(2)-t(1);
233.m=0:N-1;
234.f=1./(N*deta)*m;
235.%下面计算的Y就是x(t)的傅里叶变换数值
236.%Y=exp(i*4*pi*f).*fft(y)%将计算出来的频谱乘以exp(i*4*pi*f)得到频移后[-2,2]之间的频谱值
237.Y=fft(y);
238.z=sqrt(Y.*conj(Y));
复制代码
4.总结。
(1)边际谱与傅里叶谱的比较:
意义不同:边际谱从统计意义上表征了整组数据每个频率点的累积幅值分布,而傅里叶频谱的某一点频率上的幅值表示在整个信号里有一个含有此频率的三角函数组分。
作用不同:边际谱可以处理非平稳信号,如果信号中存在某一频率的能量出现,就表示一定有该频率的振动波出现,也就是说,边际谱能比较准确地反映信号的实际频率成分。
而傅里叶变换只能处理平稳信号。
(2)HHT与Hilbert变换的比较:
Hilbert变换只是单纯地求信号的瞬时振幅,频率和相位,有可能出现没有意义的负频率;HHT变换先将信号进行EMD分解,得到的是各个不同尺度的分量,对每一个分量进行Hilbert变换后得到的是有实际意义的瞬时频率。
PS:运行上面的程序需要装时频工具箱,我仅将用到的emd分解的程序贴到下面。