查看: 329|回复: 8|关注: 0

[已解决] 请教小波分析去漂移信号的问题

[复制链接]

新手

33 麦片

财富积分


050


8

主题

24

帖子

0

最佳答案
本人做电化学噪声分析,有一个基础问题:
我的目的是,经过小波变换后,去除漂移信号。其理论见下图片。
哪位高人能不能举了实例(给出代码)给我讲讲,这个是怎么将原信号分解,又怎么选择频率进行重构的呢??
疑问包括:
假如小波选择db2,进行4层分解。下图所指的低频信号,是通过每一层的近似系数进行重构获得漂移信号S(t)吗?然后用原始信号X(t)-S(t),获得去噪声的新X'(t)。
假如是,该如何重构呢?
谢谢大家了



1.png
2.png
3.png

论坛优秀回答者

中级

726 麦片

财富积分


5001500


11

主题

638

帖子

75

最佳答案
  • 关注者: 47
发表于 2019-3-15 19:08:53 | 显示全部楼层
楼主这个问题比较宽泛,回答的面比较大。那我尝试着简单的和你说一下小波去燥的大致过程。
1. 选择合适的小波,例如db2你所提到的。随着分解层数的增加,这个小波也会随之变化,只是变化频率,基本波形不会发生变化。层数越低频率越高。一层的小波频率肯定大于二层的。
2. 母小波经过每层变换后会和原信号做一个卷积运算,计算出变化后的小波和原信号的相关系数。
3. 经过1.2两个步骤后,分解到你设定的层数,例如4层你所提到的。分解结束。
4. 分解的最终结果是4个细节系数序列和一个近似系数序列。一般去燥是对细节系数进行处理。
5. 如何处理就又涉及到比较广的面,简单一点是,要对每个细节系数序列选择一个合适的阈值,大于该阈值的认为是信号内容保留,小于阈值的则全部抛弃。
6. 知道阈值后如何处理,又涉及软处理和硬处理,你自己选择一个合适的。
7. 以上这些步骤完成后即可对信号进行重构,从而不含有原先信号中的噪声成分。

在matlab里面,有wden这个指令可以直接调用。用你的作为例子来说:
dx = wden(x,tptr,sorh,'mln',lev,'db2');
具体说明是:
dx是去燥重构后的信号,
x是原信号(含噪声的),
tptr是选择阈值选择方法,wden里有4中可以选择,tptr里有例如rigrsure,sqwtolog等,
sorh就是选择软或硬阈值处理,
‘mln’是指每层都选择一个阈值进行处理,
lev是分解层数,
‘db2’就是所选择的母小波。

希望对你有所帮助。

新手

33 麦片

财富积分


050


8

主题

24

帖子

0

最佳答案
 楼主| 发表于 2019-3-15 23:53:29 | 显示全部楼层
ukjames 发表于 2019-3-15 19:08
楼主这个问题比较宽泛,回答的面比较大。那我尝试着简单的和你说一下小波去燥的大致过程。
1. 选择合适的小 ...

首先很感谢您的回复
也许我们的学科领域不同,你提到的去噪声是针对细节系数进行处理,也对就是将高频信号视为噪声去除。
而我做的电化学噪声处理领域认为,采集的信号f(x)=真实信号g(x)+漂移信号s(x),希望的是把低频的直流漂移或者低频的非线性漂移去除。

导师的意见是:重构信号就是去漂移信号,去除概貌信息,4层概貌信息设为零。
他这话的意思是不是将第4层的近似系数置零,重构小波分解向量,然后再重构信号
此时重构的信号就是把漂移信号去除了。

论坛优秀回答者

中级

726 麦片

财富积分


5001500


11

主题

638

帖子

75

最佳答案
  • 关注者: 47
发表于 2019-3-16 01:24:06 | 显示全部楼层
tjutjulee 发表于 2019-3-15 15:53
首先很感谢您的回复
也许我们的学科领域不同,你提到的去噪声是针对细节系数进行处理,也对就是将高频信 ...

如果是针对近似系数的话,那也好弄。更简单一些。就像你导师说的,直接把近似系数设置为0再重构就好了

新手

33 麦片

财富积分


050


8

主题

24

帖子

0

最佳答案
 楼主| 发表于 2019-3-16 09:18:55 | 显示全部楼层
ukjames 发表于 2019-3-16 01:24
如果是针对近似系数的话,那也好弄。更简单一些。就像你导师说的,直接把近似系数设置为0再重构就好了

...

谢谢回复
按照导师的意思写个代码跑完总是报错:到底是咋回事呢?? 请高手指点


报错信息:
错误使用 horzcat
串联的矩阵的维度不一致。


出错 Untitled5 (line 13)
c1=[ca4 d4 d3 d2 d1];%�



代码如下:
clear all;
clc;
load m.dat;
x=m;%原始数据
[c,l]=wavedec(x,4,'db2');
d1=detcoef(c,l,1);%提取第一层的细节分量
d2=detcoef(c,l,2);%提取第2层的细节分量
d3=detcoef(c,l,3);%提取第3层的细节分量
d4=detcoef(c,l,4);%提取第4层的细节分量
a4=appcoef(c,l,'db2',4);%提取第四层的近似分量
ca4=zeros(size(a4));%将第四层的近似系数置零

c1=[ca4 d4 d3 d2 d1];%重构小波分解向量,第四层的近似系数变为零
x1=waverec(c1,l,'db2');%重构信号
figure;
subplot(211);
plot(x);
title('原始信号');
subplot(212);
plot(x1);
title('重构信号');
原始数据在附件,请看看哪里的问题呢?

m.dat

18.68 KB, 下载次数: 1

新手

33 麦片

财富积分


050


8

主题

24

帖子

0

最佳答案
 楼主| 发表于 2019-3-16 09:25:10 | 显示全部楼层
ukjames 发表于 2019-3-16 01:24
如果是针对近似系数的话,那也好弄。更简单一些。就像你导师说的,直接把近似系数设置为0再重构就好了

...

还有一个问题,如果进行4层的分解,那每层都有一个近似系数a1/a2/a3/a4,那重构小波分解向量时,先把a4置零变为ca4,然后构造向量C1=[ca4 d4 d3 d2 d1],再构造信号。是这个样子吗?为啥matlab总报错说串联矩阵不匹配呢?

论坛优秀回答者

中级

726 麦片

财富积分


5001500


11

主题

638

帖子

75

最佳答案
  • 关注者: 47
发表于 2019-3-16 16:06:40 | 显示全部楼层
tjutjulee 发表于 2019-3-16 01:25
还有一个问题,如果进行4层的分解,那每层都有一个近似系数a1/a2/a3/a4,那重构小波分解向量时,先把a4置 ...

构造思路没有问题。现在报错的原因可能是c和c1不一致。你得看看c的性质,比如1*列数。再看看c1的。会不会c1是行数*1列这种可能,反之亦有这样的问题。一定要保证c和c1的维数一致。

论坛优秀回答者

中级

726 麦片

财富积分


5001500


11

主题

638

帖子

75

最佳答案
  • 关注者: 47
发表于 2019-3-16 16:10:26 | 显示全部楼层 |此回复为最佳答案
tjutjulee 发表于 2019-3-16 01:25
还有一个问题,如果进行4层的分解,那每层都有一个近似系数a1/a2/a3/a4,那重构小波分解向量时,先把a4置 ...

c1=[ca4; d4 ;d3; d2 ;d1];这样改就可以了。因为你的c是行数*1列,所以你再构建c1时也要注意这个问题,你原来的构造方式会导致矩阵维数不一致,从而报错。

新手

33 麦片

财富积分


050


8

主题

24

帖子

0

最佳答案
 楼主| 发表于 2019-3-18 23:16:32 | 显示全部楼层
ukjames 发表于 2019-3-16 16:10
c1=[ca4; d4 ;d3; d2 ;d1];这样改就可以了。因为你的c是行数*1列,所以你再构建c1时也要注意这个问题 ...

谢谢,这个是关键
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

快速回复 返回顶部 返回列表