基于听觉特性的小波包语音增强算法Matlab实现程序 联系客服

发布时间 : 星期日 文章基于听觉特性的小波包语音增强算法Matlab实现程序更新完毕开始阅读8d3e2992daef5ef7ba0d3ccb

本文基于听觉特性的小波包语音增强算法Matlab实现程序如下:

说明:1.“D:\\EXPERI\\”为实验中纯净语音素材和生成的带噪语音以及增强后的 语音在PC中的存放路径。

2.可以通过改变SNR的具体值根据需要将生成的带噪语音信号的信噪比 设为任意合理值。

3.实验中我们将Matlab的wthresh.m文件中的库函数wthresh(x,sorh,t) 就行了修改,sorh增加了一种类型'n',该类型代表论文中提出的新的 阈值函数类型。

a)生成混杂白噪声的带噪语音部分 %读入纯净语音并显示

x=wavread('D:\\EXPERI\\clean.wav'); subplot(3,1,1); plot(x);

axis([0 55521-0.5 0.5]); x1=length(x); %给定信噪比 SNR=5;

%利用信噪比和语音能量求得要添加的白噪声 clean_energy=sum(x.*x);

addnoise_energy=clean_energy*(10^-(SNR/10)); noise=normrnd(0,1,x1,1);

noise_energy=sum(noise.*noise);

q=addnoise_energy/noise_energy;noise_new=sqrt(q)*noise; %在纯净语音中加入白噪声 y=x+noise_new;

%将数据写入语音文件并显示

wavwrite(y,8000,'D:\\EXPERI\\WN_clean.wav'); subplot(3,1,2); plot(y);

axis([0 55521-0.5 0.5]);

b)基于听觉特性的小波包语音增强算法实现部分 ork小波包分解

x=wavread('D:\\EXPERI\\WN_clean.wav'); wptree=wpdec(x,7,'db5');

%把Bark小波分解包中的第五层的叶结点合并 for k=47:62

wptree=wpjoin(wptree,k); end

%把Bark小波分解包中的第六层的叶结点合并 for k=79:86

wptree=wpjoin(wptree,k); end

for k=91:94

wptree=wpjoin(wptree,k);

end

%plot(wptree);

%将各节点按相应阈值进行处理 sorh='n';%所选阈值函数 %-----------

%处理7层节点 %-----------

for i=0:31c70(:,i+1)=wpcoef(wptree,[7 i]); q70=median(abs(c70(:,i+1)));

arr70(i+1)=(q70/0.6745).*sqrt(2*log(442)); if(i>0)

c70(:,i+1)=wthresh(c70(:,i+1),sorh,arr70(i+1));

wptree=write(wptree,'data',[7 i],c70(:,i+1));%修改节点系数值 end end

for i=48:55

c71(:,i-47)=wpcoef(wptree,[7 i]); q71=median(abs(c71(:,i-47)));

arr71(i-47)=(q71/0.6745).*sqrt(2*log(442)); c71(:,i-47)=wthresh(c71(:,i-47),sorh,arr71(i-47)); wptree=write(wptree,'data',[7 i],c71(:,i-47)); %修改节点系数值 end

%-----------

%处理6层节点 %----------- for j=16:23

c60(:,j-15)=wpcoef(wptree,[6 j]); q60=median(abs(c60(:,j-15)));

arr60(j-15)=(q60/0.6745).*sqrt(2*log(876)); c60(:,j-15)=wthresh(c60(:,j-15),sorh,arr60(j-15)); wptree=write(wptree,'data',[6 j],c60(:,j-15)); %修改节点系数值 end

for j=28:31

c61(:,j-27)=wpcoef(wptree,[6 j]); q61=median(abs(c61(:,j-27)));

arr61(j-27)=(q61/0.6745).*sqrt(2*log(876)); c61(:,j-27)=wthresh(c61(:,j-27),sorh,arr61(j-27)); wptree=write(wptree,'data',[6 j],c61(:,j-27)); %修改节点系数值end %-----------

%处理5层节点 %-----------

for k=16:31

c5(:,k-15)=wpcoef(wptree,[5 k]); q5=median(abs(c5(:,k-15)));

arr5(k-15)=(q5/0.6745).*sqrt(2*log(1743)); c5(:,k-15)=wthresh(c5(:,k-15),sorh,arr5(k-15));

wptree=write(wptree,'data',[5 k],c5(:,k-15));%修改节点系数值 end

%重建信号

y=wprec(wptree); subplot(3,1,3); plot(y);

axis([0 55521-0.5 0.5]);

wavwrite(y,8000,'D:\\EXPERI\\WtDeSpeech.wav'); c)修改后的wthresh.m文件 function y=wthresh(x,sorh,t)

%WTHRESH Perform soft、hard and new thresholding. switch sorh case's'

tmp=(abs(x)-t);

tmp=(tmp+abs(tmp))/2; y=sign(x).*tmp; case'h'

y=x.*(abs(x)>t); case'n'

tmp=(sign(x).*(t/((exp(4.*t)-exp(2.*t)))).*(exp(4.*abs(x)) -exp(2.*t)));

y=tmp.*(abs(x)>(t/2)&(abs(x)<=t))+x.*(abs(x)>t);otherwise

error('Invalid argument value.')MATLAB的Wavelet Toolbox中有着丰富的有关小波包的m文件。但是,随着

MATLAB版本的变化,这些m文件也不断的变化(包括名称和调用格式)。在MATLAB 6.5中,有关小波包的m文件共有16个,大体可以分为三部分,其名称和功能 分别是:

1.用于小波包分解的m文件

·wpdec一维小波包分解,返回小波包分解

·wpdec2二维小波包分解,返回对应数据阵的分解树

·wpsplt对小波包分解树的某个节点再分解,返回新的分解树 ·wpcoef提取分解树中某一个节点处的小波包系数 ·wpfun对给定的小波名字wname,生成相应的小波包 ·wp2wtree从小波包分解树中提取小波树

·wenergy分别计算小波包分解后概貌和细节的能量百分比 2.用于小波包重构的m文件

·wprcoef小波包系数重构,即计算小波包分解树某一节点处的重构系数 ·wprec一维小波包重构,即返回对应小波包分解树的重建向量 ·wprec2二维小波包重构

3.用于小波包分解结构操作的m文件 ·wpcutree剪切小波包分解树 ·wpjoin重新组合小波包

·bestlevt计算完整的最佳小波包树 ·besttree计算最佳的小波包分解树 ·wentropy计算小波包的熵

·entrupd更新小波包的熵值本论文的工作是在我的导师郭继昌教授的指导下完成的。在我课题研究期

间,郭老师在学术方面给予我悉心的指导,从而使得课题的研究可以顺利完成。 郭老师渊博的学识、严谨的治学态度和高度的敬业精神都使我受益匪浅。在此我 还要衷心地感谢郭老师这两年半在生活上对我的关怀和帮助。

课题进行期间,实验室的董健博士、陈敏俊硕士、赖焰根硕士等同学都给予 了很大的帮助和支持。尤其要感谢的是董健博士,董师兄在课题研究期间的指导 和建议是课题顺利完成的重要保障。

我还要感谢在华为3com实习期间的领导和同事,项目经理汪勇、潘锡东和

指导老师王鹏举都对我的工作给予过很大的帮助,工作中他们投入的态度对我有 很大的触动和影响。还要感谢一起实习的高磊、赵红红、韩丁、赵锋等同学,正 是大家的互相帮助、和睦相处使得在异地的工作、生活愉快而且充实,直到现在 我都非常怀念大家在一起的那些日子。

最后我要感谢我的家人和朋友,是你们的爱让我在人生的道路上永远都不会 感到无助和寂寞。