查看: 430|回复: 7|关注: 0

[已答复] 小波去噪结果把有用信号去掉了,不知道是为什么?

[复制链接]

新手

7 麦片

财富积分


050


17

主题

53

帖子

0

最佳答案
发表于 2019-7-20 20:28:22 | 显示全部楼层 |阅读模式
本帖最后由 wuming123 于 2019-7-21 17:20 编辑

请老师帮我看一下,为什么我的小波去噪程序把有用的信号去掉了结果噪声确没怎么去掉?
程序:
clear all;
close all;
clc
m=audioread('C:\Users\张大少爷\Desktop\2.wav');  % 读入数据文件
s=m';
%整个信号的长度
N = numel(s);
%小波分解;
[c,l]=wavedec(s,7,'db5'); %小波基为db2,分解层数为7层
ca11=appcoef(c,l,'db5',7); %获取低频信号
cd1=detcoef(c,l,1);
cd2=detcoef(c,l,2); %获取高频细节
cd3=detcoef(c,l,3);
cd4=detcoef(c,l,4);
cd5=detcoef(c,l,5);
cd6=detcoef(c,l,6);
cd7=detcoef(c,l,7);
% cd8=detcoef(c,l,8);

%对信号进行强制去噪
sd1=zeros(1,length(cd1));
sd2=zeros(1,length(cd2)); %1-3层置0,4-7层用软阈值函数处理
sd3=zeros(1,length(cd3));
sd4=zeros(1,length(cd4));
sd5=zeros(1,length(cd5));
sd6=zeros(1,length(cd6));
sd7=zeros(1,length(cd7));
% sd8=zeros(1,length(cd8));

c1=[ca11 sd7,sd6,sd5,sd4,sd3,sd2,sd1];
s0=waverec(c1,l,'db5'); %小波重构
%默认阈值去噪
[thr,sorh,keepapp]=ddencmp('den','wv',s);
s1=wdencmp('gbl',c,l,'db5',7 ,thr,sorh,keepapp);
%软阈值去噪
%用给定的软阈值进行去噪处理
thr1=thselect(cd1,'rigrsure')%获取阈值,使用Stein的无偏风险估计原理
thr2=thselect(cd2,'rigrsure')
thr3=thselect(cd3,'rigrsure')
thr4=thselect(cd4,'rigrsure')%获取阈值,使用Stein的无偏风险估计原理
thr5=thselect(cd5,'rigrsure')
thr6=thselect(cd6,'rigrsure')
thr7=thselect(cd7,'rigrsure')
% thr8=thselect(cd8,'rigrsure')
cd1soft=wthresh(cd1,'s',thr1);
cd2soft=wthresh(cd2,'s',thr2);
cd3soft=wthresh(cd3,'s',thr3);
cd4soft=wthresh(cd4,'s',thr4);
cd5soft=wthresh(cd5,'s',thr5);
cd6soft=wthresh(cd6,'s',thr6);
cd7soft=wthresh(cd7,'s',thr7);
% cd8soft=wthresh(cd8,'s',thr8);
c3=[ca11  cd7soft cd6soft cd5soft cd4soft cd3soft cd2soft cd1soft];
s2=waverec(c3,l,'db5');
%用给定的硬阈值进行去噪处理
cd1hard=wthresh(cd1,'h',thr1);
cd2hard=wthresh(cd2,'h',thr2);
cd3hard=wthresh(cd3,'h',thr3);
cd4hard=wthresh(cd4,'h',thr4);
cd5hard=wthresh(cd5,'h',thr5);
cd6hard=wthresh(cd6,'h',thr6);
cd7hard=wthresh(cd7,'h',thr7);
% cd8hard=wthresh(cd8,'h',thr8);
% ca1=zero(1:length(ca11);
c4=[ca11  cd7hard cd6hard cd5hard cd4hard cd3hard cd2hard cd1hard];
s3=waverec(c4,l,'db5');
figure;
subplot(321);plot(s),title('原图');subplot(322);plot(s0),title('强制去噪');subplot(323);plot(s1),title('默认阈值去噪');
subplot(324);plot(s2),title('软阈值去噪'); subplot(325);plot(s3),title('硬阈值去噪');       %画图


untitled1.jpg

声音信号.zip

395.77 KB, 下载次数: 1

论坛优秀回答者

中级

785 麦片

财富积分


5001500


11

主题

696

帖子

83

最佳答案
  • 关注者: 65
发表于 2019-7-21 16:42:23 | 显示全部楼层
你所指的是在3种方式下都会把有用信号去除吗?第一种强制去燥方式可能会导致这种情况,因为细节参数里虽然大部分可能是噪声信号,但也存有一些有用信号成分。如果后面两种方式也存在这种情况, 要么是你的小波选择有问题,要么是你的分解层数有问题,要么就是你的阈值估算方式有问题。把这几种情况考虑进去,多调试看看能不能有得到你期望的结果。

新手

7 麦片

财富积分


050


17

主题

53

帖子

0

最佳答案
 楼主| 发表于 2019-7-21 17:17:24 | 显示全部楼层
谢谢老师的回答,我去调试一下看看

新手

7 麦片

财富积分


050


17

主题

53

帖子

0

最佳答案
 楼主| 发表于 2019-7-21 18:13:20 | 显示全部楼层
老师我改了还是不行,你看图片中的效果,机器噪声去除不掉,不知道怎么回事

论坛优秀回答者

中级

785 麦片

财富积分


5001500


11

主题

696

帖子

83

最佳答案
  • 关注者: 65
发表于 2019-7-22 16:19:33 | 显示全部楼层
wuming123 发表于 2019-7-21 10:13
老师我改了还是不行,你看图片中的效果,机器噪声去除不掉,不知道怎么回事 ...

一般情况下,7层分解基本上是够了。所以怀疑是你的小波选择可能不是很匹配,另外一个就是你换个阈值方式试试,比如sqtolwog,或者自己编写一个,在sqt的基础上修改成阈值估算跟每层的细节参数长度有关,而不是统一使用原信号长度。

新手

7 麦片

财富积分


050


17

主题

53

帖子

0

最佳答案
 楼主| 发表于 2019-7-22 20:39:21 | 显示全部楼层
老师您好,你看你能不能帮我调一下看看,我按你说的改了还是不太行

新手

7 麦片

财富积分


050


17

主题

53

帖子

0

最佳答案
 楼主| 发表于 2019-7-23 18:27:15 | 显示全部楼层
老师,我这个有用信号主要集中在高频,噪声信号集中在低频

论坛优秀回答者

中级

785 麦片

财富积分


5001500


11

主题

696

帖子

83

最佳答案
  • 关注者: 65
发表于 2019-7-26 04:13:52 | 显示全部楼层
wuming123 发表于 2019-7-23 10:27
老师,我这个有用信号主要集中在高频,噪声信号集中在低频

那看来你应该不是对细节参数进行处理啊,对approximation coeff (A)处理看看
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

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