suffer 发表于 2006-10-10 10:03

用MATLAB对语音信号进行小波分解重构

用MATLAB对一语音信号进行小波分解,然后对其各层系数进行处理以达到小波抑制的目的,重构处理后的信号,画出波形分析。

%装载原始信号
load sumsin;
s=sumsin;
%==============================
%设置小波名并利用coif3小波进行4层分解
w='coif3';
maxlev=4;
=wavedec(s,maxlev,w);
newc=c;
%==============================
%将分解后的第三、四层细节系数值为0
newc=wthcoef('d',c,l,);
%==============================
%在原始信号的时间区间内将第一层细节系数值为0
%并且将其他系数进行衰减,求出第一层系数起始点和终止点的
%索引值
k=maxlev+1;
first=sum(l(1:k-1))+1;
last=first+l(k-1);
indd1=first:last;
%==============================
%将系数除以3,进行信号衰减
newc(indd1)=c(indd1)/3;
%==============================
%在区间上求出第一层系数索引
indd1=(first+400/2):(first+600/2);
%==============================
%将该索引值置为0
newc(indd1)=zeros(size(indd1));
%==============================
%将第二层中相应于原始信号t=500的时间点处的系数置为4
k=maxlev;
first=sum(l(1:k-1))+1;
newc(first+500/2^2)=4;
%==============================
%综合修改后的分解结构
synth=waverec(newc,l,w);
%==============================
%用图示出上述修改结果
subplot(2,2,1);
plot(s);
title('原始信号');
subplot(2,2,2);
plot(c);
title('coif3小波分解后的系数');
subplot(2,2,3);
plot(synth);
title('小波抑制后的信号');
subplot(2,2,4);
plot(newc);
title('修改后的小波分解系数');

suffer 发表于 2006-10-10 10:04

用MATLAB实现对一语音信号用不同小波进行分解,提取各层的高低频系数,画出各系数波形,并重构。

t=0:1:100*pi;
s=sin(3*t)+sin(0.3t)+sin(0.03t);
subplot(6,2,1);plot(s);
title('原始信号s');
%====================================
%对s进行小波分解:db3   5层
=wavedec(s,5,'db3');
%====================================
%提取小波分解的低频系数
a5=appcoef(c,l,'db3',5);
a4=appcoef(c,l,'db3',4);
a3=appcoef(c,l,'db3',3);
a2=appcoef(c,l,'db3',2);
a1=appcoef(c,l,'db3',1);
%====================================
%提取小波分解的各层高频系数
d5=detcoef(c,l,5);
d4=detcoef(c,l,4);
d3=detcoef(c,l,3);
d2=detcoef(c,l,2);
d1=detcoef(c,l,1);       
%====================================
%绘出各系数的图形
subplot(6,2,3);plot(a5);
Ylabel('a5');
subplot(6,2,5);plot(a4);
Ylabel('a4');
subplot(6,2,7);plot(a3);
Ylabel('a3');
subplot(6,2,9);plot(a2);
Ylabel('a2');
subplot(6,2,11);plot(a1);
Ylabel('a1');
subplot(6,2,4);plot(d5);
Ylabel('d5');
subplot(6,2,6);plot(d4);
Ylabel('d4');
subplot(6,2,6);plot(d3);
Ylabel('d3');
subplot(6,2,8);plot(d2);
Ylabel('d2');
%====================================
%重构信号s
s1=waverec(c,l,'db1');
subplot(5,2,9);plot(s1);
Ylabel('s1');
%====================================
%下面用小波‘coif3’重复上述过程
=wavedec(s,3,'coif3');
a3=appcoef(c,l,'coif3',3);
d3=detcoef(c,l,3);
d2=detcoef(c,l,2);
d1=detcoef(c,l,1);
subplot(5,2,2);plot(a3);
Ylabel('a3');
subplot(5,2,4);plot(d3);
Ylabel('d3');
subplot(5,2,6);plot(d2);
Ylabel('d2');
subplot(5,2,8);plot(d1);
Ylabel('d1');
s2=waverec(c,l,'coif3');
subplot(5,2,10);plot(s2);
Ylabel('s2');

suffer 发表于 2006-10-10 10:05

用MATLAB对一图象分别用不同小波分解,观察高低频部分进行重构,比较重构误差,再进行阈值消噪,比较消噪前后图象。

load noiswom; %装载图像信号
whos
= swt2(X,1,'db1'); %完成图像的单层次小波分解
whos %观察各个系数向量的结构
figure(1);
map = pink(size(map,1)); %显示低频和高频系数
colormap(map)
subplot(2,2,1), image(wcodemat(swa,192));
title('Approximation swa')
subplot(2,2,2), image(wcodemat(swh,192));
title('Horiz. Detail swh')
subplot(2,2,3), image(wcodemat(swv,192));
title('Vertical Detail swv')
subplot(2,2,4), image(wcodemat(swd,192));
title('Diag. Detail swd')
A0 = iswt2(swa,swh,swv,swd,'db1'); %通过平稳小波逆变换重构图像
err = max(max(abs(X-A0))) %检查重构误差
nulcfs = zeros(size(swa)); %从第三步中产生的系数swa、swh、swv和swd构造第一层的低频和高频(A1、H1、V1和D1)部分
A1 = iswt2(swa,nulcfs,nulcfs,nulcfs,'db1');
H1 = iswt2(nulcfs,swh,nulcfs,nulcfs,'db1');
V1 = iswt2(nulcfs,nulcfs,swv,nulcfs,'db1');
D1 = iswt2(nulcfs,nulcfs,nulcfs,swd,'db1');
figure(2); %显示第一层的分解结果
colormap(map)
subplot(2,2,1), image(wcodemat(A1,192));
title('Approximation A1')
subplot(2,2,2), image(wcodemat(H1,192));
title('Horiz. Detail H1')
subplot(2,2,3), image(wcodemat(V1,192));
title('Vertical Detail V1')
subplot(2,2,4), image(wcodemat(D1,192));
title('Diag. Detail D1')
= swt2(X,3,'db1'); %采用db1来完成多尺度二维离散平稳小波分解
clear A0 A1 D1 H1 V1 err nulcfs %观察swa,swh,swv,swd的存储结构
whos
figure(3); %显示多尺度二维平稳小波分解结果
colormap(map)
kp = 0;
for i = 1:3
subplot(3,4,kp+1), image(wcodemat(swa(:,:,i),192));
title(['Approx. cfs level ',num2str(i)])
subplot(3,4,kp+2), image(wcodemat(swh(:,:,i),192));
title(['Horiz. Det. cfs level ',num2str(i)])
subplot(3,4,kp+3), image(wcodemat(swv(:,:,i),192));
title(['Vert. Det. cfs level ',num2str(i)])
subplot(3,4,kp+4), image(wcodemat(swd(:,:,i),192));
title(['Diag. Det. cfs level ',num2str(i)])
kp = kp + 4;
end
mzero = zeros(size(swd)); %从系数中重构第3层的低频信号
A = mzero;
A(:,:,3) = iswt2(swa,mzero,mzero,mzero,'db1');
H = mzero; V = mzero; %重构第1、2、3层的高频信号
D = mzero;
for i = 1:3
swcfs = mzero; swcfs(:,:,i) = swh(:,:,i);
H(:,:,i) = iswt2(mzero,swcfs,mzero,mzero,'db1');
swcfs = mzero; swcfs(:,:,i) = swv(:,:,i);
V(:,:,i) = iswt2(mzero,mzero,swcfs,mzero,'db1');
swcfs = mzero; swcfs(:,:,i) = swd(:,:,i);
D(:,:,i) = iswt2(mzero,mzero,mzero,swcfs,'db1');
end
A(:,:,2) = A(:,:,3) + H(:,:,3) + V(:,:,3) + D(:,:,3); %通过第3层的低频部分和第1、2、3层的高频部分重构第1、2层的低频部分
A(:,:,1) = A(:,:,2) + H(:,:,2) + V(:,:,2) + D(:,:,2);
figure(4); %显示第1、2、3层的低频和高频部分
colormap(map)
kp = 0;
for i = 1:3
subplot(3,4,kp+1), image(wcodemat(A(:,:,i),192));
title(['Approx. level ',num2str(i)])
subplot(3,4,kp+2), image(wcodemat(H(:,:,i),192));
title(['Horiz. Det. level ',num2str(i)])
subplot(3,4,kp+3), image(wcodemat(V(:,:,i),192));
title(['Vert. Det. level ',num2str(i)])
subplot(3,4,kp+4), image(wcodemat(D(:,:,i),192));
title(['Diag. Det. level ',num2str(i)])
kp = kp + 4;
end;
thr = 44.5; %阈值消噪
sorh = 's';
dswh = wthresh(swh,sorh,thr);
dswv = wthresh(swv,sorh,thr);
dswd = wthresh(swd,sorh,thr);
clean = iswt2(swa,dswh,dswv,dswd,'db1');
thr = 44.5;
sorh = 's';
dswh = wthresh(swh,sorh,thr);
dswv = wthresh(swv,sorh,thr);
dswd = wthresh(swd,sorh,thr);
clean = iswt2(swa,dswh,dswv,dswd,'db1');
figure(5); %对比消噪前后的图像
colormap(map)
subplot(1,2,1), image(wcodemat(X,192));
title('Original image')
subplot(1,2,2), image(wcodemat(clean,192));
title('De-noised image')
end

suffer 发表于 2006-10-10 10:07

用MATLAB对一语音信号进行小波分解,分别用强阈值,软阈值,默认阈植进行消噪处理。

%装载采集的信号leleccum.mat
load leleccum;
%=============================
%将信号中第2000到第3450个采样点赋给s
indx=2000:3450;
s=leleccum(indx);
%=============================
%画出原始信号
subplot(2,2,1);
plot(s);
title('原始信号');
%=============================
%用db1小波对原始信号进行3层分解并提取系数
=wavedec(s,3,'db1');
a3=appcoef(c,l,'db1',3);
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=;
s1=waverec(c1,l,'db1');
subplot(2,2,2);
plot(s1);grid;
title('强制消噪后的信号');
%=============================
%用默认阈值对信号进行消噪处理并图示结果
%用ddencmp函数获得信号的默认阈值
=ddencmp('den','wv',s);
s2=wdencmp('gbl',c,l,'db1',3,thr,sorh,keepapp);
subplot(2,2,3);
plot(s2);grid;
title('默认阈值消噪后的信号');
%=============================
%用给定的软阈值进行消噪处理
softd1=wthresh(d1,'s',1.465);
softd2=wthresh(d2,'s',1.823);
softd3=wthresh(d3,'s',2.768);
c2=;
s3=waverec(c2,l,'db1');
subplot(2,2,4);
plot(s3);grid;
title('给定软阈值消噪后的信号');

xiao1982 发表于 2010-9-29 01:51

回复 suffer 的帖子

请教:softd1=wthresh(d1,'s',1.465);softd2=wthresh(d2,'s',1.823);softd3=wthresh(d3,'s',2.768);中1.465、1.823、2.768这三个数值是怎么确定的?谢谢!

jrjian 发表于 2010-10-24 23:37

对c1=;
不是很懂呢,希望解释下,谢谢

happy 发表于 2010-10-25 08:01

xiao1982 发表于 2010-9-29 01:51 static/image/common/back.gif
回复 suffer 的帖子

请教:softd1=wthresh(d1,'s',1.465);softd2=wthresh(d2,'s',1.823);softd3=wthresh(d ...

根据基本的噪声类型,阈值的选取有以下4个规则,其中每一条规则对应于函数thselect中输入参数tptr的一个选项。
(1)选项tptr='rigrsure',是一种基于Stein无偏似然估计原理的自适应阈值选择。给定一个阈值t,得到它的似然估计,再将其似然最小化,就可得到所选的阈值。这是一种软件阈值估计器。
(2)选项tptr='sqtwolog',是一种固定的阈值形式,它所产生的阈值为sqrt(2*log(length(X)))。
(3)选项tptr='heursure',是前两种阈值的综合,所选择的是最优预测变量阈值。如果信噪比很小,而SURE估计有很大的噪声,此时就需要采用这种固定的阈值形式。
(4)选项tptr='minimaxi',也是一种固定的阈值形式,它所产生的是一个最小均方差的极值,而不是无误差。

happy 发表于 2010-10-25 08:05

jrjian 发表于 2010-10-24 23:37 static/image/common/back.gif
对c1=;
不是很懂呢,希望解释下,谢谢

这是强制消噪处理
强制消噪处理是把小波分解结构中的高频系数全部变为0,即把高频部分全部滤除掉,然后再对信号进行重构处理

jrjian 发表于 2010-10-26 11:08

当处理自己录制的语音时,总是在c1=;
地方出错,这几个参数都是小波分解自动产生的吧,出错的原因会在哪呢。谢谢

happy 发表于 2010-10-27 07:10

jrjian 发表于 2010-10-26 11:08 static/image/common/back.gif
当处理自己录制的语音时,总是在c1=;
地方出错,这几个参数都是小波分解自动产生的吧,出 ...

估计会是数据长度等问题造成的
你也不给个具体的错误信息之类的,别人没办法帮你

另外你所说“这几个参数”指得是什么?

ximeiji 发表于 2011-3-27 20:48

我在编写图像去噪时也总是在c1=;
这里出现错误,好像是维数不对,请问要怎么改啊?很急,希望您能帮我看看!
页: [1]
查看完整版本: 用MATLAB对语音信号进行小波分解重构