基于matlab的语音信号滤波去噪 下载本文

内容发布更新时间 : 2024/12/23 12:53:33星期一 下面是文章的全部内容请认真阅读。

宿州学院毕业设计 去噪和仿真的研究

加噪语音信号时域波形10.5幅值A0-0.5-100.20.40.60.81时间轴1.21.41.61.8x 1025加噪语音信号频谱图15001000频率幅值500000.51频率Hz1.522.5x 104

图4 加噪信号时域波形和频谱

再通过对原始语音信号的回放效果与加噪后的语音信号回放的效果的对比,人耳可以明显辨别出两种语音信号不一样了,加噪后的语音信号在听觉上比原始语音信号要浑浊很多,而且还有吱吱嘎嘎的混杂音。

3.4 去噪及仿真

(1)FIR滤波器法去噪

通过对上一节中加噪语音信号和原始语音信号频谱图对比可以知道,噪音大部分是Hz大于5000的部分,故设计低通滤波器进行滤波处理。接下来我们要用设计的FIR低通滤波器对上一节中加噪语音信号进行滤波处理。

用自己设计的FIR数字低通滤波器对加噪的语音信号进行滤波时,在Matlab中,FIR滤波器利用函数fft对信号进行滤波。函数fft用的是重叠相加法实现线性卷积的计算。调用格式为:y=fft(h,x,M)。其中,h是系统单位冲击响应向量;x是输入序列向量;y是系统的输出序列向量,M是有用户选择的输入序列的分段长度,缺省时,默认的输入向量的重长度M=512。 用设计好的FIR数字低通滤波器对加噪语音信号的滤波程序:

[y,fs,bits]=wavread('chushi.wav'); sound(y,fs) n=length(y) y_p=fft(y,n);

·

11

宿州学院毕业设计 去噪和仿真的研究

f=fs*(0:n/2-1)/n;figure(1) subplot(2,1,1); plot(y);

title('原始语音信号采样后的时域波形'); xlabel('时间轴') ylabel('幅值A') subplot(2,1,2); plot(f,abs(y_p(1:n/2)));

title('原始语音信号采样后的频谱图'); xlabel('频率Hz'); ylabel('频率幅值'); L=length(y)

noise=0.1*randn(L,2); y_z=y+noise; sound(y_z,fs) n=length(y); y_zp=fft(y_z,n); f=fs*(0:n/2-1)/n;figure(2) subplot(2,1,1);plot(y_z); title('加噪语音信号时域波形'); xlabel('时间轴') ylabel('幅值A')

subplot(2,1,2);

plot(f,abs(y_zp(1:n/2))); title('加噪语音信号频谱图'); xlabel('频率Hz'); ylabel('频率幅值'); Ft=8000; Fp=1000; Fs=1200; wp=2*Fp/Ft; ws=2*Fs/Ft; rp=1;rs=50;

p=1-10.^(-rp/20);s=10.^(-rs/20); fpts=[wp ws];

·

12

宿州学院毕业设计 去噪和仿真的研究

mag=[1 0];dev=[p s];

[n21,wn21,beta,ftype]=kaiserord(fpts,mag,dev); b21=fir1(n21,wn21,Kaiser(n21+1,beta)); [h,w]=freqz(b21,1);plot(w/pi,abs(h)); title('FIR低通滤波器');x=fftfilt(b21,y_z); X=fft(x,n);figure(4);

subplot(2,2,1);plot(f,abs(y_zp(1:n/2))); title('滤波前信号的频谱'); subplot(2,2,2);plot(f,abs(X(1:n/2))); title('滤波后信号的频谱'); subplot(2,2,3);plot(y_z); title('滤波前信号的时域波形') subplot(2,2,4);plot(x); title('滤波后信号的时域波形') sound(x,fs,bits) 而后得到图像如图5所示:

滤波前信号的频谱150010005000150010005000滤波后信号的频谱0123401234x 10滤波前信号的时域波形10.50-0.5-100.511.5x 10x 10滤波后信号的时域波形10.50-0.525-100.511.5x 1025

图5 FIR滤波效果图

·

13

宿州学院毕业设计 去噪和仿真的研究

分析:从以上四图的比较,可以很明显和直观的看出原始语音信号和加噪语音信号时域波形和频谱图的区别。加噪后的语音信号的时域波形比原始语音信号要模糊得多,频谱图则是在频率5000Hz以后出现了明显的变化。

通过滤波前的信号波形和频谱图的对比,可以明显看出,滤波后的波形开始变得清晰了,开始有点接近原始信号的波形图了。滤波后信号的频谱图也在5000Hz以后开始逐渐接近原始语音信号的频谱图。

再从对语音信号的回放,人耳可以辨别出加噪后的语音信号比较浑浊,还有很明显嘎吱嘎吱的杂音在里面。滤波后,语音信号较加噪后的信号有了明显的改善,基本可以听清楚了,而且杂音也没有那么强烈,但是声音依然没有原始语音信号那么清晰脆耳。 (2)IIR滤波器法去噪

同样,也设计一个IIR低通滤波器对加噪语音信号进行内部处理,程序如下: Ft=8000; Fp=1000; Fs=1200; wp=2*pi*Fp/Ft; ws=2*pi*Fs/Ft; fp=2*Ft*tan(wp/2); fs=2*Fs*tan(wp/2);

[n11,wn11]=buttord(wp,ws,1,50,‘s'); %求低通滤波器的阶数和截止频率 [b11,a11]=butter(n11,wn11,'s'); %求S域的频率响应的参数

[num11,den11]=bilinear(b11,a11,0.5); %双线性变换实现S域到Z域的变换 [h,w]=freqz(num11,den11); %根据参数求出频率响应 plot(w*8000*0.5/pi,abs(h)); legend('用butter设计'); grid;

[y,fs,nbits]=wavread ('BYSJ.wav');

n=length(y); %求出语音信号的长度 noise=0.01*randn(n,2); %随机函数产生噪声 s=y+noise; %语音信号加入噪声 S=fft(s); %傅里叶变换 z11=filter(num11,den11,s); sound(z11);

m11=fft(z11); %求滤波后的信号 subplot(2,2,1);

·

14

宿州学院毕业设计 去噪和仿真的研究

plot(abs(S),'g');

title('滤波前信号的频谱'); grid;

subplot(2,2,2); plot(abs(m11),'r'); title('滤波后信号的频谱'); grid;

subplot(2,2,3); plot(s);

title('滤波前信号的波形'); grid;

subplot(2,2,4); plot(z11);

title('滤波后的信号波形'); 得到图像如下:

滤波前信号的频谱150010005000150010005000滤波后信号的频谱00.511.5x 102500.511.5x 1025滤波前信号的波形10.50-0.5-100.511.5x 1025滤波后的信号波形10.50-0.5-100.511.5x 1025图6 IIR滤波效果图

通过运行程序,我们可以听出,滤波效果很不好,失真现象严重,并且出现了严重的寄生震荡,基本无法分辨出原语音信号。

·

15