清华大学数字语音处理之语音增强

更新时间:2023-09-27 19:39:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

数字语音处理之语音增强

MATLAB仿真

学 校 清华大学

专 业 通 信 工 程

班 级 x xxx 学 号 xxx 姓 名 x x x

xxxx年xx月xx日

目 录

一、引言………………………………………………………1 二、语音增强算法……………………………………………1 1、算法 ………………………………………………………1 2、算法实现(源程序)………………………………………2 3、改善算法,减少噪声干扰 ………………………………6

一、引言

语音增强的目标是从含有噪声的语音信号中提取尽可能纯净的原始语音。然而,由于干扰通常都是随机的,从带噪语音中提取完全纯净的语音几乎不可能。在这种情况下,语音增强的目的主要有两个:一是改进语音质量,消除背景噪音,使听者乐于接受,不感觉疲劳,这是一种主观度量;二是提高语音可懂度,这是一种客观度量。这两个目的往往不能兼得,所以实际应用中总是视具体情况而有所侧重的。

带噪语音的噪声类型可以分为加性噪声和非加性噪声。加性噪声有宽带的,窄带的,平稳的,非平稳的,白噪声,有色噪声,等;非加性噪声如乘性噪声,卷积噪声等。一般,语音增强处理的噪声指环境中的噪声,而这些噪声主要是高斯白噪声,这种噪声一般符合如下的假设:

(1)噪声是加性的。

(2)噪声是局部平稳的。局部平稳是指一段加噪语音中的噪声,具有和语音 段开始前那段噪声相同的统计特性,且在整个语音段中保持不变。也就是说,可 以根据语音开始前那段噪声来估计语音中所叠加的噪声统计特性。

(3)噪声与语音统计独立或不相关。

二、语音增强算法

根据语音和噪声的特点,出现了很多种语音增强算法。比较常用的有噪声对消法、谱相减法、维纳滤波法、卡尔曼滤波法、FIR 自适应滤波法等。此外,随着科学技术的发展又出现了一些新的增强技术,如基于神经网络的语音增强、基于HMM 的语音增强、基于听觉感知的语音增强、基于多分辨率分析的语音增强、基于语音产生模型的线性滤波法、基于小波变换的语音增强方法、梳状滤波法、自相关法、基于语音模型的语音增强方法等。

此处主要介绍谱减法。

1、算法

使用谱减法是假设: ① 噪声叠加; ② 声与语音不相关;

③对纯净语音无先验知识; ③ 对统计噪声有先验知识。 带噪语音模型为:

y(n)=x(n)+v(n)

式中,y(n)是带噪语音,s(n)是纯净语音,v(n)是噪声。对式子两边进行傅立叶变换,得

Y(k)=X(k)+N(k)

由于对噪声的统计参数的未知,所以在实际应用中,通常使用非语音段噪声谱的均值来作为对噪声谱N(k)的估计,

1

则对纯净语音幅度谱的估量表示为

把带噪语音的相位

当作是纯净语音的相位,那么纯净语音频谱的估量为

2、算法实现(源程序)

%Spectral Subtraction Algorithm winsize=256; %窗长 n=0.05; % 噪声电平

[speech,fs,nbits]=wavread('shewai.wav'); % 读入数据 size=length(speech);

numofwin=floor(size/winsize); % 帧数

%加窗

ham=hamming(winsize)'; %Generates Hamming Window hamwin=zeros(1,size); %Vector for window gain enhanced=zeros(1,size); %Vector for enhanced speech

%产生带噪声信号

x=speech'+ n*randn(1,size); %Contaminates signal with white noise %噪声估计

noise=n*randn(1,winsize); %Sample of noise N = fft(noise);

nmag= abs(N); %Estimated noise magnitude spectrum for q=1:2*numofwin-1

frame=x(1+(q-1)*winsize/2:winsize+(q-1)*winsize/2); P percent overlap

hamwin(1+(q-1)*winsize/2:winsize+(q-1)*winsize/2)=hamwin(1+(q-1)*winsize/2:winsize+(q-1)*winsize/2)+ham; %Window gain %对带噪声语音进行DFT y=fft(frame.*ham);

mag = abs(y); %Magnitude Spectrum phase = angle(y); %Phase Spectrum %幅度谱减

for i=1:winsize

2

if mag(i)-nmag(i)>0

clean(i)= mag(i)-nmag(i); else

clean(i)=0; end end

%在频域中重新合成语音

spectral= clean.*exp(j*phase);

%IDFT 并重叠想加

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

%除去汉宁窗引起的增益 for i=1:size if hamwin(i)==0

enhanced(i)=0; else

enhanced(i)=enhanced(i)/hamwin(i); end end

SNR1 = 10*log10(var(speech')/var(noise)); %加噪语音信噪比

SNR2 = 10*log10(var(speech')/var(enhanced-speech')); %增强语音信噪比 wavwrite(x,fs,nbits,'noise.wav'); %输出带噪信号

wavwrite(enhanced,fs,nbits,'enhanced.wav'); %输出增强信号 t=1:size;

figure(1),subplot(3,1,1);plot(t/fs,speech'); %原始语音波形 xlabel('time(s)');

title(['Original Voice (n=',num2str(n),')' ]); figure(2),specgram(speech'); %原始语音语谱

title(['Original Voice (n=',num2str(n),')' ]); figure(1),subplot(3,1,2); plot(t/fs,x); xlabel('time(s)');

title(['Noise Added (SNR=',num2str(SNR1),'dB)']); figure(3),specgram(x); %加噪语音语谱

title(['Noise Added (SNR=',num2str(SNR1),'dB)']); figure(1),subplot(3,1,3);plot(t/fs,enhanced); xlabel('time(s)');

title(['Improved Voice (SNR=',num2str(SNR2),'dB)']); figure(4),specgram(enhanced); %增强语音语谱

title(['Improved Voice (SNR=',num2str(SNR2),'dB)']);

运行结果:

3

本文来源:https://www.bwwdw.com/article/fm1d.html

Top