一、Hilbert变换表达式
由于本质是卷积,因此可以从“线性系统”,“调幅-调频”等角度思考。进一步可参考如下链接:
- 希尔伯特变换(Hilbert Transform)简介及其物理意义
- 希尔伯特变换与瞬时频率问题(一):希尔伯特变换与瞬时频率问题--连载(一) - 知乎
- 伯特变换与瞬时频率问题(二):希尔伯特变换和瞬时频率问题--连载(二) - 知乎
- 希尔伯特谱、边际谱、包络谱、瞬时频率/幅值/相位——Hilbert分析衍生方法及MATLAB实现
二、利用Hilbert变换求信号包络线
1. 理论
截图自 Signal processing and feature extraction -- by Yaguo Lei Redirecting
2. 理解:Hilbert变换是将信号相位延迟90°。
3. 举例:若x=sin(wt), 则,Hilbert变换后的信号为y=cos(wt)。则信号的瞬时幅值(instantaneous amplitude)
。
4. 图解
如下图
为原信号,
为Hilbert变换,
是包络线。
5. 进一步解释
(1)知乎讨论:希尔伯特变换将信号表示为复解析信号的物理意义是什么? - 知乎
(2)为什么希尔伯特变换可以求包络? - 知乎 -- 该内容截图如下
三、MATLAB代码
1. MATLAB代码理解
matlab中hilbert(x)的结果为下图中的复平面向量,是个复数,同时包含实部和虚部。所以,包络函数=abs(hilbert(x))。
2. MATLAB官方解释 Hilbert Transform- MATLAB & Simulink
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 包络线
局部最大值+插值 包络线
思考:
注意经验模态分解(Empirical Mode Decomposition)与Hilbert变换的关系!!!
利用Hilber变换得到的包络线是否合理???