资讯详情

小波变换检测信号突变点的MATLAB实现

之前不经意间接触过求突变点的问题。在我看来,与其说是求突变点,不如说是我们经常玩的"找不同"。给你两个图像,让你找出两个图像的区别。我觉得这其实是生活中突变点的应用之一。回到找到突变点的位置,我以前有一个愚蠢的方法:直接找到前后两个采样的差异值,最后设置阈值。如果差异值大于此阈值,则该点为突变点。但是这种方法有很大的问题。实际上,突变点幅值有大有小。你如何确定阈值是多少?也有可能信号的原始差分比你突变点的差分大。因此,这种方法在信号或噪稍微复杂一点就行不通了。

近年来,我看到了一种新的船舶信号突变点检测方法——基于小波变换的信号突变点检测。因此,我学习了小波变换的相关知识和应用。我没有深入学习,但我也模糊地觉得小波变换确实是检测突变点的利器。以下分为两部分,总结了我学到的小波变换求突变点的实现过程和相关知识理论。

实现小波变换信号突变点

我喜欢直接从应用程序开始,或者将应用程序与理论结合起来。一步一步地分析代码,看到数据和图像的变化比一步一步地推动公式更有趣(尽管它可能是错误的)。所以在这里,我将直接访问代码和图像,这样我们就可以首先对整个过程有一个感性的理解。

生成原始信号

首先生成原始信号,这里任何信号都可以,然后我生成一个正弦信号,具体信号参数见代码注释。

clear all; close all; clc;

Fs = 1000; % 采样频率1000Hz

Ts = 1 / Fs; % 采样时间间隔1ms

L = 1000; % 采样点数1000

t = (0 : L - 1) * Ts; % 采样时间。1000点,每点1点ms,相当于收集1s

x = sin(2 * pi * 10 * t); % 原始正弦信号频率为10Hz,振幅为1

95751eb09666a681f8fc39af007b2f15.png

添加突变点

第二步是人工添加突变点,暂时不添加噪音,以便看起来直观。在这里,我们添加了两个突变点,并在原始基础上增加了第233点的幅度.5,将第666个点的幅度在原本基础上增加0.添加后的代码和信号图像如下:

x(233) = x(233) 0.5;

x(666) = x(666) 0.1;

可可以看到一个突变点很明显,而另一个则不那么明显。肉眼可能会忽略这个突变点。

傅里叶转换信号

有人可能会问,既然我们做的是小波变换,为什么要做傅里叶信号变换呢?事实上,我们真的不需要做傅里叶变换,但为了比较小波变换,分析各自的优缺点,让我们看看傅里叶变换的突变信号。

Y = fft(x,1024);

f = Fs * (0 : (L / 2)) / L;

P2 = abs(Y / L);

P1 = P2(1 : L / 2 1);

plot(f,P1)

title(单边幅度频谱的突变信号)

xlabel('f(Hz)')

ylabel('|P1(f)|')

axis([0,100,0,0.5])

补充

让我们再给一个原始信号fft比较范围谱。从肉眼上看,我们可以发现原始信号与添加突变信号的频域没有太大区别,但突变信号的频谱在高频部分抖动较多。因此,从傅里叶转换的频域检测突变信号是不合适的。具体原因总结在第二部分,主要是由两个转换选择基础的差异引起的。

小波变换信号

亮点小波变换,这里我们使用两种小波变换方法来检测突变点,一种是连续的小波变换;另一种是离散的小波变换,这里只会简要解释图像,可以结合第二部分原理一起查看。

连续小波变换

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

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

title(连续小波变换);

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

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

离散小波变换

由于连续小波变换的位移参数(b)和尺度参数(a)它们是连续的,特别是尺度参数的连续变化,会带来巨大的计算量,所以使用离散波变换来处理信号,这里主要是代码和图像,第二部分的具体实现原理。

[d,a]=wavedec(x,3,'db4'); 3层离散小波分解原始信号

a3=wrcoef('a',d,a,'db4',3); 获得第三层近似系数的%

d3=wrcoef('d',d,a,'db4',3); 第三层细节系数%

d2=wrcoef('d',d,a,'db4',2); 第二层细节系数%

d1=wrcoef('d',d,a,'db4',1); 第一层细节系数%

subplot(411);plot(a3);ylabel(近似信号a3'); %画出每层小波系数

title(小波分解示意图);

subplot(412);plot(d3);ylabel细节信号d3');

subplot(413);plot(d2);ylabel细节信号d2');

subplot(414);plot(d1);ylabel细节信号d1');

xlabel(时间);

wavedec(wavelet decomposition)函数表示离散多辨小波分解,x是待处理的输入信号;3表示三层分解,'db4'也是一个小波的名字。处理后得到1、2、3层的细节系数(details)与第三层相似(Approximations)。画出这些系数的图像如下:

从上图可以清楚地看出,除了开头和结尾的一些较大点外,第1、2、3层的细节信号中最大值是第233点和第666点,因此可以愉快地确定这两点是突变信号的位置。

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

总结

在这一部分,我们直接抓住关键点,知道如何通过小波变换检测信号的突变点,MATLAB使用的函数是爽有木有。但是,应用程序是一回事。我们最好尽可能多地了解小波变换的原理。小波是如何构造的,它的性质是什么?连续小波变换的图像是怎么计算出来的呢?如何计算离散小波变换的每一层?只有学习了它们背后的数学公式,我们才能真正理解它。

小波变换的基本知识

边缘检测算子和小波变换提取图像边缘【matlab】

Roberts边缘检测算子:根据一对垂直方向上的差异计算梯度的原理,采用对角线方向相邻两像素的差异. 小波变换法更适合显示夹带在正常信号中的瞬时异常现象,具有方向敏感性.所以可以边缘检查 ...

基于小波变换的数字图像处理(MATLAB源代码)

基于小波变换的数字图像处理(MATLAB源代码) clear all; close all; clc;M=256.%原图像长度N=64; %水印长度[filename1,pathname]=uiget ...

CM 安装CDH 错误: 安装失败。 无法接收 Agent 检测信号发出。

在安装CDH错误提示: 安装失败. 无法接收 Agent 检测信号发出. 日志提示错误: start >> raise socket.error(msg) >>er ...

对AM信号FFT的matlab仿真

普通调幅波AM大信号包络检波频谱分析 u(t)=Ucm(1 macos ?t)cos ?ct ma称为调幅系数 其频谱由载波和上下边频组成 , 包络检波中的二极管切断负半周,然后使用电容器低通滤波器 ...

小波变换在matlab中的使用

一层分解信号 clc; clear; % 获取噪声信号 load('matlab.mat'); sig = M(1,1:1400); SignalLength = length(sig); %使 ...

matlab人眼检测工具箱+meanshift跟踪算法-人眼跟踪算法-跟踪算法-跟踪算法-跟踪算法-跟踪算法-跟踪算法-跟踪算法-跟踪算法-跟踪算法-跟踪算法-跟踪算法-跟踪算法-跟踪算法-跟踪算法-跟踪算法-跟踪算法-跟踪算法-跟踪算法-跟踪算法-跟踪算法-跟踪算法-跟踪算法-跟踪算法-跟踪算法-跟踪算法-跟踪算法-跟踪算法-跟踪算法-跟踪算法-跟踪算法-跟踪算法-跟踪算法-跟踪算法-跟踪算法-跟踪算法-跟踪算法-跟踪算法-跟踪算法-跟踪算法-跟踪算法-跟踪算法-跟踪算法-跟踪算法-跟踪算法-跟踪算法-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-跟踪算-

Viola-Jones 人眼检测算法 meanshift跟踪算法 这个代码是检测和跟踪视频中的人眼部分,用于检测matlab自带人眼检测工具箱 下面是matlab官网介绍了这个算法的一些东西 ...

paper 69:Haar-like矩形遍历检测窗口演示Matlab源代码[转载]

Haar-like矩形遍历检测窗口演示Matlab源代码 clc; clear; lose all; % Haar-like特征矩形计算 board = 24 % 检测窗口宽度 num = 24 % ...

(转)Haar-like矩形遍历检测窗口演示Matlab源代码

from:http://blog.sina.com.cn/s/blog_736aa0540101kzqb.html clc; clear; close all; % Haar-like特征矩形计算 b ...

matlab 霍夫变换—检测圆

function [hough_space,hough_circle,para] = hough_Circle(BW,step_r,step_angle,r_min,r_max,p) % %%%%%% ...

随机推荐

[JS进阶] 编写可维护性代码 (1)

今天的web应用大至成千上万行的javascript代码,执行各种复杂的过程,这种演化让我们开发者必须得对可维护性有一定的认识!编写可维护性代码很重要,很多情况下我们是以他人的工作成果为基础,确保代码 ...

给jdk写注释系列之jdk1.6容器(5)-LinkedHashMap源码解析

前面分析了HashMap的实现,我们知道其底层数据存储是一个hash表(数组+单向链表).接下来我们看一下另一个LinkedHashMap,它是HashMap的一个子类,他在HashMap的基础上维持 ...

使用BufferedReader的时候出现的问题

今天在使用BufferedReader的时候,出现了一个奇怪的问题 有时候换行的时候,行首会少一个字符 开始的代码是这样写的 while( br.read()!=-1 ){ String str = ...

UVa 357 - Let Me Count The Ways

题目大意:也是硬币兑换问题,与147.674用同样的方法即可解决. #include #include #define MAXN 3000 ...

翻译连载 | 附录 C:函数式编程函数库-《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇

标签: 736二极管

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台