使用MATLAB实现对信号的EMD分解

本文介绍了希尔伯特-黄变换(HHT)及其组成部分经验模式分解(EMD)在信号处理中的原理和应用。EMD将非线性、非平稳信号分解为多个固有模态函数(IMFs)和残余分量,每个IMF对应不同频率段。希尔伯特变换用于获取IMF的瞬时频率和幅度。HHT结合两者,提供了一种时频分析方法,尤其适用于语音和地震信号等非稳态信号的分析。通过MATLAB实现,展示了对构造信号和实际地震信号的EMD分解过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


由于实信号具有双边频谱,对其希尔伯特变换以后获得的瞬时频率、幅度和相位中可能包括负值,而这些负值是无意义的。

0 前言

本文中若有蓝色文字则代表的是链接内容,请积极查看:

1、MATLAB是一款科学计算软件;

2、EMD是经验模态分解/经验模式分解,Empirical Mode Decomposition,下文统一使用的是[经验模式分解];

3、希尔伯特变换,HT,Hilbert Transform;

4、HHT是希尔伯特-黄变换,Hilbert Transform Huang;

5、不同的IMF分量简记为IMFs。


1 经验模式分解EMD

关于EMD主要有三点要注意:

  • 目的:将任意信号(尤其是非平稳、非线性时间序列信号)分解为线性稳态信号;

  • 核心:把任一个自由的信号分解成为若干个固有模态函数(Intrinsic Mode Function,IMF,也称为本征模函数)和一个残余分量,每一个IMF代表了原信号不同频率段的振荡变化,反映信号的局部特征,而最后的残余分量则反映信号中的缓慢变化量。

  • 过程(该过程理解即可,具体实现的话MATLAB中会有相关函数):
    在这里插入图片描述

上图所述过程对应的流程图为:
在这里插入图片描述
IMF是一个单分量信号,每时每刻有且仅有一个频率,即瞬时频率。本征模函数IMF的两个必要条件包括:

  • 在整个数据集,局部极大值与局部极小值数目之和必须与过零点的数目相等或至多相差一个;
  • 在任意时间点,局部极大值所定义的上包络线与局部极小值所定义的下包络线均值为零,也就是说整个序列的波形必须是局部对称的。

MATLAB中对某个信号的EMD分解示例如下:
在这里插入图片描述
在上图中:signal为原始信号,剩下的三个信号分别为:imf1~imf2为2个固有模态函数,即IMFs,可以看到各个IMF分别对应不同的频率区间,最后的res为剩余分量。


2 希尔伯特变换HT

HT:在已知复信号的实部的情况下,求该复信号。其中虚部就是实部的希尔伯特变换,而实部就是原始信号。复信号表示为a+b·i,其中a为实信号输出,b为a的希尔伯特变换。以下先介绍几个概念:

  • 带宽:信号频率的宽度,即信号所含谐波最高频率与最低频率之差;
  • 窄带信号:特征是该信号带宽远小于中心频率,也就是所含的频率分量区间尽量小。

对信号使用希尔伯特变换是有条件的:必须是窄带信号、不含噪声,不能是复杂信号,不出现尖峰跳跃,数据尽量平稳,以避免不可解释的负频率出现。


3 希尔伯特-黄变换HHT

HHT就是先对原始信号进行EMD去求固有模态函数IMFs,然后对各个IMF分别做希尔伯特变换。
简单理解为:HHT=原始信号→EMD→HT

而大部分实际信号均不满足【2 希尔伯特变换HT】一节中最后提到的条件,因此必须将非线性平稳信号转换为平稳信号,因此,必须使用EMD进行模态分解,再对分解得到的IMFs进行希尔伯特变换,求得复信号以后再进行进一步的分析。

HHT后得到的是一种时频属性,既包括时域又包括频域的性质,是一种时频分析方法


4 基于EMD的语音信号处理

本节并不是重点呢。

语音信号是非稳态信号,只有在短时才具有稳态性,所以在信号处理的时候,假设信号具有稳态性,所以通过分帧(帧长10~30ms)将信号转换为稳态信号,但是分帧的过程会因为加窗类型和窗长的不同,对原始信号产生影响。EMD的作用与加窗分帧类似,其本质就是将非稳态信号转换为稳态信号,然后进行后续的处理,其中的IMFs就是不同的稳态信号,对应的是不同的频率区间,一般由高到低排列,直到出现残余量r,过程终止

语音信号经EMD过程后会分解为各个频率范围的IMF。在后续的信号处理过程中,可以根据需求对各个IMF进行加权后求和,得到新的语音信号,然后可以完成进一步的操作。下图为基于EMD的说话人特征参数提取的过程:
在这里插入图片描述


5 MATLAB实现对信号的EMD分解

这里是关于经验模式分解(EMD)的MATLAB工具箱安装详解。

下图是以下两节用到的emd_visu函数的MATLAB相关输入输出解释:
在这里插入图片描述

5.1 对构造的信号进行EMD

MATLAB代码如下:

clear all;
f=31000; %采样率
n=5;
t=0:0.000001:0.00016;
%构造一个信号
x= 100*(1-cos(2*pi*f*t/n)).*sin(2*pi*f*t);
%加点噪声


%emd分解
imf = emd(x);
[m, n]=size(imf);
emd_visu(x,t,imf);

会输出三幅图,只关注第一幅figure1为:
在这里插入图片描述
上图依次分别为自己构造的信号signal、EMD后3个IMFs以及剩余信号res的波形。

5.2 对实际的信号进行EMD

下面代码中所需文件地震信号.xlsx这里。MATLAB代码如下:

clear all;

data=xlsread('地震信号.xlsx'); %需要替换为文件相应位置

t = data(:,2); %时间
x = data(:,1); %振幅

imf = emd(x); %emd分解
emd_visu(x,t,imf); %作图

会输出三幅图,只关注第一幅figure1为:
在这里插入图片描述
上图依次分别为实际的地震信号signal、EMD后3个IMFs以及剩余信号res的波形。


6 参考文献

1、经验模式分解(EMD)及希尔伯特-黄变换(HHT)简介及MATLAB实现

2、经验模式分解(EMD)的MATLAB工具箱安装详解

3、EMD工具箱使用问题


END

评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值