《谱减法语音增强》
课程设计报告
专 业: 通信工程 班 级: 姓 名: 指导教师:
2012年 5 月 25 日
目 录
一、实验目的·······································2 二、实验原理·······································2 三、谱减法·········································2 四、实验程序代码···································3
五、实验效果图·····································6
六、参考文献·······································6
- 1 -
一、实验目的
1.学会MATLAB的使用,掌握MATLAB的程序设计方法; 3.掌握语音处理的基本概念、基本理论和基本方法; 4.掌握基于MATLAB编程实现普检法语音增强; 5.学会用MATLAB对信号进行分析和处理。
二、实验原理
谱减法是利用噪声的统计平稳性以及加性噪声与语音不相关
的特点而提出的一种语音增强方法。这种方法没有使用参考噪声源,但它假设噪声是统计平稳的,即有语音期间噪声幅度谱的期望值与无语音间隙噪声的幅度谱的期望值相等。用无语音的间隙测量计算得到的噪声频谱的估计值取代有语音的期间噪声的频谱,与含噪声语音频谱相减的估计值。当上述差值得到负的幅度值时,将其置零。由于人耳对语音的感知主要是通过语音信号中各频谱分量幅度获得的,对各分量的相位不敏感。因此,此类语音增强方法将估计的对象放在短时谱幅度上。 ·三、谱减法
使用谱减法是假设: ① 噪声叠加; ② 声与语音不相关;
- 2 -
③对纯净语音无先验知识; ③ 对统计噪声有先验知识。 带噪语音模型为:
y(n)=x(n)+v(n)
式中,y(n)是带噪语音,s(n)是纯净语音,v(n)是噪声。对式子两边进行傅立叶变换,得
Y(k)=X(k)+N(k)
由于对噪声的统计参数的未知,所以在实际应用中,通常使用非语音段噪声谱的均值来作为对噪声谱N(k)的估计,
则对纯净语音幅度谱的估量表示为
把带噪语音的相位的估量为:
当作是纯净语音的相位,那么纯净语音频谱
四、实验程序代码
% speechenhancement.m
clear all;
%-------------------------------读入语音文件
------------------------------------------------------------
[speech,fs,nbits]=wavread('speech_clean1.wav'); %读入数
- 3 -
据
%-------------------------------参数定义
----------------------------------------------------------------
winsize=256; %窗长 n=0.04; %噪声水平 size=length(speech); %语音长度 numofwin=floor(size/winsize); %帧数 ham=hamming(winsize)'; %产生哈明窗 hamwin=zeros(1,size); %定义哈明窗的长度 enhanced=zeros(1,size); %定义增强语音的长度 x=speech'+ n*randn(1,size); %产生带噪信号 noisy=n*randn(1,winsize); %噪声估计 N = fft(noisy); %对噪声傅里叶变换 nmag= abs(N); %噪声功率谱 %-------------------------------分帧
-------------------------------------------------------------------- for q=1:2*numofwin-1
frame=x(1+(q-1)*winsize/2:winsize+(q-1)*winsize/2); %对带噪语音帧间重叠一半取值
hamwin(1+(q-1)*winsize/2:winsize+(q-1)*winsize/2)=...
hamwin(1+(q-1)*winsize/2:winsize+(q-1)*winsize/2)+ham; %加窗 y=fft(frame.*ham); %对带噪语音傅里叶变换 mag = abs(y); %带噪语音功率谱 phase = angle(y); %带噪语音相位 %-------------------------------幅度谱减
------------------------------------------------------------------- for i=1:winsize if mag(i)-nmag(i)>0 clean(i)= mag(i)-nmag(i); else clean(i)=0; end end
%---------------------------%在频域中重新合成语音------------------------------------------------- spectral= clean.*exp(j*phase);
%------------------------反傅里叶变换并重叠相加--------------------------------------------------- enhanced(1+(q-1)*winsize/2:winsize+(q-1)*winsize/2)=...
enhanced(1+(q-1)*winsize/2:winsize+(q-1)*winsize/2)+real(ifft(spectral)); end
%---------------------------除去Hamming窗引起的增益----------------------------------------------- for i=1:size
- 4 -

