希尔伯特-黄变换说明及程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

质模态函数(IMF)

任何一个资料,满足下列两个条件即可称作本质模态函数。

⒈局部极大值(local maxima)以及局部极小值(local minima)的数目之和必须与零交越点(zero crossing)的数目相等或是最多只能差1,也就是说一个极值后面必需马上接一个零交越点。

⒉在任何时间点,局部最大值所定义的上包络线(upper envelope)与局部极小值所定义的下包络线,取平均要接近为零。

因此,一个函数若属于IMF,代表其波形局部对称于零平均值。此类函数类似于弦波(sinusoid-like),但是这些类似于弦波的部分其周期与振幅可以不是固定。因为,可以直接使用希尔伯特转换,求得有意义的瞬时频率。

经验模态分解(EMD)

EMD算法流程图

建立IMF是为了满足希尔伯特转换对于瞬时频率的限制条件之前置处理,也是一种转换的过程。我们将IMF来做希尔伯特转换可以得到较良好的特性,不幸的是大部分的资料并不是IMF,而是由许多弦波所合成的一个组合。如此一来,希尔伯特转换并不能得到正确的瞬时频率,我们便无法准确的分析资料。为了解决非

线性(non-linear)与非稳态(non-stationary)资料在分解成IMF时所遇到的困难,便发展出EMD。

经验模态分解是将讯号分解成IMF的组合。经验模态分解是借着不断重复的筛选程序来逐步找出IMF。

以讯号为例,筛选程序的流程概述如下:

步骤 1 : 找出中的所有局部极大值以及局部极小值,接着利用三次样条

(cubic spline),分别将局部极大值串连成上包络线与局部极小值串连成下包络线。

步骤 2 : 求出上下包络线之平均,得到均值包络线。

步骤 3 : 原始信号与均值包络线相减,得到第一个分量。

步骤 4 : 检查是否符合IMF的条件。如果不符合,则回到步骤1并且将

当作原始讯号,进行第二次的筛选。亦即

重复筛选次

直到符合IMF的条件,即得到第一个IMF分量,亦即

步骤 5 : 原始讯号减去可得到剩余量,表示如下式

步骤 6 : 将当作新的资料,重新执行步骤1至步骤5,得到新的剩余量

。如此重复次

.

.

.

当第个剩余量已成为单调函数(monotonic function),将无法再分解IMF 时,整个EMD的分解过程完成。原始讯号可以表示成个IMF分量与一个平均趋势(mean trend)分量的组合,亦即

如此一来,原始资料便分解成n个IMF和一个趋势函数,我们便可将IMF做希尔伯特转换来进行瞬时频率的分析。

结论

傅立叶变换是将一个讯号分解成无限多个弦波来分析资料,但是希尔伯特-黄转换则是将一个讯号分解成数个近似于弦波的讯号(周期、振幅不固定)和一个趋势函数来做分析。

两者各有其优缺点,整理如下

优点:

1.避免复杂的数学运算

2.可分析频率会随时间变化的讯号

3.较适于分析气候、经济等具有趋势的资料

4.可以找出一个函数的趋势

缺点:

1.缺乏严谨的物理意义

2.需要复杂的递回,运算时间反而比短时距傅立叶变换要长

3.希尔伯特转换未必能正确计算出本质模态函数之瞬时频率

4.无法使用快速傅立叶变换

5.只有在特例(组合较简单的资料)时使用希尔伯特-黄转换较快

2.Matlab代码

/matlabcentral/fileexchange/19681

2.1 EMD分解代码(emd.m)

function imf = emd(x)

% Empiricial Mode Decomposition (Hilbert-Huang Transform) % imf = emd(x)

% Func : findpeaks

x = transpose(x(:));

imf = [];

while ~ismonotonic(x)

x1 = x;

sd = Inf;

while (sd > 0.1) | ~isimf(x1)

s1 = getspline(x1);

s2 = -getspline(-x1);

x2 = x1-(s1+s2)/2;

sd = sum((x1-x2).^2)/sum(x1.^2);

x1 = x2;

end

imf{end+1} = x1;

x = x-x1;

end

imf{end+1} = x;

% FUNCTIONS

function u = ismonotonic(x)

u1 = length(findpeaks(x))*length(findpeaks(-x));

if u1 > 0, u = 0;

else, u = 1; end

function u = isimf(x)

N = length(x);

u1 = sum(x(1:N-1).*x(2:N) < 0);

u2 = length(findpeaks(x))+length(findpeaks(-x));

if abs(u1-u2) > 1, u = 0;

else, u = 1; end

function s = getspline(x)

N = length(x);

p = findpeaks(x);

s = spline([0 p N+1],[0 x(p) 0],1:N);

2.2 找极值代码(findpeaks.m)

function n = findpeaks(x)

% Find peaks.

% n = findpeaks(x)

n = find(diff(diff(x) > 0) < 0);

u = find(x(n+1) > x(n));

n(u) = n(u)+1;

2.3 绘制时-频曲线以及尺度分解代码(plot_hht.m)

function plot_hht(x,Ts)

% Plot the HHT.

% plot_hht(x,Ts)

% Ts :time interval (sec)

% :: Syntax

% The array x is the input signal and Ts is the sampling period.

% Func : emd

% Get HHT.

imf = emd(x);

for k = 1:length(imf)

b(k) = sum(imf{k}.*imf{k});

th = angle(hilbert(imf{k}));

d{k} = diff(th)/Ts/(2*pi);

end

[u,v] = sort(-b);

b = 1-b/max(b);

相关文档
最新文档