希尔伯特黄变换算例2

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

电力工程信号处理应用

希尔伯特黄变换

【目的】

1.了解希尔伯特黄变换的理论知识及应用领域

2.用Matlab软件仿真,验证希尔伯特黄变换的优点

【希尔伯特黄变换】

希尔伯特黄变换(Hilbert-Huang transform, HHT)首先采用EMD方法将信号分解为若干个IMF分量之和,然后对每个IMF分量进行Hilbert变换得到的瞬时频率和瞬时幅值,从而得到信号的Hilbert谱,Hilbert谱表示了信号完整的时间-频率分布,是具有一定的自适应的时频分析方法。与前面的小波分析方法相比,避免了小波分析基选取的困难。分析非线性、非平稳信号采用基于经验模态分解的HHT方法可以较好地分析信号的局域动态行为和特征。

由于HHT方法的种种特点,其在机械振动、生物医学、故障诊断、海洋学科、地震工程学以及经济学各学科中得到了广泛应用。在电力系统领域中,HHT方法可用于谐波分析、同步电机参数辨识、低频震荡分析、电能质量检测、磁铁谐振过电压辨识等方面和超高速方向保护等方面。HHT方法在电力系统中的应用还在进一步的研究和探索中。

【EMD 分解】

对于一个时间序列()x t ,其经验模态分解过程如下: (1) 确定原始信号()x t 的所有极大值点和极小值点;

(2) 采用样条函数求出()x t 的上、下包络线,并计算均值()m t ; (3) 做差()()()h t x t m t =-;

(4) ()h t 是否满足终止条件,若不满足将()h t 作为新的输入信号转至第(1)

步,否则转为第(5)步;

(5) 令()c h t =,c 即为一个IMF 分量,做差()r x t c =-;

(6) r 是否满足终止条件,若不满足则将r 作为新的输入信号转至第(1)步,

若满足则EMD 分解过程结束,不能提取的为残余量。具体流程如图1所示。

EMD 分解过程

图1 EMD 分解流程图

对于分解总阶数为n 的时间序列,最后可以表示成

1()()()n

i i x t c t r t ==+∑

式中,()r t 为残余函数,它是以单调函数。

【算例2】

考察两个函数

112sin(250)sin(2100)x A t A t ππ=∙∙+∙∙ (1) 1

22sin(250),0.1sin(2100),

0.1

A t t x A t t ππ∙∙<⎧=⎨∙∙≥⎩ (2)

编程:

[EMD 分解程序]

1. emd.m

function imf = emd(x) 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;

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.Findpesks.m

function n = findpeaks(x)

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

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

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

3.FFTAnalysis.m

function [Y, f] = FFTAnalysis(y, Ts)

Fs = 1/Ts;

L = length(y);

NFFT = 2^nextpow2(L);

y = y - mean(y);

Y = fft(y, NFFT)/L;

Y = 2*abs(Y(1:NFFT/2+1));

f = Fs/2*linspace(0, 1, NFFT/2+1);

end

function [yenvelope, yf, yh, yangle] = HilbertAnalysis(y, Ts) yh = hilbert(y);

yenvelope = abs(yh);

yangle = unwrap(angle(yh));

yf = diff(yangle)/2/pi/Ts;

end

4.pot_hht.m

function plot_hht(x,imf,Ts)

% Plot the HHT.

% :: Syntax

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

% Example on use: [x,Fs] = wavread('Hum.wav');

% plot_hht(x(1:6000),1/Fs);

% Func : emd

% imf = emd(x);

for k = 1:length(imf)

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

th = unwrap(angle(hilbert(imf{k}))); % 相位

d{k} = diff(th)/Ts/(2*pi); % 瞬时频率

end

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

b = 1-b/max(b); % 后面绘图的亮度控制

% Hilbert瞬时频率图

N = length(x);

c = linspace(0,(N-2)*Ts,N-1); % 0:Ts:Ts*(N-2)

for k = v(1:2) % 显示能量最大的两个IMF的瞬时频率

figure

plot(c,d{k});

xlim([0 c(end)]);

ylim([0 1/2/Ts]);

xlabel('Time/s')

ylabel('Frequency/Hz');

title(sprintf('IMF%d', k))

end

% 显示各IMF

M = length(imf);

N = length(x);

c = linspace(0,(N-1)*Ts,N); % 0:Ts:Ts*(N-1)

for k1 = 0:4:M-1

figure

相关文档
最新文档