类EMD滤波算法(相关系数、峭度、自适应等方法)
最后更新于:2024-04-07 21:30:55
一、代码运行环境
推荐使用MATLAB2019及更新版本。 较低版本运行需要安装如下工具箱:时频域分析工具箱
二、程序介绍
注:图标代表该m文件为脚本文件,可以直接运行;图标代表函数文件,在没有输入变量的情况下无法直接运行。更详细的解释可以看这里。
1.demo1.m文件
用于演示基于频谱分析的筛选方法的代码。程序运行完成后,在MATLAB的工作区,双击filtered_signal1变量,可以查看滤波得到的具体数值。
同时程序将会画出EMD分解结果与滤波效果对比图:
同时在命令行窗口将会打印出滤波结果评价指标:
2.demo2.m文件
用于演示基于相关系数的筛选方法的代码,可以直接运行。程序运行完成后,在MATLAB的工作区,双击filtered_signal2变量,可以查看滤波得到的具体数值。
同时程序将会画出EMD分解结果与滤波效果对比图:
同时在命令行窗口将会打印出相关系数、筛选结果和滤波结果评价指标:
3.demo3.m文件
用于演示基于峭度的筛选方法的代码,可以直接运行。程序运行完成后,在MATLAB的工作区,双击filtered_signal3变量,可以查看滤波得到的具体数值。
同时程序将会画出EMD分解结果与滤波效果对比图:
同时在命令行窗口将会打印出峭度值、筛选结果和滤波结果评价指标:
4.demo4.m文件
用于演示基于自适应降噪方法的代码,可以直接运行。程序运行完成后,在MATLAB的工作区,双击filtered_signal4变量,可以查看滤波得到的具体数值。
同时程序将会画出EMD分解结果与滤波效果对比图:
同时在命令行窗口将会打印出中间变量、筛选结果和滤波结果评价指标:
5.filAdaptive.m文件
基于相关系数进行IMF筛选并实现滤波的主函数。该函数在demo2中演示调用方法,只需要输入原始信号、imf数据和相关系数阈值即可实现滤波。代码介绍如下:
function [filtered_signal, correlation_values] = filCorrelation(original_signal, imfs, threshold_corr)
% filCorrelation 基于相关系数进行IMF筛选,用以滤波
%
% 输入:
% original_signal - 原始信号,一维行向量
% imfs - EMD分解得到的IMF分量,每一行对应一个IMF分量
% threshold_corr - 相关系数阈值,用于筛选IMF分量
%
% 输出:
% filtered_signal - 滤波后的信号,一维行向量
% correlation_values - 每个IMF分量的相关系数值,一维行向量
6.filKurtosis.m文件
基于峭度值进行IMF筛选并实现滤波的主函数。该函数在demo3中演示调用方法,只需要输入imf数据和峭度阈值即可实现滤波。代码介绍如下:
function [filtered_signal, kurtosis_values] = filKurtosis(imfs, threshold_kurtosis)
% filKurtosis 基于峭度进行IMF筛选,用以滤波
%
% 输入:
% imfs - EMD分解得到的IMF分量,每一行对应一个IMF分量
% threshold_kurtosis - 峭度阈值,用于筛选IMF分量
%
% 输出:
% filtered_signal - 滤波后的信号,一维行向量
% kurtosis_values - 每个IMF分量的峭度值,一维行向量
7.filAdaptive.m文件
基于自适应进行IMF筛选并实现滤波的主函数。该函数在demo4中演示调用方法,只需要输入imf数据即可实现滤波。代码介绍如下:
function [SNR,MSE,NCC] = FilterEffectEvaluation(ori,fil)
% 对滤波效果进行评估
% 目前包含的评估指标有:信噪比SNR,均方差MSE,波形相似系数NCC
% 输入:
% ori:无噪声的原始数据,一维序列
% fil:滤波后的数据,一维序列
% 输出:
% SNR:信噪比
% MSE:均方误差
% NCC:波形相似系数
8.kEMD.m文件
实现EMD分解的底层文件,其中调用了MATLAB的官方emd函数,对于低于2019版本MATLAB也可以调用第三方emd函数,但是此时需要安装时频域分析工具箱。
function imf = kEMD(data,type)
% 整合版EMD函数,整合了G-Rilling工具箱和MATLAB自带工具箱的EMD分解方法
% 默认设置下按照MATLAB自带库进行
% 并且统一输出格式,配合后续进行希尔伯特-黄变换等无缝衔接
% 输入:
% data:待分解的数据
% type: 如果type没有传入参数,例如调用时为kEMD(data),则该函数内将type设置为1
% 当type的值为1时,则优先采用MATLAB自带库中的函数进行分解,此时emd函数的用法与MATLAB自带函数一致;
% 当type的值为2时,则强制采用第三方库文件中的函数进行分解
% 输出:
% imf:内涵模态分量,统一为n*m格式,其中n为模态数,m为数据点数。例如 imf(1,:)即IMF1,imf(emd,:)即为残差
9.pEMDandFFT.m文件
画信号EMD分解与各IMF分量频谱对照图的函数文件。
function imf = pEMDandFFT(y,FsOrT,type)
% 画信号EMD分解与各IMF分量频谱对照图
% 输入:
% y为待分解信号
% FsOrT为采样频率或采样时间向量,如果为采样频率,该变量输入单个值;如果为时间向量,该变量为与y相同长度的一维向量
% type: 如果type没有传入参数,例如调用时为pEMD(y,fs),则该函数内将type设置为1
% 当type的值为1时,则优先采用MATLAB自带库中的函数进行分解,此时emd函数的用法与MATLAB自带函数一致;
% 当type的值为2时,则强制采用第三方库文件中的函数进行分解
% 输出:
% imf为经emd分解后的各imf分量值,该值与直接调用emd函数返回的数值相同
10.pFFT.m文件
绘制频谱图所需的封装函数文件,在pEMDandFFT中调用,不再赘述。
11.FilterEffectEvaluation.m文件
对滤波效果进行评估。目前包含的评估指标有:信噪比SNR,均方差MSE,波形相似系数NCC。
function [SNR,MSE,NCC] = FilterEffectEvaluation(ori,fil)
% 对滤波效果进行评估
% 目前包含的评估指标有:信噪比SNR,均方差MSE,波形相似系数NCC
% 输入:
% ori:无噪声的原始数据,一维序列
% fil:滤波后的数据,一维序列
% 输出:
% SNR:信噪比
% MSE:均方误差
% NCC:波形相似系数
三、快速开始
1.运行测试脚本
先在MATLAB里打开下载好的文件夹,然后运行demo1.m~demo4.m程序,程序运行完毕后如果没报错,且正常画出滤波对比图像,则说明运行环境正常,程序正确。
2.修改仿真数据/导入数据
以基于相关系数的筛选方法为例,此方法在demo2.m中演示:
复制一个demo2.m的文件副本,在这个副本里做如下修改:
(1)第一种情况,你可能想要对你自己要研究的仿真数据进行滤波测试,此时你需要对 demo2.m 脚本文件中的第1小节内容进行修改替换即可。需要注意的是,请最好保持变量名的一致,即将无噪声信号命名为x,添加噪声后的信号命名为sig,x和sig都应该是一维数据。此时数据替换完成。
(2)第二种情况,你可能是想对一段真实采集的数据进行滤波,此时需要根据你的文件类型的不同(excel,txt,csv等),将数据导入MATLAB的方法有所不同。同学们可以看博主针对常用文件的导入方法的这个教程,教程上未包含的数据类型,大家可以再参考这个文档。导入完成后请将这个待滤波信号命名为sig。此时你可能没有纯净信号(在大多数实际应用中是没有纯净信号的),这不影响你是用小波阈值滤波进行信号去噪,但是你将无法计算滤波评价指标。
3.实现“类EMD”分解
参照 demo2 .m文件中第二步,本步骤使用的是EMD分解方法,同学们可以根据自己的需求换成EEMD、CEEMD、CEEMDAN、EWT、VMD等方法(本网站有相关代码:类EMD分解代码),分解后的模态同样命名为imfs。
4.实现滤波
参照 demo2 .m文件中第三步,根据需要调整相关参数(比如阈值)。
(需要注意,对于使用真实采集的数据进行滤波,且无纯净信号的情况下,需要删除代码中的第3节滤波评价指标计算,并将第4节滤波对比图像按照注释进行修改)
运行程序即可。
四、关于完整版与公开版代码
功能 | 完整版 | 公开版 |
数据导入、参数设置、实现滤波 | √ | √ |
软件全部源码(函数m文件) | √ | × |
滤波数据长度 | 无限制 | 200个点以内 |
五、获取公开版程序(需使用电脑浏览器打开)
EMD滤波代码(公开版)
注:公开版代码需使用MATLAB2022a及以上版本
六、获取完整版程序(使用电脑浏览器或者手机浏览器打开)
获取通道一(淘宝):点击此处获取完整版程序
获取通道二(本页面):点击下面“立即支付”按钮,付款后获取完整版代码下载链接和售后联系方式~本通道处于测试阶段,使用该通道可以额外优惠(仅需66元)。付款完成后刷新一下本页面即可看到下载链接。
(注意支付跳转失败的话,请使用浏览器打开本页面)
七、完整版代码重要更新
20230521 修复已知bug
20230516 完成初版代码
八、常见问题
无。