之前在不经意间也有接触过求突变点的问题。在我看来,与其说是求突变点,不如说是我们常常玩的"找不同"。给你两幅图像,让你找出两个图像中不同的地方,我认为这其实也是找突变点在生活中的应用之一吧。回到找突变点位置上,以前自己有过一个傻傻的方法:就是直接求前后两个采样的的差分值,最后设置一个阈值,如果差分值大于这个阈值则该点是突变点。但这个方法问题很大,实际中突变点幅值有大有小,你怎么能确定阈值到底是多少呢?还有可能信号本来的差分值就比你那突变点的差分值还要大。所以这种方法在信号或噪声稍微复杂一点就行不通了。
这几天看到了一种船新的信号突变点检测的方法-基于小波变换的信号突变点检测。于是乎去学习了一下小波变换的相关知识和应用,学习的不是很深入,但也模模糊糊感觉到了小波变换确实是检测突变点的一大利器,下面分为两个大部分总结一下我所学习到的小波变换求突变点的实现过程和相关知识理论。
<hr>
## 一:小波变换求信号突变点实现
我喜欢直接从应用入手,或者应用结合理论。一步一步分析代码,看数据和图像的变化比一步一步推公式有趣的多(虽然可能是错误的呀)。于是在这里我就先直接上代码和图像了,这样先让我们对整个过程有个感性的认识。
### 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
```
<img src="https://img2020.cnblogs.com/blog/2048856/202007/2048856-20200731175827662-698208204.jpg" width = "480" height = "350" alt="" align=center />
### 1.2 添加突变点
第二步我们要人为添加突变点了,为了看起来直观就暂时不添加噪声了。此处我们添加两个突变点,将第233个点的幅度在原本基础上增加0.5,将第666个点的幅度在原本基础上增加0.1,代码和添加后信号图像如下:
```
x(233) = x(233) + 0.5;
x(666) = x(666) + 0.1;
```
<img src="https://img2020.cnblogs.com/blog/2048856/202007/2048856-20200731175832968-2024233994.jpg" width = "480" height = "350" alt="" align=center />
可以看到一个突变点很明显,而另一个却不是那么的明显,可能肉眼看的话都会忽略掉这个突变点。
### 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)
```
<img src="https://img2020.cnblogs.com/blog/2048856/202007/2048856-20200731175840986-1716514093.jpg" width = "480" height = "350" alt="" align=center />
#### 1.3.1 补充
下面我们再给一个原始信号的fft幅度谱。从肉眼来看,我们可以发现原始信号和添加突变信号的频域差别不大,只是突变信号的频谱在高频部分多了些抖动。所以要从傅里叶变换的频域来检测突变信号是不合适的。具体原因在第二部分会有总结,主要是两个变换选取“基”的不同而导致的。
<img src="https://img2020.cnblogs.com/blog/2048856/202007/2048856-20200731175837410-609274502.jpg" width = "480" height = "350" alt="" align=center />
### 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'是画出连续小波变换系数的意思。运行图像如下:
<img src="https://img2020.cnblogs.com/blog/2048856/202007/2048856-20200731212019759-971907422.jpg" width = "480" height = "350" alt="" align=center />
不同于傅里叶变换只有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层细节系数
```
<img src="https://img2020.cnblogs.com/blog/2048856/202007/2048856-20200731214710916-17426222.jpg" width = "480" height = "350" alt="" align=center />
我们还可以用另一个函数dwt()来手动进行一层一层的分解,不过注意分解过后每一层的分解信号长度会少一半,因为进行了下采样。具体原因可见第二部分的介绍,手动分解的代码和分解图像入下:
```
[ca11,cd1] = dwt(x,'db4'); % 第1层分解
[ca22,cd2] = dwt(ca11,'db4'); % 第2层分解
[ca3,cd3] = dwt(ca22,'db4'); % 第3层分解
```
<img src="https://img2020.cnblogs.com/blog/2048856/202008/2048856-20200802230406409-1065622805.jpg" width = "480" height = "350" alt="" align=center />
由上图可明显看出,除去开头和结尾的一些比较大的点外,在第1、2、3层的细节信号中,最大值点恰恰是第233点和第666点,于是也可以愉快的可以确定这两个点即是突变信号的位置了。
这里还可以稍微注意一下近似信号a3,它类似于原始信号滤去了高频成分的样子,它是怎么得来的你看了第二部分就知道了!
### 1.5 总结
在这一部分中我们直抓要害,知道了怎么通过小波变换来检测
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
基于小波变换的信号突变点检测+MATLAB实现 基于小波变换的信号突变点检测+MATLAB实现 基于小波变换的信号突变点检测+MATLAB实现 基于小波变换的信号突变点检测+MATLAB实现 基于小波变换的信号突变点检测+MATLAB实现 基于小波变换的信号突变点检测+MATLAB实现 基于小波变换的信号突变点检测+MATLAB实现 基于小波变换的信号突变点检测+MATLAB实现 基于小波变换的信号突变点检测+MATLAB实现 基于小波变换的信号突变点检测+MATLAB实现 基于小波变换的信号突变点检测+MATLAB实现 基于小波变换的信号突变点检测+MATLAB实现 基于小波变换的信号突变点检测+MATLAB实现 基于小波变换的信号突变点检测+MATLAB实现 基于小波变换的信号突变点检测+MATLAB实现 基于小波变换的信号突变点检测+MATLAB实现 基于小波变换的信号突变点检测+MATLAB实现 基于小波变换的信号突变点检测+MATLAB实现 基于小波变换的信号突变点检测+MATLAB实现 基于小波变换的信号突变点检测+MATLAB实现 基于小波变换的信号突变点检测+MATLAB实现
资源推荐
资源详情
资源评论
收起资源包目录
基于小波变换的信号突变点检测+MATLAB实现.zip (2个子文件)
project_code_0717
my_main.m 3KB
README.md 15KB
共 2 条
- 1
资源评论
辣椒种子
- 粉丝: 3316
- 资源: 5724
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功