本帖最后由 Adel 于 2020-4-22 17:18 编辑 信号见附件。使用matlab自带的小波阈值去噪函数去噪,阈值计算函数thselect和阈值处理函数wthresh,结果阈值计算都很大,刚好是每层系数(细节)的最大绝对值,这样在下步阈值处理时,也就将所有系数处理成了0.想请教为什么会这样,看网上别人有些用同样方法并不会这样,而是得到很好的去噪效果。 而且,我换了信号,也能得到去噪效果,难得是信号不同么??? 1、我的程序: clear all; clc; close all; fs=16000; %语音信号采样频率为16000 x1 = load('x1.mat'); x1 = x1.x1; t = 40e-3; % 40ms x1 = x1(1:fs*t); t_tick = 0:1/fs:t-1/fs; y1=fft(x1,1024); %对信号做1024点FFT变换 f=fs*(0:511)/1024; figure(1) plot(t_tick,x1) %做原始语音信号的时域图形 y=awgn(x1',10,'measured'); %加10db的高斯白噪声 [snr,mse]=snrmse(x1,y');%求得信噪比 均方误差 figure(2) plot(t_tick,y) %做加噪语音信号的时域图形 [c,l]=wavedec(y,3,'db1');%多尺度一维分解 %用db1小波对信号进行3层分解并提取系数 a3=appcoef(c,l,'db1',3); d3=detcoef(c,l,3); d2=detcoef(c,l,2); d1=detcoef(c,l,1); %阈值获取,使用Stein的无偏风险估计原理 % 问题在这,为什么得到的阈值都是各层系数的最大绝对值呢?于是下步阈值处理时,就将所有系数都处理成0了!!! thr1=thselect(d1,'rigrsure'); thr2=thselect(d2,'rigrsure'); thr3=thselect(d3,'rigrsure'); % 阈值处理,这里将系数全部处理成0了 gd1=wthresh(d1,'h',thr1); gd2=wthresh(d2,'h',thr2); gd3=wthresh(d3,'h',thr3); c1=[a3 gd3 gd2 gd1]; % 利用新的阈值进行处理 y1=waverec(c1,l,'db1');%多尺度重构 [snr,mse]=snrmse(x1,y1');%求得信噪比 均方误差 figure(3) plot(t_tick,y1); 下面是上述代码中的一个子函数代码,计算信噪比和MSE的: function [snr,mse]=snrmse(I,In) % 计算信噪比函数 % I :原始信号 % In:去噪后信号 snr=0; Ps=sum(sum((I-mean(mean(I))).^2));%signal power Pn=sum(sum((I-In).^2)); %noise power snr=10*log10(Ps/Pn); mse=Pn/length(I); end 2、换信号,matlab中构造: close all clear,clc snr=4; init=2055615866; %产生原始信号sref和高斯白噪声污染的信号s [sref,s]=wnoise(1,11,snr,init); [c,l]=wavedec(s,3,'db1');%多尺度一维分解 %用db1小波对信号进行3层分解并提取系数 a3=appcoef(c,l,'db1',3); d3=detcoef(c,l,3); d2=detcoef(c,l,2); d1=detcoef(c,l,1); thr1=thselect(d1,'rigrsure');%阈值获取,使用Stein的无偏风险估计原理 thr2=thselect(d2,'rigrsure'); thr3=thselect(d3,'rigrsure'); %利用改进阈值函数进行去噪处理。也相当于一种获取阈值,软阈值的一种 gd1=wthresh(d1,'h',thr1); gd2=wthresh(d2,'h',thr2); gd3=wthresh(d3,'h',thr3); c1=[a3 gd3 gd2 gd1]; % 利用新的阈值进行处理 y1=waverec(c1,l,'db1');%多尺度重构 figure plot(y1); zhh =1; |
483.23 KB, 下载次数: 26
17 条回复