Hilbert 边际谱 - pudn.comread.pudn.com/downloads495/doc/2060452/HHT.pdf · 1、Hilbert 边际谱...

33
目录: 1Hilbert 边际谱 2Hilbert 边际谱和 FT 变换后的幅频谱 3EEMD 的一些问题 4、利用 instfreq 函数求取瞬时频率时出现的问题 5、完整的 EMD 分解全过程,有 Hilbert 谱和边际谱 6、调频信号,HHT fft 哪个正确? 7、边际谱和 HHT 谱的 Matlab 例子 8、关于 hilbert 谱图的问题 9、总体经验模态分解(EEMD)、Fourier 变换、HHT 10HHT 时频灰度谱转黑白谱 11HHT 谱图怎么会这样呢? 12HHT 三维图 13、对一实测信号的处理 14emd 方法的几点不明的解答 15、一些有用的网址 1Hilbert 边际谱 我觉得既然已经做出 EMD 了,也就是得到了 IMF。这个时候就是做 hilbert 幅值谱,然后对它积分就可以了。程序 不是很难搞到吧! 我是用 hspec 画谱图的,自己又在后面添加了求边际谱的代码,但感觉有问题 for k=1:size(E) bjp(k)=sum(E(k,:))*1/fs; %fs 为采样频率; end figure plot(bjp); xlabel(' 频率 / Hz'); ylabel(' 幅值'); 比如我用两个正弦信号作仿真 fs=1000; t=1/fs:1/fs:1; y1=2*sin(40*pi*t); y2=5*sin(80*pi*t); y=[y1,y2]; % 信号 画出来的图很粗糙,更不用说对实际信号分析了,所以大家看看如何来修正?黄文章中边际谱对实际信号分析是很 好的一条曲线

Transcript of Hilbert 边际谱 - pudn.comread.pudn.com/downloads495/doc/2060452/HHT.pdf · 1、Hilbert 边际谱...

Page 1: Hilbert 边际谱 - pudn.comread.pudn.com/downloads495/doc/2060452/HHT.pdf · 1、Hilbert 边际谱 2、Hilbert 边际谱和FT 变换后的幅频谱 3、EEMD 的一些问题 4、利用

目录:

1、Hilbert 边际谱

2、Hilbert 边际谱和 FT 变换后的幅频谱

3、EEMD 的一些问题

4、利用 instfreq 函数求取瞬时频率时出现的问题

5、完整的 EMD 分解全过程,有 Hilbert 谱和边际谱

6、调频信号,HHT 和 fft 哪个正确?

7、边际谱和 HHT 谱的 Matlab 例子

8、关于 hilbert 谱图的问题

9、总体经验模态分解(EEMD)、Fourier 变换、HHT10、HHT 时频灰度谱转黑白谱

11、HHT 谱图怎么会这样呢?

12、HHT 三维图

13、对一实测信号的处理

14、emd 方法的几点不明的解答

15、一些有用的网址

1、Hilbert边际谱

我觉得既然已经做出 EMD 了,也就是得到了 IMF。这个时候就是做 hilbert 幅值谱,然后对它积分就可以了。程序

不是很难搞到吧!

我是用 hspec 画谱图的,自己又在后面添加了求边际谱的代码,但感觉有问题

for k=1:size(E)

bjp(k)=sum(E(k,:))*1/fs; %fs 为采样频率;

end

figure

plot(bjp);

xlabel('频率 / Hz');

ylabel('幅值');

比如我用两个正弦信号作仿真

fs=1000;

t=1/fs:1/fs:1;

y1=2*sin(40*pi*t);

y2=5*sin(80*pi*t);

y=[y1,y2]; % 信号

画出来的图很粗糙,更不用说对实际信号分析了,所以大家看看如何来修正?黄文章中边际谱对实际信号分析是很

好的一条曲线

Page 2: Hilbert 边际谱 - pudn.comread.pudn.com/downloads495/doc/2060452/HHT.pdf · 1、Hilbert 边际谱 2、Hilbert 边际谱和FT 变换后的幅频谱 3、EEMD 的一些问题 4、利用

我用 hhspectrum 算了一下谱图,同时求了一下边际谱,边际谱程序基本想法同 form。

结果也不太好,20HZ 处还行,40HZ 就有些问题了,见附图

答 1:你自己再用这个试试 我没有用 rilling的 hhspectrum

nspab:

function h1= nspab(data,nyy,minw,maxw,dt)

Page 3: Hilbert 边际谱 - pudn.comread.pudn.com/downloads495/doc/2060452/HHT.pdf · 1、Hilbert 边际谱 2、Hilbert 边际谱和FT 变换后的幅频谱 3、EEMD 的一些问题 4、利用

% The function NSPAB generates a smoothed HHT spectrum of data(n,k)

% in time-frequency space, where

% n specifies the length of time series, and

% k is the number of IMF components.

% The frequency-axis range is prefixed.

% Negative frequency sign is reversed.

%

% MATLAB Library function HILBERT is used to calculate the Hilbert transform.

%

% Example, [h,xs,w] = nspab(lod78_p',200,0,0.12,1,3224).

%

% Functions CONTOUR or IMG can be used to view the spectrum,

% for example contour(xs,w,h) or img(xs,w,h).

%

% Calling sequence-

% [h,xs,w] = nspab(data,nyy,minw,maxw,t0,t1)

%

% Input-

% data - 2-D matrix data(n,k) of IMF components

% nyy - the frequency resolution

% minw - the minimum frequency

% maxw - the maximum frequency

% t0 - the start time

% t1 - the end time

% Output-

% h - 2-D matrix of the HHT spectrum, where

% the 1st dimension specifies the number of frequencies,

% the 2nd dimension specifies the number of time values

% xs - vector that specifies the time-axis values

% w - vector that specifies the frequency-axis values

% Z. Shen (JHU) July 2, 1995 Initial

%----- Get dimensions (number of time points and components)

[npt,knb] = size(data);

%----- Get time interval

%----- Apply Hilbert Transform

data=hilbert(data);

a=abs(data);

omg=abs(diff(unwrap(angle(data))))/(2*pi*dt);

%----- Smooth amplitude and frequency

filtr=fir1(8,.1);

for i=1:knb

a(:,i)=filtfilt(filtr,1,a(:,i));

Page 4: Hilbert 边际谱 - pudn.comread.pudn.com/downloads495/doc/2060452/HHT.pdf · 1、Hilbert 边际谱 2、Hilbert 边际谱和FT 变换后的幅频谱 3、EEMD 的一些问题 4、利用

omg(:,i)=filtfilt(filtr,1,omg(:,i));

end

%----- Limit frequency and amplitude

for i=1:knb

for i1=1:npt-1

if omg(i1,i) >=maxw,

omg(i1,i)=maxw;

a(i1,i)=0;

elseif omg(i1,i)<=minw,

omg(i1,i)=minw;

a(i1,i)=0;

else

end

end

end

clear filtr data

%va=var(omg(200:1200))

%----- Get local frequency

dw=maxw - minw;

wmx=maxw;

wmn=minw;

%----- Construct the ploting matrix

clear p;

h1=zeros(npt-1,nyy+1);

p=round(nyy*(omg-wmn)/dw)+1;

for j1=1:npt-1

for i1=1:knb

ii1=p(j1,i1);

h1(j1,ii1)=h1(j1,ii1)+a(j1,i1);

end

end

%----- Do 3-point to 1-point averaging

[nx,ny]=size(h1);

%n1=fix(nx/3);

%h=zeros(n1,ny);

%for i1=1:n1

%h(i1,:)=(h1(3*i1,:)+h1(3*i1-1,:)+h1(3*i1-2,:));

%end

%clear h1;

%----- Do 3-points smoothing in x-direction

fltr=1./3*ones(3,1);

Page 5: Hilbert 边际谱 - pudn.comread.pudn.com/downloads495/doc/2060452/HHT.pdf · 1、Hilbert 边际谱 2、Hilbert 边际谱和FT 变换后的幅频谱 3、EEMD 的一些问题 4、利用

for j1=1:ny

h1(:,j1)=filtfilt(fltr,1,h1(:,j1));

end

clear fltr;

%----- Define the results

%w=linspace(wmn,wmx,ny-1)';

%xs=linspace(t0,t1,nx)';

h1=flipud(rot90(h1));

h1=h1(1:ny-1,:);

续:form 求边际谱时所用程序是没有问题的,用的是矩形积分公式。

他所得结果不正确的原因是:输入的应是调用了 toimage 后的结果,而不是调用了 hhspectrum 后的结果。

下面给一段程序,大家可以去试下。边际谱的分析结果是完全正确的。

clear;

fs=1000; %fs 为采样频率;

N=1000; %采样点数

t=1/fs:1/fs:1;

y1=2*sin(60*pi*t);

y2=5*sin(90*pi*t);

y=[y1;y2;zeros(size(y1))]; %IMF 集

%%%%%%%%%%%%%求边际谱

[A,fa,tt]=hhspectrum(y);

[E,tt1]=toimage(A,fa,tt,length(tt));

E=flipud(E);

for k=1:size(E,1)

bjp(k)=sum(E(k,:))*1/fs;

end

f=(0:N-3)/N*(fs/2);

plot(f,bjp);

xlabel('频率 / Hz');

ylabel('幅值');

%(完整答案)

Page 6: Hilbert 边际谱 - pudn.comread.pudn.com/downloads495/doc/2060452/HHT.pdf · 1、Hilbert 边际谱 2、Hilbert 边际谱和FT 变换后的幅频谱 3、EEMD 的一些问题 4、利用

问:看了你的程序,我有几点不明白,首先 y=[y1;y2;zeros(size(y1))]; %IMF 集这句代表的含义是什么?你好像没有

作 EMD,哪里会有 IMF,还有就是 E=flipud(E); , 这句的作用是什么?

答:一个正弦函数本身就是一个 IMF,所以 y=[y1;y2;zeros(size(y1))]就是一个 IMF 集(当然假定了残余函数为

0)。

ps:调用了 toimage 后得到的结果才是真正的 Hilbert 谱!

flipud 是一个使矩阵上下翻转的函数。在 Grilling 提供的程序 toimage 中,频率是从上往下递增,而通常在时频图中

频率应是从下往上递增,所以使用 flipud 将矩阵翻转后,更便于我们阅读时频图。对于边际谱来说,如果不对 E 翻

转,边际谱图中的频率将是从从右往左递增的。

2、Hilbert边际谱和 FT变换后的幅频谱

这得出的 Hilbert 边际谱和 FT 变换后的幅频谱为什么会有这么大的区别呢,到底哪个幅值才是真正的实际幅值呢?

有参考价值吗? 程序如下:

load shuju

fs=5120;

N=4096;

a1=a(1:N,1);

a2=abs(fft(a1))*2/N;

f=fs*(0:N/2-1)/N;

n=length(f);

subplot(211)

plot(f,a2(1:n))

xlabel('频率 / Hz');

ylabel('幅值');

title('FT 后的幅频图')

imf=emd(a1);

[A,fa,tt]=hhspectrum(imf);

Page 7: Hilbert 边际谱 - pudn.comread.pudn.com/downloads495/doc/2060452/HHT.pdf · 1、Hilbert 边际谱 2、Hilbert 边际谱和FT 变换后的幅频谱 3、EEMD 的一些问题 4、利用

[E,tt1]=toimage(A,fa,tt,length(tt));

for k=1:size(E,1)

bjp(k)=sum(E(k,:))*1/fs;

end

f=(0:N-3)/N*(fs/2);

subplot(212)

plot(f,bjp);

xlabel('频率 / Hz');

ylabel('幅值');

title('Hilbert 边际谱')

答:EMD 分解的 IMF 能量和原信号其能量是不相等的。所以边际谱能量不能和 FFT 的能量相比。边际谱能量只能

说明某个信号存在,能量相对于其他的大小。

边际谱是对 IMF 取包络线。因此它得到的谱能量要大于被取包络的信号能量。FFT 谱和原信号的能量是相等的。所

以从能量的大小讲,应该是边际谱能量大于 FFT 的能量。如果是一个谐波取边际谱和 FFT 的话,应该是频率对应

的能量边际谱大于 FFT。

3、EEMD 的一些问题

刚刚接触 EEMD,从台湾中央大学上下载了程序,然后编写程序如下:

clear;clc

t=1:1000;

t1=t/100*2*pi;

a1=sin(t1);

t2=t/10*2*pi;

b1=linspace(0,0,1000);

for i=250:350

b1(i)=0.2*sin(t2(i));

Page 8: Hilbert 边际谱 - pudn.comread.pudn.com/downloads495/doc/2060452/HHT.pdf · 1、Hilbert 边际谱 2、Hilbert 边际谱和FT 变换后的幅频谱 3、EEMD 的一些问题 4、利用

end

for i=750:850

b1(i)=0.2*sin(t2(i));

end

x=a1+b1; %x 是原信号

subplot(311);plot(t,a1);

subplot(312);plot(t,b1);

subplot(313);plot(t,x);

plot(x)

imf=emd(x);

emd_visu(x,t,imf)

%eemd

imf_eemd=eemd(x,0.1,100);

figure

subplot(511);plot(imf_eemd(:,1))

subplot(512);plot(imf_eemd(:,2))

subplot(513);plot(imf_eemd(:,3))

subplot(514);plot(imf_eemd(:,4))

subplot(515);plot(imf_eemd(:,5))

figure

subplot(511);plot(imf_eemd(:,6))

subplot(512);plot(imf_eemd(:,7))

subplot(513);plot(imf_eemd(:,8))

subplot(514);plot(imf_eemd(:,9))

subplot(515);plot(imf_eemd(:,10))

原信号:

Page 9: Hilbert 边际谱 - pudn.comread.pudn.com/downloads495/doc/2060452/HHT.pdf · 1、Hilbert 边际谱 2、Hilbert 边际谱和FT 变换后的幅频谱 3、EEMD 的一些问题 4、利用

EMD:

EEMD:

Page 10: Hilbert 边际谱 - pudn.comread.pudn.com/downloads495/doc/2060452/HHT.pdf · 1、Hilbert 边际谱 2、Hilbert 边际谱和FT 变换后的幅频谱 3、EEMD 的一些问题 4、利用

感觉 EEMD 的第二项为什么会是频率这么高?和 EMD 差距这么大?是不是我程序有问题?哪位高手请赐教,不胜感

激!

答:我认为第二项应该是随机噪声造成的

虽然集总平均理论上为 0

但是毕竟是有限次平均逼近

存在的残余也很正常

我仔细分析了下

图中第一项是信号本身

第二项是残余噪声(随机噪声一般是高频)

第三项是仿真信号中的 b1

……不过这个分解结果于我来看还是不理想

待分解信号中断正弦信号最后没在一个 IMF 分量中

在没有噪音干扰的情况下,采用 EMD 得到的分解图可以说是正确的。我看到一些文献,总是认为 EMD 分解就是

从高频向低频的分解,实际而言,这种理解是对 EMD 分解得到单分量 IMF 的一种误解。如果采用瞬时频率去描述

单分量信号,我认为是指信号在某一时刻仅存在一个频率成分。所以对于原信号而言,[0 250]、[350 750]与[850 1000]

区间内的信号只含有 10Hz 的低频正弦信号,所以在 EMD 分解过程中,这些信号成分应该与 100Hz 的高频成分一

起出现在第一层 IMF 中。第二层 IMF 中理论上就剩下其余区间内的 10Hz 正弦信号,但由于 EMD 分解过程的一些

固有缺陷性,才会出现 IMF 中波形失真等问题。

对于 EEMD,其实际上是利用人为所加的高斯白噪声,来弥补由于频率间断造成的信号间断。由于高斯白噪声

的频率遍布于通频带,这样就相当于原本 EMD 分解第一层和第二层的那三个区间的正弦信号相对于比其频率更高

的噪声频带而言,要远离 100Hz 的正弦信号,所以从图像上就感觉 EEMD 解决了所谓的“模态混叠”现象,而实际

上与 EMD 结果区别的部分是被白噪声取代。

4、利用 instfreq 函数求取瞬时频率时出现的问题

Page 11: Hilbert 边际谱 - pudn.comread.pudn.com/downloads495/doc/2060452/HHT.pdf · 1、Hilbert 边际谱 2、Hilbert 边际谱和FT 变换后的幅频谱 3、EEMD 的一些问题 4、利用

最近利用 HHT 做突变检测,遇到了如下问题:

首先根据定义求取的瞬时频率:

s1=hilbert(imf(1,:));

s2(:,1)=s1(1,:);

instphase=angle(s2);

unwrapinstphase=unwrap(instphase);

instanglefrequency=diff(unwrapinstphase);

realistfre=instanglefrequency/(2*pi);

利用函数直接求取的瞬时频率

int=instfreq(s2);

figure(1);

subplot(2,1,1);

plot(realistfre);

title('自己定义的瞬时频率');

subplot(2,1,2);

plot(inp);

title('老外定义的瞬时频率');

结果如下:

为什么会出现负频率现象,根据 HHT 理论,IMF 满足窄带信号且是单分量信号,利用解析信号法求取瞬时频率应该

不会有负频率,我查看了那个 instfreq 函数,是将相位的差分取了绝对值,当然不会出现负值,可是我不知道这

是什么含义,而且它难道不会影响原信号的频谱特征吗?希望大家能够帮忙!

答:看了几天的文献,终于搞明白了情况,下面和大家说一下,基本上做完 EMD 分解后,剩下的就是如何得到瞬

时频率了,HUANG 最一开始是由解析信号法即希尔伯特变换来求取瞬时频率的,由于频率的定义是由相位的导数

来定义的,那必然是非常精确地,也就产生了一个问题,它对噪音是十分敏感的,我们通常利用差商来代替偏导数

必然会造成精度的缺失,我一开始利用一阶向后差分来代替偏导数,这样出现的问题就是必须要求相位是严格递增

的(解析信号的相位曲线是严格递增的,大家可以从相位曲线上看出来),注意是严格递增,也就是说,中间有噪

Page 12: Hilbert 边际谱 - pudn.comread.pudn.com/downloads495/doc/2060452/HHT.pdf · 1、Hilbert 边际谱 2、Hilbert 边际谱和FT 变换后的幅频谱 3、EEMD 的一些问题 4、利用

音影响的情况下,那么也会出现后一个值大于前一个的情况,这种情况下就会出现负频率,所以解决的办法就是提

高差分的精度,利用高阶差分,这样会利用到周伟多数的点,也就避免了这种情况。当然瞬时频率的求法有很多种,

解析相位法只是其中一种,HUANG 已经发明了一种不利用希尔伯特变换来求取瞬时频率的方法,我就不再这复述

了,希望大家利用某种数学手段分析问题的时候能够多考虑原因,

樓主所說的 Huang 得到瞬時頻率的方法

在 Huang, N. E., Z. Wu, S. R. Long, K. C. Arnold, X. Chen and K. Blank (2009), On instantaneous frequency, Advance in

Adaptive Data Analysis . Vol.1, No.2. 177-229.

是使用正規化的的方式處理 IMF,不用做 HT

5、完整的 EMD分解全过程,有 Hilbert谱和边际谱%示例程序

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=emd(data); %对输入信号进行 EMD 分解

[A,f,t]=hhspectrum(imf); %对 IMF 分量求取瞬时频率与振幅:A:是每个 IMF 的振幅向量,f:每个 IMF 对应的

瞬时频率,t:时间序列号

[E,t,Cenf]=toimage(A,f); %将每个 IMF 信号合成求取 Hilbert 谱,E:对应的振幅值,Cenf:每个网格对应的

中心频率 这里横轴为时间,纵轴为频率

%即时频图(用颜色表示第三维值的大小)和三维图(三维坐标系:时间,中

心频率,振幅)

cemd_visu(data,1:length(data),imf); %显示每个 IMF 分量及残余信号--------------------------------------------

disp_hhs(E); %希尔伯特谱----------------------------------------------------------

%画出边际谱

%N=length(Cenf);%设置频率点数 %完全从理论公式出发。网格化后中心频率很重要,大家从连续数据变为离散的

角度去思考,相信应该很容易理解

for k=1:size(E,1)

bjp(k)=sum(E(k,:))*1/fs;

end

figure(3);

plot(Cenf(1,:)*fs,bjp); % 作边际谱图 进行求取 Hilbert 谱时频率已经被抽样成具有一定窗长的离散频率,所以此时

的频率轴已经是中心频率

xlabel('频率 / Hz');

ylabel('幅值');

分解后的 IMF

Page 13: Hilbert 边际谱 - pudn.comread.pudn.com/downloads495/doc/2060452/HHT.pdf · 1、Hilbert 边际谱 2、Hilbert 边际谱和FT 变换后的幅频谱 3、EEMD 的一些问题 4、利用

希尔伯特谱

边际谱

Page 14: Hilbert 边际谱 - pudn.comread.pudn.com/downloads495/doc/2060452/HHT.pdf · 1、Hilbert 边际谱 2、Hilbert 边际谱和FT 变换后的幅频谱 3、EEMD 的一些问题 4、利用

Hilbert 谱主要是观察频率随时间的变化规律,以及能量的相对变化,而且这个 HILBERT 谱的幅值是对颜色进行归

一化后的值,颜色的相对变化来看出它的相对高低变化的,所以你说的值并不是它的原始幅值,

6、调频信号,HHT和 fft哪个正确?对于信号:

clear

fs=1;

N=1000;

t=0:fs:(N-1)*fs;

x1=sin(3*t);

x2=cos(0.5*t+cos(0.05*t));

x3=sin(0.06*t);

Page 15: Hilbert 边际谱 - pudn.comread.pudn.com/downloads495/doc/2060452/HHT.pdf · 1、Hilbert 边际谱 2、Hilbert 边际谱和FT 变换后的幅频谱 3、EEMD 的一些问题 4、利用

x=x1+x2+x3;

HHT 边际谱如下:

fft 如下:

HHT 和 fft 哪个正确?

为什么 HHT 边际谱调频段(即 x2)的最大幅值分布在两端?

Page 16: Hilbert 边际谱 - pudn.comread.pudn.com/downloads495/doc/2060452/HHT.pdf · 1、Hilbert 边际谱 2、Hilbert 边际谱和FT 变换后的幅频谱 3、EEMD 的一些问题 4、利用

你的想法是从 fft 出发,这样 fft 肯定是正确的,但是我觉得真正的频率应该是相位对时间求导即

d(0.5t+cos(0.05t))/dt=0.5+0.05sin(0.05t)的连续频带

答:我觉得你的边际谱好像不对,调频信号它的频率是随着时间变化,它的能量应该集中在载波频率的周围。而不

应该是分布在二边。你的求边际谱的程序可能有问题。

答:HHT 边际谱中的频率与傅立叶分析中的频率意义完全不同。在傅立叶表达中,在某一频率 W 处能量的存在,

代表一个正弦或余弦波在整个时间长度上都存在。HHT 中,在某一频率 W 处能量的存在,仅代表在数据的整个时

间长度上,很可能有这样一个频率的振动波在局部出现过。

因为 HHT 和 FFT 中频率的定义不同,出现上述差异是正常的。

HHT 边际谱是 HHT 时频谱对时间的积分,出现“为什么 HHT 边际谱调频段(即 x2)的最大幅值分布在两端?”这一问

题,可以借助正弦信号概率分布密度函数出现类似情况来理解。

如有甚么问题,可以发信给我:[email protected]

我很少上网,一般 mail 都会回复的

答:边际谱从统计意义上表示了整组数据每个频率点的积累幅值分布,而傅立叶谱的某点幅值表示在整个信号里有

一个含有此频率的三角函数组分,而且幅值越大只是说明在整个数据段上,局部存在的可能性越大。

再看得到的图形,FFT 表示的是整个数据中,能量在一个频率上分布的可能性地描述,而边际谱表示在在每一个

频率上幅值的积累,如果想知道具体时间那么就看 HHT 谱,这个时间-幅值-频率的三维谱。

说到瞬时频率,傅立叶变换不强调局部性,而是强调全局性。咱们的 HHT 才提出一个唯一的瞬时频率的定义。因此

拿瞬时频率来衡量傅立叶变换也是不公平的。

答:t=[0:1/10000:1];s=cos(10*pi*t)+2*cos(40*pi*t);imf 分量图和时频图如下,时频图中的频率对应的还是对的,第一

幅对应的是 20Hz,第二幅是 5Hz。

imf 分量图

时频图

Page 17: Hilbert 边际谱 - pudn.comread.pudn.com/downloads495/doc/2060452/HHT.pdf · 1、Hilbert 边际谱 2、Hilbert 边际谱和FT 变换后的幅频谱 3、EEMD 的一些问题 4、利用

l=length(s);

a=size(c);

b=a(1);

for m=1:b

H(m,:)=hilbert(c(m,:));

x(m,:)=real(H(m,:));

y(m,:)=imag(H(m,:));

fi(m,:)=atan(y(m,:)./x(m,:));

g(m,:)=szwf(fi(m,:),t);

f(m,:)=g(m,:)./(2*pi);

subplot(b,1,m);

plot(t,f(m,:));

Page 18: Hilbert 边际谱 - pudn.comread.pudn.com/downloads495/doc/2060452/HHT.pdf · 1、Hilbert 边际谱 2、Hilbert 边际谱和FT 变换后的幅频谱 3、EEMD 的一些问题 4、利用

xlabel('t(s)');

ylabel('freq(hz)')

title('时频图');

end

这个是做完 emd 分解后,根据 IMF 分量作出的,就是根据我看得论文中时频图的做法,求出瞬时频率做出的。流程

是先进行 hilbert 变换(直接调用的),再求其虚部和实部之比的反正切,再求数值微分(这个程序是自己编的,

经验证还算可以),最后得出时频图。

求出的相位要解卷绕后,才能进行数值微分。解卷绕是求相位时用 angle 再 unwrap 就可以了。你作的那个图不能

叫时频图,没有反映幅值信息,应该叫瞬时频率图。

zhangnan3509 做的那个才是时频图。

7、边际谱和 HHT 谱的 Matlab 例子

看到版上总有人在问边际谱和 HHT 谱的画法,又搜索了一下,好像没有这方面的主题帖子,就发两个以前写的小

程序,权作抛砖引玉吧。

% 边际谱与 FFT 比较

clear

T = 1; % 仿真时间

f1 = 15.2;

f2 = 40;

fs = 1000; % 采样率

N = T*fs;

n = 1:N;

s = sin(2*pi*f1/fs*n) + sin(2*pi*f2/fs*n);

s_fft = abs(fft(s))/N;

imf = emd(s);

[A, fa, tt] = hhspectrum(imf);

[E, tt1] = toimage(A,fa,tt,length(tt));

for k=1:size(E,1)

bjp(k) = sum(E(k,:))*1/fs*1/T;

end

f = (0:N-3)/N*(fs/2);

figure(1);

plot(f,bjp);

xlabel('频率 / Hz');

ylabel('幅值');

figure(2);

plot(0:fs/N:fs/2-fs/N, s_fft(1:end/2))

% 实际信号的 HHT 谱和边际谱

Page 19: Hilbert 边际谱 - pudn.comread.pudn.com/downloads495/doc/2060452/HHT.pdf · 1、Hilbert 边际谱 2、Hilbert 边际谱和FT 变换后的幅频谱 3、EEMD 的一些问题 4、利用

clear

rand('seed', 0);

T = 0.01; % 仿真时间

R = 5000; % 码速率

fd = 10000; % 载波频差

fc = 20000; % 载波频率

fs = 200000; % 采样率

samp = fs/R; % 每个码元上的采样点数

N = T*fs;

n = 1:N;

x = randint(1, R*T, 2);

y = fskmod(x, 2, fd, samp, fs);

y = y .* exp(i*2*pi*fc/fs*n);

y = real(y);

% z = awgn(y, 20, 'measured');

z = y;

imf = emd(z);

[A, fa, tt] = hhspectrum(imf);

if size(imf,1) > 1

[A,fa,tt] = hhspectrum(imf(1:end-1, :));

else

[A,fa,tt] = hhspectrum(imf);

end

[E, tt1] = toimage(A,fa,tt,length(tt));

disp_hhs(E, tt1);

% 使用灰度图显示

% colormap(gray(255))

for k = 1:size(E,1)

bjp(k) = sum(E(k,:))*1/fs*1/T;

end

f = (0:N-3)/N*(fs/2);

figure(2);

plot(f, bjp);

答:我用 g.rilling 的程序对自己的信号分析了下,感觉做出的 hht 谱有些奇怪,好像不对,那跟我的原始信号很相

似,上传麻烦您给看下。后面又用你给的程序做出了边际谱,也不知道对不对,也上传给你看下,感觉我的边际谱

很乱。我的数据也在附件里附上了。另外最后一张图,是我之前用 plot_hht 的程序做出的时频图也上传过来看下。

hht 谱图

Page 20: Hilbert 边际谱 - pudn.comread.pudn.com/downloads495/doc/2060452/HHT.pdf · 1、Hilbert 边际谱 2、Hilbert 边际谱和FT 变换后的幅频谱 3、EEMD 的一些问题 4、利用

边际谱

plot_hht 程序做的时频图

Page 21: Hilbert 边际谱 - pudn.comread.pudn.com/downloads495/doc/2060452/HHT.pdf · 1、Hilbert 边际谱 2、Hilbert 边际谱和FT 变换后的幅频谱 3、EEMD 的一些问题 4、利用

8、关于 hilbert谱图的问题请教:为什么我画的 Hilbert 谱的二维图颜色条显示都是负数呢?之前用另外一个程序画的图也是这样的.程序在附

件中给出

答:原因很簡單啊…help disp_hhs 就知道答案了…

Page 22: Hilbert 边际谱 - pudn.comread.pudn.com/downloads495/doc/2060452/HHT.pdf · 1、Hilbert 边际谱 2、Hilbert 边际谱和FT 变换后的幅频谱 3、EEMD 的一些问题 4、利用

因為圖中的數值皆除以最大值,而後取 dB 值

數值變小,當然 dB 值會是負值。

9、总体经验模态分解(EEMD)、Fourier 变换、HHT

EEMD 实际就是噪声分析法和 EMD 方法的结合,抑制模态混叠。

Fourier 变换是将任何信号分解为正弦信号的加权和,而每一个正弦信号对应着一个固定的频率(Fourier 频率)和固定

的幅值,因此,用 Fourier 变换分析频率不随时间变化的平稳信号是十分有效的。但对于频率随时间变化的非平稳信

号,Fourier 变换就无能为力了。

HHT 是历史上首次对 Fourier 变换的基本信号和频率定义作的创造性的改进。他们不再认为组成信号的基本信号是

正弦信号,而是一种称为固有模态函数的信号,也就是满足以下两个条件的信号: (1) 整个信号中,零点数与极点数相

等或至多相差 1 ; (2) 信号上任意一点,由局部极大值点确定的包络线和由局部极小值点确定的包络线的均值均为零,

即信号关于时间轴局部对称。

无论 Hilbert 谱中的频率还是边际谱中的频率(即瞬时频率) ,其意义都与 Fourier 分析中的频率(即 Fourier 频率) 完全

不同,但在 Fourier 分析中,某一频率处能量的存在,代表一个正弦或余弦波在整个时间轴上的存在,而边际谱 h 中某一

频率处能量的存在仅代表在整个时间轴上可能有这样一个频率的振动波在局部出现过,h 越大,代表该频率出现的可

能性越大。

10、HHT时频灰度谱转黑白谱

MATLAB 作 HHT 时频谱时出来的是彩色的时频图。请问有办法在 MATLAB 上面将彩色谱图调成白色底黑色线的黑白图

吗?哎,因为老师说彩色图普通印出来的话不好看,一片黑的,谢谢大家啊

答:后面加上这个就可以了 colormap(flipud(gray))

[A,f,tt]=hhspectrum(imf); %HHT 时频谱计算

[im,tt]=toimage(A,f,tt,length(tt));

%im=flipud(im);

disp_hhs(im,[],fs); %HHT SPEC

colormap(flipud(gray)); % 黑白显示

11、HHT 谱图怎么会这样呢?

Page 23: Hilbert 边际谱 - pudn.comread.pudn.com/downloads495/doc/2060452/HHT.pdf · 1、Hilbert 边际谱 2、Hilbert 边际谱和FT 变换后的幅频谱 3、EEMD 的一些问题 4、利用

小弟刚刚接触 HHT,也不是学信号的,只是用 HHT这个工具处理信号,在处理过程中遇到了这样的问题:

对实测信号直接 EMD,然后作 HHT谱图如下:

然而对于实测信号的分析首先是要进行去噪处理的,我就试着去掉了两个高频 IMF,然后作 HHT谱图如下:

Page 24: Hilbert 边际谱 - pudn.comread.pudn.com/downloads495/doc/2060452/HHT.pdf · 1、Hilbert 边际谱 2、Hilbert 边际谱和FT 变换后的幅频谱 3、EEMD 的一些问题 4、利用

为什么在去噪之后的 HHT谱中高频部分出现了很强烈的振幅,而去噪之前是没有的?请帮帮忙指点小弟该怎么做,

谢谢大家!

测得信号直接求边际谱:

去掉两个高频 IMF 后的边际谱:

Page 25: Hilbert 边际谱 - pudn.comread.pudn.com/downloads495/doc/2060452/HHT.pdf · 1、Hilbert 边际谱 2、Hilbert 边际谱和FT 变换后的幅频谱 3、EEMD 的一些问题 4、利用

为什么会这样呢?去掉高频 IMF 反倒在高频的地方出现了幅值!同样的程序,难道是我去高频的时候出错了?

我去高频是直接相加的:IMF1=imf(3,:)+imf(4,:)+imf(5,:)+imf(6,:)+imf(7,:)+imf(8,:)+imf(9,:)+imf(10,:);

[A,fa,tt]=hhspectrum(IMF1);

还是因为非正交性而不能直接相加?

搞不懂?

答:楼主你的程序“IMF1=imf(3,:)+imf(4,:)+imf(5,:)+imf(6,:)+imf(7,:)+imf(8,:)+imf(9,:)+imf(10,:);”不对。

用这个语句后 IMF1 只有一行了。这样你再进行边际谱分析肯定不对。

建议修改如下:

for i=3:10

IMF1(i-2,:)=imf(i,:);

end

谢谢了,这样是对的,太感谢了。

12、HHT 三维图

利用这段程序可以画出 HHT 三维图,但是能量是以颜色标记的,如何做出能量以幅值表示的真正的三维图呢?

imf=emd(z); %z 为原始信号;

emd_visu(z,1:length(z),imf)

[A,f,tt]=hhspectrum(imf);

[im,tt]=toimage(A,f);

disp_hhs(im);

colormap(flipud(gray))

13、对一实测信号的处理

这段时间做一些谱分析方面的数据处理,主要进行了滤波平滑、去趋势项、FFT、STFT 和 Hilbert-Huang

变换等,希望大家能够不吝赐教,提出宝贵意见,参与讨论,相互学习,以期起到抛砖引玉的作用。

结合一桥梁上实测位移信号进行分析,采样频率为 5Hz,信号长度 600 秒,计 3000 个采样点,其处

理过程及各步的结果如下:

Page 26: Hilbert 边际谱 - pudn.comread.pudn.com/downloads495/doc/2060452/HHT.pdf · 1、Hilbert 边际谱 2、Hilbert 边际谱和FT 变换后的幅频谱 3、EEMD 的一些问题 4、利用

1. 滤波平滑。采用 Vondrak 滤波法处理,削弱噪声的影响。

2.消除信号趋势项。通过二阶多项式最小二乘拟合消除其趋势项,拟合多项式的阶数可以根据数据

中的长周期信号情况再取高一些。

3. 对去趋势项后的结果进行FFT计算。FFT结果中,最高谱线对应频率为0.07833Hz,幅值为0.01999;

次最高谱线在其左边,频率为 0.07667Hz,幅值为 0.01346。采用一种代数法进行频谱校正,得校正

Page 27: Hilbert 边际谱 - pudn.comread.pudn.com/downloads495/doc/2060452/HHT.pdf · 1、Hilbert 边际谱 2、Hilbert 边际谱和FT 变换后的幅频谱 3、EEMD 的一些问题 4、利用

后频率为 0.0777Hz。计算过程为 0.07833-0.01346*5/(0.01346+0.01999)/3000=0.0777Hz

4. EMD 分解。效果还是不错的,信号两端也没有出现明显的端部效应,第二个 IMF 以后的幅值太小,

可以忽略。

5. 计算边际谱。FFT 频谱校正后频率与边际谱频率吻合较好,差值为 0.0002Hz,相对误差为

(0.0777-0.0775)/0.0775=0.26%。对于该类型信号,若考虑 FFT 频率校正,那么边际谱和 FFT 结果均

Page 28: Hilbert 边际谱 - pudn.comread.pudn.com/downloads495/doc/2060452/HHT.pdf · 1、Hilbert 边际谱 2、Hilbert 边际谱和FT 变换后的幅频谱 3、EEMD 的一些问题 4、利用

比较理想。

6. 短时傅里叶分析。基本上能够反映信号的频率和能量分布情况,但是能量小的信号效果不理想

(0~190s)。

7. Morlet 小波谱。由于其计算量太大,这里取 150s 到 354.6s 共计 1024 个采样点计算。从该图可

以看出,从 150s 到 190s 的频率也显示出来了,相对于 STFT 来说,它对于弱小能量信号有更强的识

Page 29: Hilbert 边际谱 - pudn.comread.pudn.com/downloads495/doc/2060452/HHT.pdf · 1、Hilbert 边际谱 2、Hilbert 边际谱和FT 变换后的幅频谱 3、EEMD 的一些问题 4、利用

别能力,这是由小波本身的特点所决定的,它对微弱信号有较强的探测能力。

8. Hilbert-Huang 变换。显然,相对于 STFT 和小波谱其结果精细得多,而且在能量较小时也表现得

相当出色。

----END----

答 1: 在“6. 短时傅里叶分析”中,谱图中的幅值是线性值,所以能量小的信号不易看到;如果把幅值用对数表示,

则小信号部分也能看到了。

有道理!这样低频、长周期信号就反映得更清晰。

Page 30: Hilbert 边际谱 - pudn.comread.pudn.com/downloads495/doc/2060452/HHT.pdf · 1、Hilbert 边际谱 2、Hilbert 边际谱和FT 变换后的幅频谱 3、EEMD 的一些问题 4、利用

我把数据发上来,有兴趣的可以算一算,讨论一下。谢谢

数据文件为 dispy.mat(其中,yy为横向位移,t为时间向量),在 Matlab 中 load dispy 即可。

STFT 中如何把颜色深度改成 log?

LZ 在做 STFT 时可能直接用:

tfrstft(yy)

可以设置为:

n2=1:1500;

h=hamming(1023);

[S,tt,f]=tfrstft(yy,1:N,N,h);

imagesc(tt/fs,f(n2)*fs,10*log10(abs(S(n2,:))));

axis xy; ylim([0 0.3]);

这样做出的图幅值是取对数的。

答 2:我没有滤波,直接用 EMD 分解,然后对 imf1 和 imf2 取 fft。得到的图,除了在 0.078HZ 外,在 0.05 也有。

不过 0.05 能量相对较小,如果取阈值应该是看不到了。如图。

Page 31: Hilbert 边际谱 - pudn.comread.pudn.com/downloads495/doc/2060452/HHT.pdf · 1、Hilbert 边际谱 2、Hilbert 边际谱和FT 变换后的幅频谱 3、EEMD 的一些问题 4、利用

这是用 WVD 处理后的结果。

Page 32: Hilbert 边际谱 - pudn.comread.pudn.com/downloads495/doc/2060452/HHT.pdf · 1、Hilbert 边际谱 2、Hilbert 边际谱和FT 变换后的幅频谱 3、EEMD 的一些问题 4、利用

14、emd方法的几点不明的解答问题:

1. 分量 c1,c2,c3...cn 分别包含了从高到低不同的频率断,每一段频率成分是不同的,而且随信号 x(t)变换而变

化,rn 则表示了信号 x(t)的中心趋势

对于这句话 有点不解 c1 c2...cn是不是严格按照频率从高 到低, 而且rn说表示中心趋势 我看有的说误差 看

来应该是分情况而定的把??

2. 对于黄的程序 暂时我没有仔细研读啊 ,不知道他在对于 emd 缺点改进方面作了那些工作,此程序在对于 emd 的

改进如何,更确切的说 这个程序的可用度如何, 更适合分析甚么信号!

通过看imf定义,可以看到 它对于具有调幅和调频的信号 对称信号 处理应该是比较不错的,但是实际信号 比如地

震信号 时域波形应该畸变 不是标准的正弦波 或者于弦 ,而我门在举例子的时候 都倾向于 举一标准的正于弦

或者 调幅 调频,如果举噪声的例子,结果又会怎么样那??

3. 对于现在搞 emd 的都在对黄的程序,在改进 ,结果也出了不少文章 ,在故障诊断这块 ,作的不错的 湖南大学于

老师 在机械系统与信号处理 发过3-4篇 文章, 算法作了改进 ,主要故障设计 齿轮 和轴承 ,这些信号 大家都清

楚 出现调幅调频的几率比较达大,处理起来效果应该还可以,但是对于别的故障,不知道大家有没有试验过,如果转

速变化比较大,所采集的波形波动比较大时,效果是不是还比较好呢?? 我现在还是觉得 信号略处于稳态的 处理效

果比较好些, 期待大家 讨论?

答案

1. c1 c2 ... cn 的确是严格按照频率从高到低产生的,不过这里有一个误区,其意思并不是说 c1的频率一定比

c2 的高,正确的理解是 c1中的某个局部的频率比 c2中相同局部的频率要高,这也正好反映了 EMD 算法局部性强的

本质所在,也跟黄的说法“相邻的分量可能包含相同时间尺度的振荡,但是相同时间尺度的振荡绝对不会出现在两

个不同的 IMF 分量的同一个位置”一致。至于分解过程造成的误差(主要是包络方式的选取、边界效应的处理和滤

波停止条件的设计),会不断累积到下一层分解中,并不一定是最后一个余量(趋势项)。

2.

a) 黄的源程序其实我们都没有得到(这个不是免费的,因为黄已经在 NASA 中申请了专利),一般大多数人使用的

都是 Flandrin 提供的源代码,也就是 LS提到的 G.Rilling 的方法(之所以有两种不同说法是因为网站提供的源代

Page 33: Hilbert 边际谱 - pudn.comread.pudn.com/downloads495/doc/2060452/HHT.pdf · 1、Hilbert 边际谱 2、Hilbert 边际谱和FT 变换后的幅频谱 3、EEMD 的一些问题 4、利用

码是 Flandrin 的,但是 emd.m 提到的文章是 G.Rilling 作为第一作者的,也许外国人不像我们那样通过次序来区

分贡献,呵呵)。程序基本上可靠,可以用来分析各种数据,但是效果如何,就要看是否满足你的需要了。至于适

合什么样的数据,现在还没有定论,其一,EMD 算法还没有建立一个合适的数学模型,也就缺乏严格的数学基础,

很多诸如收敛性、唯一性、正交性等数学问题根本无法进行,甚至连“什么信号能进行 EMD 分析”目前也无法解释。

其二,算法本身是操作性的,到目前为止也是经验的(正如算法的名称一样),在没有找到其理论支撑之前,无从

考究。其三,一种算法,不可能对任何信号都有效,所以不要指望 EMD 可以处理任何信号。

b) 从 IMF 的定义看的确要求 IMF 是对称的,但是这不意味着要求信号本身具有这样的特性,也并不要求信号是正

弦、余弦等的合成,我想,之所以 EMD 能引起那么多人关注,除了所谓的“传销”得当以外,更重要的是它在实际

中的表现,如果只能处理规则的信号,那么它的影响(包括好的和也许坏的)远不可能如此成功。

c) EMD 从高到低产生各 IMF 的特性就意味着它可以用来去噪,而并非在使用 EMD 之前用其他方法进行噪声处理。举

个例子吧,我这段时间做的脑功能激活区检测,本质上就是去除信号的噪声,把原始的刺激恢复出来的这么一个过

程。实现结果是很不错的,无论对于加性的服从规则分布(例如高斯分布、均匀分布等)的随机信号,还是对于乘

性的服从规则分布(我只测试了 poisson 分布)的随机信号。当然了,后者的结果当然比不上前者,不过足以超过

用于检测的传统方法。个人认为 EMD 之所以在实际中那么有效,是因为它能处理非平稳、非线性的时间序列。

3. 目前对 EMD 方法的改进分为两个方面,一个是实验层面的,另一个是理论层面的,相对来说,后者少之又少。

a) 前者主要包括是两个部分。实际上,这是大家在利用 EMD 进行信号分解时采取的一些主观规则。其一是根据对

零均值条件的主观理解,使用了不同的方法作为 IMF 滤波停止条件;其二是利用三次样条计算信号的上、下包络时,

根据信号两端的走势,使用了特定的端点延拓方法。当使用 EMD 进行非平稳和非线性信号分解时,在上述两点上使

用不同的规则将导致不同的 EMD 分解结果。2003 年 G. Rilling 等人对 Huang 的 EMD 算法进行的改进就属于第一种,

个人认为该条件比 Huang 原来的条件合理。而国内学者诸如 2001 年邓拥军等提出的神经网络方法、2003 年黄大吉

等提出的镜像闭合法和极值点延拓法以及 2004 年刘慧婷等提出的多项式拟合算法等,是属于第二种。至于这两年

的研究成果,我还没有整理,呵呵。

b) 后者主要是 2004 年谌球辉等人提出利用“滑动平均”的方法代替传统的“包络平均”的方法来求出信号的低频。

他们试图借助 B样条函数已有的良好性质来为建立 EMD 的数学基础作进一步推进。另外,2006 年初黄对 EMD 算法得

到的 IMF 提出了一个后处理算法(本质上是对 IMF 进行规范化),其目的是为了更加准确的得到瞬时频率和振幅(个

人认为这才是真正的包络和瞬时频率,来京之前我试图从局部意义上来证明这个算法的收敛性,但只得到阶段性结

果,最近听说我的一个师弟已经从全局意义上基本上证明出来了,待我回去以后再看看具体成果吧,呵呵),算法

的思想是把两者尽量分开,把调幅的影响从调频中脱离出来。该处理方法完全抛弃了 Hilbert 变换,使得瞬时频率

和瞬时振幅更加准确、更有意义

总的来说,EMD 乃至 HHT 虽然有很多缺点,但是也并非一无所用,在理论上的证明和进一步完善需要更多的关注,

而在实验中的用处就看你的需要和如何发挥它的潜力了。

15、一些有用的网址中国振动联盟 HHT 板块 http://www.chinavib.com/forum-forumdisplay-fid-47-filter-typeid-typeid-100.html

法国 Gabriel.Rilling http://perso.ens-lyon.fr/patrick.flandrin/emd.html

台湾中央大学 http://rcada.ncu.edu.tw/research1_clip_introduction.htm

Matlab 文件交换中心 http://www.mathworks.com/matlabcentral/fileexchange/21409

http://www.mathworks.com/matlabcentral/fileexchange/19681