基于MATLAB小波变换的信号突变点检测

之前在不经意间也有接触过求突变点的问题。在我看来,与其说是求突变点,不如说是我们常常玩的"找不同"。给你两幅图像,让你找出两个图像中不同的地方,我认为这其实也是找突变点在生活中的应用之一吧。回到找突变点位置上,以前自己有过一个傻傻的方法:就是直接求前后两个采样的的差分值,最后设置一个阈值,如果差分值大于这个阈值则该点是突变点。但这个方法问题很大,实际中突变点幅值有大有小,你怎么能确定阈值到底是多少呢?还有可能信号本来的差分值就比你那突变点的差分值还要大。所以这种方法在信号或噪声稍微复杂一点就行不通了。

这几天看到了一种船新的信号突变点检测的方法-基于小波变换的信号突变点检测。于是乎去学习了一下小波变换的相关知识和应用,学习的不是很深入,但也模模糊糊感觉到了小波变换确实是检测突变点的一大利器,下面分为两个大部分总结一下我所学习到的小波变换求突变点的实现过程和相关知识理论。


一:小波变换求信号突变点实现

我喜欢直接从应用入手,或者应用结合理论。一步一步分析代码,看数据和图像的变化比一步一步推公式有趣的多(虽然可能是错误的呀)。于是在这里我就先直接上代码和图像了,这样先让我们对整个过程有个感性的认识。

1.1 原始信号的生成

首先生成原始信号,这里随便什么信号都可以,那我就生成一个正弦信号吧,具体信号参数见代码注释。

clear all; close all; clc;    
Fs = 1000;                 % 采样频率1000Hz
Ts = 1 / Fs;               % 采样时间间隔1ms
L = 1000;                  % 采样点数1000
t = (0 : L - 1) * Ts;      % 采样时间。1000个点,每个点1ms,相当于采集了1s
x = sin(2 * pi * 10 * t);  % 原始正弦信号,频率为10Hz,振幅为1

1.2 添加突变点

第二步我们要人为添加突变点了,为了看起来直观就暂时不添加噪声了。此处我们添加两个突变点,将第233个点的幅度在原本基础上增加0.5,将第666个点的幅度在原本基础上增加0.1,代码和添加后信号图像如下:

x(233) = x(233) + 0.5;
x(666) = x(666) + 0.1;

可以看到一个突变点很明显,而另一个却不是那么的明显,可能肉眼看的话都会忽略掉这个突变点。

1.3 对信号做傅里叶变换

可能有人要问,既然我们做的是小波变换,为什么又要对信号做傅里叶变换呢?其实我们确实可以不用做傅里叶变换的,但是为了与小波变换做对比,分析各自的优势和劣势,我们还是看一下该突变信号的傅里叶变换。

Y = fft(x,1024);
f = Fs * (0 : (L / 2)) / L;
P2 = abs(Y / L);
P1 = P2(1 : L / 2 + 1);
plot(f,P1) 

1.3.1 补充

下面我们再给一个原始信号的fft幅度谱。从肉眼来看,我们可以发现原始信号和添加突变信号的频域差别不大,只是突变信号的频谱在高频部分多了些抖动。所以要从傅里叶变换的频域来检测突变信号是不合适的。具体原因在第二部分会有总结,主要是两个变换选取“基”的不同而导致的。

1.4 对信号做小波变换

重头戏小波变换来了,这里我们用两种小波变换的方法检测突变点,一是连续小波变换;二是离散小波变换,这里只会简略说明一下图像,可以结合第二部分原理一起查看。

1.4.1 连续小波变换

我们对突变信号进行连续小波变换,实现代码和图像如下:

cw1 = cwt(x,1:32,'sym2','plot'); % 对信号做连续小波变换
title('连续小波变换');

cwt(Continuous wavelet transform)函数表示进行连续小波变换,主要是处理一维的数据,比如我们这个数据。参数x是输入的信号;1:32表示尺度参数Scales的取值范围为(1:32);'sym2’表示我们用的小波是sym2小波;'plot’是画出连续小波变换系数的意思。运行图像如下:

不同于傅里叶变换只有w一个自变量,小波变换有两个自变量,分别是a(尺度参数)和b(位移参数)。从上图我们可以看出在小波位移到第233个点和第666个点,且a较小时,可以看到一条较亮的白条,可以暂且理解成小波在这个位移和尺度上与信号相关性较大。在某个位置出现小波与信号相关性激增的原因就是信号在这个位置出现了突变,于是我们就愉快的找到了两个突变点的位置。

1.4.2 离散小波变换

由于连续小波变换的位移参数(b)和尺度参数(a)都是连续变化的,特别是尺度参数的连续变化,会带来巨大的计算量,于是利用离散小波变换来处理信号,一种方法是我们可以直接取离散的a和b的值,然后计算得到其系数图,从不同的尺度观察信号的特征,例外一种更常用的离散小波变换方法叫做Wallat算法,是通过构造一个低通滤波器和一个高通滤波器不断对信号进行滤波,从而得到信号不同频率的细节的方法。这里还是主要说代码和图像,具体实现原理在第二部分有粗浅介绍。

wavedec(x,3,‘db4’)函数表示进行离散小波多层分解,x是待处理的输入信号;3表示进行3层分解,'db4’是一个小波的名字。处理完毕后得到1、2、3层的细节系数(details)d1、d2、d3和第3层的近似系数(Approximations)a3。本段代码和分解后的图像如下:

[d,a]=wavedec(x,3,'db4');           %对原始信号进行3层离散小波分解
a3=wrcoef('a',d,a,'db4',3);         %重构第3层近似系数
d3=wrcoef('d',d,a,'db4',3);         %重构第3层细节系数  
d2=wrcoef('d',d,a,'db4',2);         %重构第2层细节系数  
d1=wrcoef('d',d,a,'db4',1);         %重构第1层细节系数  

我们还可以用另一个函数dwt()来手动进行一层一层的分解,不过注意分解过后每一层的分解信号长度会少一半,因为进行了下采样。具体原因可见第二部分的介绍,手动分解的代码和分解图像入下:

[ca11,cd1] = dwt(x,'db4');      % 第1层分解
[ca22,cd2] = dwt(ca11,'db4');   % 第2层分解
[ca3,cd3] = dwt(ca22,'db4');    % 第3层分解

由上图可明显看出,除去开头和结尾的一些比较大的点外,在第1、2、3层的细节信号中,最大值点恰恰是第233点和第666点,于是也可以愉快的可以确定这两个点即是突变信号的位置了。

这里还可以稍微注意一下近似信号a3,它类似于原始信号滤去了高频成分的样子,它是怎么得来的你看了第二部分就知道了!

1.5 总结

在这一部分中我们直抓要害,知道了怎么通过小波变换来检测信号的突变点,MATLAB的函数用起来就是爽有木有。但是能应用是一回事,我们还是尽量多了解一下小波变换的原理为好。小波是怎么构造的,它的性质有什么?连续小波变换的图像是怎么计算出来的呢?离散小波变换的每一层又是怎么算出来的呢?只有学习了它们背后的支撑运算的数学公式,我们才能算真正理解了它。


二:小波变换的基础知识

关于基础知识这一部分,主要都是参考的[2]里面的内容,我只是提炼了一些我认为重要的内容写出来,然后有自己小小的补充。

2.1 连续小波变换(CWT)

首先直接给出连续小波变换公式:
C ( a , b ) = 1 a ∫ R f ( t ) ψ ∗ ( t − b a ) d t C(a,b) = \frac{1}{\sqrt{a}} \int_R f(t) \psi^*(\frac{t-b}{a})dt C(a,b)=a 1Rf(t)ψ(atb)dt

连续小波变换的结果就是得到很多个小波系数 C ( a , b ) C(a,b) C(a,b),它有两个自变量参数,分别是尺度参数a和位移参数b。注意在CWT中a和b都是连续变化的

2.1.1 尺度参数与位移参数

尺度变换:
如何对小波进行尺度变换呢?其实就是简单的拉伸或者压缩,下图表现为一个小波在不同的尺度参数下的变换,可以看到尺度参数a越小,小波越压缩,频率越高;尺度参数a越大,小波越拉伸,频率越低。

位移变换:
位移变换意味着将小波延迟或提前,如下图将小波 ψ ( t ) \psi(t) ψ(t)往右移位长度k得到 ψ ( t − k ) \psi(t-k) ψ(tk)

2.1.2 连续小波变换具体过程

连续小波变换其实就是把小波从小尺度拉伸到大尺度,然后把不同尺度的小波依次从0位移到信号的完整长度,并不断地计算它们的积分的过程。详细来说就是下面几个步骤:

  1. 将小波 ψ ( t ) \psi(t) ψ(t)放到原始信号 f ( t ) f(t) f(t)的开头处进行比较。
  2. 计算小波系数C,C其实也表示了小波与信号这一部分的相关程度。C越大,说明相似度越高。
  1. 将小波向右平移,距离为b,小波函数变为 ψ ( t − b ) \psi(t-b) ψ(tb)。并且重复步骤1和2,直到小波位移完整个信号 f ( t ) f(t) f(t)
  1. 扩展小波的尺度,比如扩展一倍,小波函数变为 ψ ( t 2 ) \psi(\frac{t}{2}) ψ(2t)。然后重复步骤1~3。
  1. 重复步骤1~4直到小波已经拓展到规定的最大尺度。

进行完这五个步骤之后,我们就能够得到在不同的小波尺度和不同的信号位置上的小波系数了。如何更直观的理解这个系数呢?于是我们可以把 C ( a , b ) C(a,b) C(a,b)画出来,x轴代表信号的时间(或说小波位移的长度b);y轴表示尺度a;图中每个点的颜色浅深表示C(a,b)的大小。下面是一个系数图,其实在第一部分中也有我自己信号的CWT系数图,忘了的可以回去看一下。

当然也可以看系数图的侧面视角,图像如下:

回到文章主题,检测信号突变点上。如果信号存在突变点的话,总有一些小尺度的小波在经过突变点这个位置的时候,此时计算出的 C ( a , b ) C(a,b) C(a,b)会比周围的点都大。从系数图中我们可以想到这些位置会更亮一些,于是就找到了突变点。

2.2 离散小波变换(DWT)

f ( t ) f(t) f(t)的二进制连续小波变换为:
C ( 2 j , b ) = 1 2 j ∫ R f ( t ) ψ ∗ ( t − b 2 j ) d t (1) C(2^j,b) = \frac{1}{\sqrt{2^j}} \int_R f(t) \psi^*(\frac{t-b}{2^j})dt \tag{1} C(2j,b)=2j 1Rf(t)ψ(2jtb)dt(1)
b = k 2 j b=k2^j b=k2j,式(1)为离散小波变换;当 b = k b=k b=k,式(1)为平稳小波变换(二进小波变换)。
平稳小波变换只对尺度参数进行了离散化,而对时间域上的平移参数保持整数连续变化,平稳小波变换未破坏信号在时间域上的平移不变量。

DWT有多种实现方式,除了按照上述公式做的离散小波变换,其实还有一种更为常用的离散小波变换的方法,叫做Mallat算法,其实我们在第一部分将信号分成3层近似系数和细节系数就是用的这种方法。

2.2.1 半子带滤波

对于大多数信号来说,信号的低频部分是对信号整体特征的刻画;而高频部分则表现了信号的细枝末节。比如我们的声音,如果把声音的高频部分去去掉,虽然听起来有点不一样,但我们仍然能够听得出说的什么内容,但如果把足够多的低频分量去掉,那就完全不知道在说什么了。

在小波分析中,我们把信号的低频部分称之为近似系数A(Approximations),把信号的高频部分称作细节系数D(Details),于是我们可以通过一个半子带滤波器来得到A和D。

原始信号S,通过两个互补的滤波器,生成两个信号A和D。

值得注意的一点是,假设原始实数字信号S有1000个采样点的长度,那么经过滤波后,A和D分别都会有1000个点,它们加在一起有2000个点,就比S还长了。由于之后重构S的需要,现在我们使用下采样的方法将A和D各自降成500个点,方法是每两个点取一个点就好了。下采样之后的信号分别是cA1和cD1。

2.2.2 离散小波分解

在得到近似系数cA1之后,对cA1也进行半子带滤波加下采样,得到cA2和cD2,重复这个操作,可以最多进行 l o g 2 N log_2{N} log2N层小波分解。

三:源码下载链接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/29538.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

区块链学习6-长安链部署:如何创建特定共识节点数和同步节点数的链

正常prepare的时候只支持4 7 13 16个节点个数,想要创建10个节点,其中5个是共识节点,如何实现? 1. 注释掉prepare.sh的这几行: 2. 修改 crytogen的模板文件: 如果是cert模式:chainmaker-crypt…

AI lightning学习

真的是没有mmlab的框架好理解,hook调用没问题,就是代码写的不整洁,hook放的到处都是,而且hook的名字和run的名字也不好对应。 又是捧mmengine的一天 😃

vue实现文件下载

实现效果图&#xff1a;点击蓝色文字&#xff0c;下载文件 代码实现&#xff1a; <div v-for"(item, index) in form.fileList" :key"index"><i class"el-icon-upload" style"color: #c0c4cc; margin-right: 5px"></i&…

【CSS3】CSS3 动画 ③ ( 动画属性 | CSS3 常见动画属性简介 | 动画属性简写方式 | 动画属性简写语法 | 使用动画制作热点地图 )

文章目录 一、CSS3 动画属性1、CSS3 常见动画属性简介2、代码示例 - CSS3 常见动画属性使用 二、CSS3 动画属性简写方式1、CSS3 动画属性简写语法2、animation 简写动画属性提示3、动画属性简写形式与原形式对比4、代码示例 - CSS3 动画属性简写示例 三、使用动画制作热点地图1…

基于Echarts的大数据可视化模板:智慧物流管理

目录 引言物流管理的重要性大数据可视化在解决物流管理挑战中的作用智慧物流概述定义智慧物流的概念和特点智慧物流的关键技术和平台风险管理和预测:交通拥堵情况和风险预警Echarts与大数据可视化Echarts库以及其在大数据可视化领域的应用优势开发过程和所选设计方案模板如何满…

医疗行业如何防范弱口令攻击?这份弱口令治理方案请收好

随着5G、云计算、物联网等新兴技术与传统医疗系统的不断深化融合&#xff0c;我国医疗信息化程度越来越高&#xff0c;逐步向数字化、智慧化医疗演进&#xff0c;蓬勃发展的信息化也使医疗行业面临的安全风险逐渐增多。数据泄露、勒索病毒等问题频发&#xff0c;加之《等保》、…

微信开发之朋友圈自动点赞的技术实现

简要描述&#xff1a; 朋友圈点赞 请求URL&#xff1a; http://域名地址/snsPraise 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必选类型说明wId…

摄像机终端IP地址白名单配置流程

海康摄像头配置白名单流程 1.登录海康摄像机前端 2.进入配置-系统-安全管理-IP地址过滤 3.IP地址过滤方式选择“允许” 4.点击添加按钮输入对应的IP地址或者IP网段 5.最后勾选启用IP地址过滤&#xff0c;然后保存 大华摄像头配置白名单流程 1.登录大华摄像机前端 2.进入设…

使用MethodInterceptor和ResponseBodyAdvice做分页处理

目录 一、需求 二、代码实现 父pom文件 pom文件 配置文件 手动注册SqlSessionFactory&#xff08;MyBatisConfig &#xff09; 对象 实体类Users 抽象类AbstractQuery 查询参数类UsersQuery 三层架构 UsersController UsersServiceImpl UsersMapper UsersMapper.…

苹果电脑图像元数据编辑器:MetaImage for Mac

MetaImage for Mac是一款功能强大的照片元数据编辑器&#xff0c;它可以帮助用户编辑并管理照片的元数据信息&#xff0c;包括基本信息和扩展信息。用户可以根据需要进行批量处理&#xff0c;方便快捷地管理大量照片。 MetaImage for Mac还提供了多种导入和导出格式&#xff0…

12v转5v降压模块

问&#xff1a;什么是12V转5V降压模块&#xff1f;它的功能是什么&#xff1f; 答&#xff1a;12V转5V降压模块是一种电子设备&#xff0c;用于将输入电压为12V的直流电转换为输出电压为5V的直流电。它的主要功能是为电子设备提供所需的适当电压&#xff0c;以便它们能够正常运…

mysql进阶篇(二)

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

GCC编译过程:预处理->编译->汇编->链接

目录 引言 概括介绍 一、预处理 二、编译 三、汇编 四、链接 总结 引言 当使用集成开发环境&#xff08;IDE&#xff09;进行C语言编程时&#xff0c;点击"编译"按钮后&#xff0c;整个C程序从源代码到可执行文件的生成过程会自动完成。IDE会在后台为我们执行C…

QT QLCDNumber 使用详解

本文详细的介绍了QLCDNumber控件的各种操作&#xff0c;例如&#xff1a;新建界面、源文件、设置显示位数、设置进制、设置外观、设置小数点、设置溢出、显示事件、其它文章等等操作。 实际开发中&#xff0c;一个界面上可能包含十几个控件&#xff0c;手动调整它们的位置既费时…

Activity启动过程详解(Android 12源码分析)

Activity的启动方式 启动一个Activity&#xff0c;通常有两种情况&#xff0c;一种是在应用内部启动Activity&#xff0c;另一种是Launcher启动 1、应用内启动 通过startActivity来启动Activity 启动流程&#xff1a; 一、Activity启动的发起 二、Activity的管理——ATMS 三、…

怎么在JMeter中的实现关联

我们一直用的phpwind这个系统做为演示系统, 如果没有配置好的同学, 请快速配置之后接着往下看哦. phpwind发贴时由于随着登陆用户的改变, verifycode是动态变化的, 因此需要用到关联. LoadRunner的关联函数是reg_save_param, Jmeter的关联则是利用后置处理器来完成. 在需要查…

字节编码学习

字节编码学习 文章目录 字节编码学习01_字节与ASCII码表02_每个国家都有独特的码表03_国际化UTF-804_编码本和解码本不一致&#xff0c;乱码 01_字节与ASCII码表 public class Demo01 {public static void main(String[] args) {// 计算机的底层全部都是字节 ---- ----// 一个…

1.利用matlab建立符号表达式(matlab程序)

1.简述 、 1. 使用sym命令创建符号变量和表达式 语法&#xff1a; sym(‘变量’,参数) %把变量定义为符号对象 说明&#xff1a;参数用来设置限定符号变量的数学特性&#xff0c;可以选择为’positive’、’real’和’unreal’&#xff0c; ’positive’ 表示为“正、实”符…

C++的auto究竟是何方神圣

C的auto究竟是何方神圣 前言&#x1f64c;auto&#xff08;C 11&#xff09; 的使用细则auto是什么&#xff1f; auto声明的变量是在什么时期被编译器推导出来呢&#xff1f;为什么使用auto进行定义变量时&#xff0c;必须进行初始化&#xff1f; auto 的使用场景auto与指针和引…

软件安全测试包含哪些内容和方法?安全测试报告的必要性

软件安全测试是一种通过模拟真实攻击的方式&#xff0c;对软件系统进行全面的安全性评估和测试&#xff0c;以发现潜在的安全漏洞和弱点&#xff0c;是确保软件系统安全性的重要措施。在进行软件安全测试时&#xff0c;我们需要了解测试的内容和方法&#xff0c;以及为什么进行…