经验小波变换在信号处理及轴承故障诊断中的应用
moboyou 2025-05-04 15:26 28 浏览
经验小波变换(EWT)使用所谓的自适应小波细分方案从而创建信号的多分辨率分析 (MRA),我在科研中用的较多,但是效果也是看运气的,别人都是“数据驱动”,我靠“运气驱动”。EWT从信号频谱分割开始,将输入信号分解为若干的子频带信号,并提供信号的完美重建。EWT由Gilles教授开发,且Gilles和Heal提出了最原始的基于直方图的方法来分割频谱。
多分辨分析MRA将信号分解为不同尺度的分量(子频带),并通过对每个时间点的分量求和来恢复原始信号。目前许多算法都可以归为MRA框架,比如最大重叠离散小波变换,经验模式分解等算法。之所以EWT等基于小波的方法用的多,是因为该类方法具有严谨的数学推导过程,可解释性较强。EWT方法大体可分为4个步骤:
1.预设参数并选择分割频谱的方式;
2.自适应分割信号频谱,获得一组边界;
3.根据边界序列和经验小波构造滤波器组;
4.滤波并重构,获得一系列具有紧支撑的MRA分量
具体的理论推导可以阅读相关的一系列文章,文章末尾会给出相关文献,不再赘述,主要讲一下EWT在Matlab中是如何应用的,以及改进方向
EWT算法
在MATLAB的高版本中,可以直接使用ewt 函数来获取信号的MRA分量, MATLAB中EWT算法的结构如下:
(1)计算信号的Multitaper功率谱估计,这是功率谱的一个平滑、低方差估计,并将估计值归一化为在[0,1]范围内。默认情况下,严格识别所有峰值大于70%的峰值。关于Multitaper功率谱,可参考如下文章。
频谱分析中如何理解taper? - xiaotu Peng的回答 - 知乎
https://www.zhihu.com/question/372832396/answer/1838971028
(2)经验小波通带的过渡带在相邻峰的几何平均频率处交叉(这个看一下原文就很清楚了),Meyer小波的构造以及确定参数γ的方式见文献[1],由此形成一个Parseval 紧框架,Parseval 紧框架在现代信号处理中很常用。
(3)为了确定相邻通带之间的边界,可以使用相邻峰之间的第一个局部最小值,如果没有确定局部最小值,默认为几何平均值。注意,局部最小值方法对噪声极为敏感,实际应用时效果不好。
因为EWT的小波形成 Parseval 紧框架,所以滤波器组是自对偶的,即分析滤波器组等于综合滤波器组。 EWT在频域中对信号进行滤波,然后进行逆变换以获得分析系数。
下面给出一个简单的例子。首先,设置一个测试信号
rng default
fs = 500;
t = 0:1/fs:1-1/fs;
f1 = 1./(6/5+cos(2*pi*t));
f2 = 1./(3/2+sin(2*pi*t));
f3 = cos(32*pi*t+cos(64*pi*t));
sig = f1+f2.*f3;
sig = sig+randn(1,length(sig))/2;
sig = sig-mean(sig);
plot(t,sig)
xlabel('Time (sec)')
ylabel('Amplitude')
title('Test Signal')
然后绘制信号的周期谱图和平滑Multitaper估计值
[Pxx,F] = periodogram(sig,[],[],500);
Pxxmt = pmtm(sig,5,[],500,'Tapers','sine','power');
subplot(2,1,1)
plot(F,Pxx)
title('Periodogram')
subplot(2,1,2)
plot(F,Pxxmt)
title('Smoothed Estimate')
xlabel('Frequency (Hz)')
EWT分解
为了描述方便,使用默认设置的ewt 函数来获取信号的 MRA 和有关滤波器组的信息,当然还有好几种算法可以控制ewt函数并获得信号的MRA。
[mra,~,~,info] = ewt(sig);
size(mra)
可以看到,ewt将sig信号默认分解为了两个MRA分量,看一下分解波形,频谱就不画了
subplot(2,1,1);plot(t,mra(:,1));ylabel('mra1');
subplot(2,1,2);plot(t,mra(:,2));ylabel('mra2');
指定最大峰值数量
默认情况下,ewt 会找到2个MRA成分,观察一下ewt的滤波器组通带(中心频率与带宽),因为频率是归一化的,所以要乘以采样频率
info.FilterBank.Passbands*fs
注意到在 22 Hz处有一个边界,第1段有两个峰,因此将 MaxNumPeaks设置为3,以便ewt 使用3个最大峰确定滤波器通带
[mra,cfs,~,info] = ewt(sig,'MaxNumPeaks',3);
info.FilterBank.Passbands*fs
看一下分解波形
subplot(3,1,1);plot(t,mra(:,1));ylabel('mra1');
subplot(3,1,2);plot(t,mra(:,2));ylabel('mra2');
subplot(3,1,3);plot(t,mra(:,3));ylabel('mra3');
验证一下是否完美重建
max(abs(sig'-sum(mra,2)))
sum(sum(abs(cfs).^2))
norm(sig,2)^2
指定百分比阈值
此外还可以设置用于确定在Multitaper功率谱中保留哪些峰的百分比阈值,而不是指定最大峰数,指定最大峰数这个方法在噪声较大的信号中效果很拉跨。信号的Multitaper功率谱估计中的局部最大值被归一化到[0,1]范围内,将 百分比阈值设置为 2。
[~,~,~,info] = ewt(sig,'PeakThresholdPercent',2);
info.FilterBank.Passbands*fs
此外,还可以设置频谱的分割方法(例如localmin,geomean方法)和频率分辨率等参数,就不一一列举了。
下面开始重头戏:轴承故障诊断,试试“运气驱动”吧。
轴承数据的话先看下前几篇文章
基于包络谱的轴承故障诊断方法-第1篇 - 哥廷根数学学派的文章 - 知乎
https://zhuanlan.zhihu.com/p/533579665
基于包络谱的轴承故障诊断方法-第2篇 - 哥廷根数学学派的文章 - 知乎
https://zhuanlan.zhihu.com/p/533984966
基于离散小波变换的滚动轴承故障诊断 - 哥廷根数学学派的文章 - 知乎
https://zhuanlan.zhihu.com/p/534179963
以第3轴承Z轴70Hz第8组数据为例,其包络谱如下
下面开始ewt分解,首先,指定最大峰值数量MaxNumPeaks=3,求得ewt的滤波器组通带信息为:
子频带的波形及包络谱如下:
看一下最大峰值数量MaxNumPeaks=4时的各子频带的包络谱:
看一下最大峰值数量MaxNumPeaks=5时的各子频带的包络谱:
可见,MaxNumPeaks>5就不用考虑了
调整百分比阈值
首先,将百分比阈值设置为 2,得到10个mra分量,看一下ewt的滤波器组通带信息:
ans =
1.0e+03 *
4.0840 5.1200
3.9510 4.0840
3.9380 3.9510
3.3400 3.9380
2.7670 3.3400
2.4940 2.7670
2.1300 2.4940
1.9060 2.1300
1.0800 1.9060
0 1.0800
其子频带分量的包络谱如下:
可见第5个分量故障特征频率十分突出,放大看一下:
再看一下将百分比阈值设置为5,得到6个mra分量,看一下ewt的滤波器组通带信息:
ans =
1.0e+03 *
3.9510 5.1200
3.9380 3.9510
3.3400 3.9380
2.7670 3.3400
2.4940 2.7670
0 2.4940
其子频带分量的包络谱如下:
重看第4个分量:
频谱分割方法
当MaxNumPeaks=5,频谱分割方法为localmin(局部极小)时,各mra分量的包络谱如下图:
效果拉跨,localmin受噪声影响太大了。
当MaxNumPeaks=5,频谱分割方法为geomean(几何平均)时,各子频带分量的包络谱如下图:
重看第4个分量
此外,还有很多优秀的频谱分割方法,比如自适应法,就不一一列举了。
参考文献:
[1] Gilles, Jér^ome. “Empirical Wavelet Transform.” IEEE Transactions on Signal Processing 61, no. 16 (August 2013): 3999–4010. https://doi.org/10.1109/TSP.2013.2265222.
[2] Gilles, Jér^ome, Giang Tran, and Stanley Osher. “2D Empirical Transforms. Wavelets, Ridgelets, and Curvelets Revisited.” SIAM Journal on Imaging Sciences 7, no. 1 (January 2014): 157–86. https://doi.org/10.1137/130923774.
[3] Gilles, Jér^ome, and Kathryn Heal. “A Parameterless Scale-Space Approach to Find Meaningful Modes in Histograms — Application to Image and Spectrum Segmentation.” International Journal of Wavelets, Multiresolution and Information Processing 12, no. 06 (November 2014): 1450044. https://doi.org/10.1142/S0219691314500441.
重要重要重要
EWT的不足也很明显,比如EWT会消耗大量的时间,并且分割出很多无效分量;新的模态混叠现象出现了,同一个分量也可能会被分割为两部分等。对此很多学者对此进行了研究和改进,为了对应经验小波变换的四个步骤,各种改进方法也被作者分为四类。第一类:优化输入参数。为了解决分割频谱和图像时的参数问题,Gilles将傅里叶谱变为尺度空间表示中的函数,提出了概率、“Otsu's”、“k-Means”3种方式,从尺度空间函数中获取有意义的模式。上述基于尺度空间函数的频谱分割方式增加了经验小波变换的自适应性,但是会导致边界的个数增多,也就意味着无效分量会增多,运算耗时也会增加。第二类:更换分割谱。经验小波变换在频谱中划分边界,但Gilles提出的三种方式极易受到噪声的干扰而使边界的个数增多。因此,抑制谱中的噪声成分、放大有用成分有利于边界的划分,无效分量的个数也会被减少。因此可以用自回归功率谱、贝塞尔级数展开(Fourier-Bessel Series Expansion, FBSE)等代替频谱。第三类:优化边界。比如采用顺序统计滤波器(Order tatistic Filter, OSF)的包络估计方法来分割频谱。第四类:筛选MRA分量,这个研究的就比较多了,什么改进峭度指标之类的,不再赘述。
好了,EWT就到这里了,以后慢慢更新一些改进算法,码字不易,且行且珍惜。
相关推荐
- 惊艳所有安卓程序员!京东T8纯手码的安卓开发相关源码精编解析
-
Android系统的源代码非常庞大和复杂,我们不能贸然进入,否则很容易在里面迷入方向,进而失去研究它的信心。我们应该在分析它的源代码之前学习好一些理论知识,下面就介绍一些与Android系统相关的资料...
- 「黑客编程」手把手教你编写POC
-
1概述1.1什么是POC?POC(全称:Proofofconcept),中文译作概念验证。在安全界可以理解成漏洞验证程序。和一些应用程序相比,PoC是一段不完整的程序,仅仅是为了证明提出...
- 社交媒体登录Spring Social的源码解析
-
在上一篇文章中我们给大家介绍了OAuth2授权标准,并且着重介绍了OAuth2的授权码认证模式。目前绝大多数的社交媒体平台,都是通过OAuth2授权码认证模式对外开放接口(登录认证及用户信息接口等)。...
- 网站后端开发源代码
-
成人网站在推动Web发展方面发挥的作用是不可否认的。从克服浏览器视频功能的限制到使用WebSockets推送广告(以防止广告拦截器拦截广告),您必须不断想出巧妙的方法,才能让自己处于Web...
- Java语言的智能名片系统源码,二次开发流程
-
在数字化转型浪潮中,智能名片系统已成为企业营销的基础设施。本文将手把手教你如何部署一套基于Java的智能名片系统源码,涵盖技术选型、环境搭建、部署实施和二次开发全流程。一、系统架构设计1.1技术栈选...
- 小程序源码交付标准详解:必备内容与注意事项
-
在定制化小程序开发项目中,源码交付是确保客户后续自主运维、二次开发的关键环节。然而,许多客户在验收时才发现交付内容不全,导致项目无法正常部署或升级。本文将系统梳理小程序源码交付的**必备内容**、**...
- 安装Dify源码并修改前端发布
-
Dify是一个开源的大语言模型(LLM)应用开发平台,目前是开源的,可以拿到完整的前后端源码,Dify虽然开源协议,但要求前端代码保留版权协议和Logo;今天讲下如何源码安装,并来修改打包前端代码...
- Android系统基础(03) Android系统源码下载
-
常规官方网站说明:Android源码官方网站为(google你懂的):https://source.android.com官网参考链接,对应的tag(tag是一种标签,我们可以根据tag来判断下载的...
- 不靠Agent,4步修复真Bug!蚂蚁CGM登顶SWE-Bench开源榜
-
机器之心报道编辑:吴昕Agentless+开源模型,也能高质量完成仓库级代码修复任务,效果媲美业界SOTA。一、Agentless、44%与NO.1说到AI写代码的实力,大家最关心的还是...
- VS Code使用Git可视化管理源代码详细教程
-
前言: 随着VSCode的功能和插件的不断强大和完善,它已经成为了我们日常开发中一个必不可缺的伙伴了。在之前我曾经写过一篇SourceTree使用教程详解(一个git可视化管理神器,想要了解的话可...
- SpringMVC + Spring + Mybatis + Shiro + 教务查询系统源码分享
-
功能模块介绍源码获取先转发,然后加关注,私信“源码”即可免费获取登录模块功能使用Shiro权限管理框架,实现登录验证和登录信息的储存,根据不同的登录账户,分发权限角色,对不同页面url进行角色设置...
- PHP漏洞之跨网站请求伪造
-
CSRF(CrossSiteRequestForgeries),意为跨网站请求伪造,也有写为XSRF。攻击者伪造目标用户的HTTP请求,然后此请求发送到有CSRF漏洞的网站,网站执行此请求后,...
- Dify工具使用全场景:dify-web修改编译指南(源码解读篇·第1期)
-
我的场景最近一直在研究dify怎么用,怎么用好,要想研究深了,还是得看源码,首先就是要把界面改改,当前的界面太素了,不了解web源码,没法改。所以静下来看了看源码,发现也不难,正好给大家也分享一下修改...
- SKIT.FlurlHttpClient.Wechat实现微信接口开发-服务器验证回调
-
1.在微信公众后台配置设置以下内容开发者密码(AppSecret)IP白名单,就是使用哪一个服务器来控制当前公众号l令牌服务器地址(URL):使用哪一个Url来验证服务器是可以进行开发令牌(To...
- PHP和NodeJS的代码执行效率比较
-
在瞬息万变的网络开发领域中,选择合适的技术栈对于构建高效且可扩展的应用程序至关重要。在众多后端技术中,PHP与Node.js常常成为开发者热议的焦点。Node.js以其非阻塞、事件驱动的架构著称,而P...
- 一周热门
- 最近发表
- 标签列表
-
- curseforge官网网址 (16)
- 外键约束 oracle (36)
- oracle的row number (32)
- 唯一索引 oracle (34)
- oracle in 表变量 (28)
- oracle导出dmp导出 (28)
- oracle 数据导出导入 (16)
- oracle两个表 (20)
- oracle 数据库 字符集 (20)
- oracle安装补丁 (19)
- matlab化简多项式 (20)
- 多线程的创建方式 (29)
- 多线程 python (30)
- java多线程并发处理 (32)
- 宏程序代码一览表 (35)
- c++需要学多久 (25)
- c语言编程小知识大全 (17)
- css class选择器用法 (25)
- css样式引入 (30)
- html5和css3新特性 (19)
- css教程文字移动 (33)
- php简单源码 (36)
- php个人中心源码 (25)
- 网站管理平台php源码 (19)
- php小说爬取源码 (23)