在求解信噪比时,加30db的高斯白噪声后所求得的信噪比不是30。而且理论上软阈值去噪效果应该是最好的,但是软阈值去噪后得到的信噪比却比其他方法要小,而且所有求得的信噪比数值都很小。我也在论坛里看到过类似的情况,但是自己还是没能解决,希望得到给位的指点教导,非常感谢!
clear all; clc; close all;
fs=8000; %语音信号采样频率为8000
xx=wavread('lw.wav');
x1=xx(:,1);%取单声道
t=(0:length(x1)-1)/8000;
y1=fft(x1,2048);
f=fs*(0:1023)/2048;
figure(1)
plot(t,x1) %做原始语音信号的时域图形
figure(2)
plot(f,abs(y1(1:1024))) %做原始语音信号的FFT频谱图
y=awgn(x1',30); %加30db的高斯白噪声
snr=SNR_singlech(x1,y')%求得信噪比
figure(3)
plot(t,y) %做加噪语音信号的时域图形
[c,l]=wavedec(y,3,'db1');%多尺度一维分解
%用db1小波对信号进行3层分解并提取系数
a3=appcoef(c,l,'db1',3);
%a2=appcoef(c,l,'db1',2);
%a1=appcoef(c,l,'db1',1);
d3=detcoef(c,l,3);
d2=detcoef(c,l,2);
d1=detcoef(c,l,1);
%对信号进行强制去噪
dd3=zeros(1,length(d3));
dd2=zeros(1,length(d2));
dd1=zeros(1,length(d1));
c1=[a3 dd3 dd2 dd1];
y3=waverec(c1,l,'db1');%多尺度小波变换重构
snr=SNR_singlech(x1,y3')%求得信噪比 均方误差
figure(4);
plot(t,y3);
title('强制消噪后语音信号');
%默认阀值去噪
[thr,sorh,keepapp]=ddencmp('cmp','wp',y);
y4=wdencmp('gbl',c,l,'db1',3,thr,sorh,keepapp);
snr=SNR_singlech(x1,y4')%求得信噪比
figure(5);
plot(t,y4);
title('默认阈值消噪后信号');
%软阀值去噪
thr1=thselect(d1,'rigrsure');%阈值获取,使用Stein的无偏风险估计原理
thr2=thselect(d2,'rigrsure');
thr3=thselect(d3,'rigrsure');
sd1=wthresh(d1,'s',thr1);
sd2=wthresh(d1,'s',thr2);
sd3=wthresh(d1,'s',thr3);
c2=[a3 sd3 sd2 sd1];
y5=waverec(c2,l,'db1');%多尺度重构
snr=SNR_singlech(x1,y5')%求得信噪比
figure(6);
plot(t,y5);
title('给定阈值(软)消噪后语音信号');
%进行硬阈值处理
hd1=wthresh(d1,'h',thr1);
hd2=wthresh(d2,'h',thr2);
hd3=wthresh(d3,'h',thr3);
c3=[a3 hd3 hd2 hd1];
y6=waverec(c3,l,'db1');
snr=SNR_singlech(x1,y6')%求得信噪比
figure(7);
plot(t,y6);
title('给定阈值(硬)消噪后语音信号');
另:
function snr=SNR_singlech(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);
2013-5-14 17:12 上传
点击文件名下载附件
391.91 KB, 下载次数: 3649
lw.wav