Hilbert变换求信号的包络线及MATLAB代码

一、Hilbert变换表达式

Hilbert变换H(u)(t)是信号u(t)\frac{1}{\pi t}的卷积,表达式如下:

H(u)(t)=u(t)\ast \frac{1}{\pi t}=\frac{1}{\pi}\int_{-\infty}^{+\infty} \frac{u(\tau)}{t-\tau}d \tau

由于本质是卷积,因此可以从“线性系统”,“调幅-调频”等角度思考。进一步可参考如下链接:

  1. 希尔伯特变换(Hilbert Transform)简介及其物理意义_兔角与禅-CSDN博客_hilbert
  2. 希尔伯特变换与瞬时频率问题(一):希尔伯特变换与瞬时频率问题--连载(一) - 知乎
  3. 伯特变换与瞬时频率问题(二):希尔伯特变换和瞬时频率问题--连载(二) - 知乎
  4. 希尔伯特谱、边际谱、包络谱、瞬时频率/幅值/相位——Hilbert分析衍生方法及MATLAB实现

二、利用Hilbert变换求信号包络线 

1. 理论

截图自 Signal processing and feature extraction -- by Yaguo Lei Redirecting

Hilbert变换求信号的包络线及MATLAB代码_第1张图片

2. 理解:Hilbert变换是将信号相位延迟90°。

3. 举例:若x=sin(wt), 则,Hilbert变换后的信号为y=cos(wt)。则信号的瞬时幅值(instantaneous amplitude) |x(t))|=\sqrt{x^{2}+y^{2}}

4. 图解

如下图x(t)为原信号,\widetilde x (t)为Hilbert变换,A(t)是包络线。

Hilbert变换求信号的包络线及MATLAB代码_第2张图片

5. 进一步解释

(1)知乎讨论:希尔伯特变换将信号表示为复解析信号的物理意义是什么? - 知乎

(2)为什么希尔伯特变换可以求包络? - 知乎  -- 该内容截图如下

Hilbert变换求信号的包络线及MATLAB代码_第3张图片

Hilbert变换求信号的包络线及MATLAB代码_第4张图片

 三、MATLAB代码

1. MATLAB代码理解

matlab中hilbert(x)的结果为下图中的复平面向量,是个复数,同时包含实部和虚部。所以,包络函数=abs(hilbert(x))。

Hilbert变换求信号的包络线及MATLAB代码_第5张图片

2. MATLAB官方解释 Hilbert Transform- MATLAB & Simulink

Hilbert变换求信号的包络线及MATLAB代码_第6张图片

3. MATLAB 中文论坛 -- 关于利用HILBERT变换和插值求包络线的讨论:

matlab中怎么从一个信号中取出包络? – MATLAB中文论坛

4. 代码和图

clc
clear
close all
% 利用Hilbert变换求包络线
fs=30;
t=0:1/fs:200; 
x6=sin(2*pi*2*t)+sin(2*pi*4*t);
x66 = hilbert(x6);
xx = abs(x66);
figure(1)
hold on
plot(t,x6);
plot(t,xx,'r')
xlim([0 5])
hold off

% 选取局部最大值,然后进行插值
d = diff(x6);
n = length(d);
d1 = d(1:n-1);
d2 = d(2:n);
indmin = find(d1.*d2<0 & d1<0)+1;
indmax = find(d1.*d2<0 & d1>0)+1;
envmin = spline(t(indmin),x6(indmin),t);
envmax = spline(t(indmax),x6(indmax),t);
figure
hold on
plot(t,x6);
plot(t,envmin,'r');
plot(t,envmax,'m');
hold off
xlim([0 5])

代码结果:

Hilbert 包络线

Hilbert变换求信号的包络线及MATLAB代码_第7张图片

局部最大值+插值 包络线

Hilbert变换求信号的包络线及MATLAB代码_第8张图片

思考:

注意经验模态分解(Empirical Mode Decomposition)与Hilbert变换的关系!!!

利用Hilber变换得到的包络线是否合理???

你可能感兴趣的:(MATLAB,Signal,Processing,matlab,开发语言)