MATLAB的有噪声的语音信号分析与处理设计武汉理工大学.docx
《MATLAB的有噪声的语音信号分析与处理设计武汉理工大学.docx》由会员分享,可在线阅读,更多相关《MATLAB的有噪声的语音信号分析与处理设计武汉理工大学.docx(26页珍藏版)》请在冰点文库上搜索。
MATLAB的有噪声的语音信号分析与处理设计武汉理工大学
目录
1.课程设计目的………………………………………………………………(4)
2.课程设计基本要求……………………………………………...………….(4)
3.课程设计内容………………………………………..……………………..(4)
4.课程设计实现……………………………………………………..…..……………(4)
(1)语音信号的采集……………………………………………………..(4)
(2)语音信号的时频分析………………………………………………..(5)
(3)语音信号加噪与频谱分析…………………………………………..(5)
(4)设计FIR和IIR数字滤波器………………………………………..(8)
(5)用滤波器对加噪语音信号进行滤波……………………………….
(6)比较滤波前后语音信号的波形及频谱…………………
(7)回放语音信号……………………………………….
5、心得体会……………………………………………..……………………..(11)
6、参考文献…………………………………….……………………………..(11)
基于MATLAB的有噪声的语音信号分析与处理设计
1.课程设计目的
综合运用数字信号处理的理论知识对语音信号进行时频分析和滤波器设计,通过理论推导得出相应结论,再利用MATLAB作为编程工具进行计算机实现,从而加深对所学知识的理解,建立概念。
2.课程设计基本要求
1)学会MATLAB的使用,掌握MATLAB的程序设计方法。
2)掌握在Windows环境下语音信号采集的方法。
3)掌握数字信号处理的基本概念、基本理论和基本方法。
4)掌握MATLAB设计FIR和IIR数字滤波器的方法。
5)学会用MATLAB对信号进行分析和处理。
3.课程设计内容
1)选择一个语音信号作为分析对象,或录制一段语音信号;
2)对语音信号进行采样,画出采样后语音信号的时域波形和频谱图;
3)利用MATLAB中的随机函数产生噪声加入到语音信号中,使语音信号被污染,然后进行频谱分析;
4)设计FIR和IIR数字滤波器,并对被噪声污染的语音信号进行滤波,画出滤波前后信号的时域波形和频谱,并对滤波前后的信号进行比较,分析信号的变化;
5)回放语音信号。
4.课程设计实现
(1)语音信号的采集
利用PC机上的声卡和WINDOWS操作系统可以进行数字信号的采集。
将话筒输入计算机的语音输入插口上,启动录音机。
按下录音按钮,接着对话筒说话“语音信号处理”,说完后停止录音,屏幕左侧将显示所录声音的长度。
点击放音按钮,可以实现所录音的重现。
以文件名“speech”保存入g:
\MATLAB\work中。
可以看到,文件存储器的后缀默认为.wav,这是WINDOWS操作系统规定的声音文件存的标准。
(2)语音信号的时频分析
Matlab软件平台下,利用wavread函数对语音信号进行采样,记住采样频率和采样点数
Wavread函数调用格式
y=wavread(file)%读取file所规定的wav文件,返回采样值放在向量y中。
[y,fs,nbits]=wavread(file)%采样值放在向量y中,fs表示采样频率(hz),nbits表示采样位数。
y=wavread(file,N)%读取钱N点的采样值放在向量y中。
y=wavread(file,[N1,N2])%读取从N1到N2点的采样值放在向量y中。
对语音信号speech.wav进行采样其程序如下:
[y,fs,nbits]=wavered('speech');%把语音信号进行加载入Matlab仿真软件平台中
fs=
8000
nbits=
16
首先画出语音信号的时域波形,然后对语音信号进行频谱分析。
在matlab中利用fft对信号进行快速傅里叶变换,得到信号的频谱特性。
其程序如下:
[y,fs,nbits]=wavread('speech');
sound(y,fs,nbits);%回放语音信号
n=length(y);%求出语音信号的长度
Y=fft(y,n);%傅里叶变换
subplot(2,1,1);plot(y);title('原始信号波形');
subplot(2,1,2);plot(abs(Y));title('原始信号频谱')
程序结果如下图:
(3)语音信号加噪与频谱分析
利用MATLAB中的随机函数(rand或randn)产生噪声加入到语音信号中,模仿语音信号被污染,并对其频谱分析。
其程序如下:
[y,fs,nbits]=wavread('speech');
n=length(y);%求出语音信号的长度
noise=0.01*randn(n,2);%随机函数产生噪声
s=y+noise;%语音信号加入噪声
sound(s);
subplot(2,1,1);
plot(s);title('加噪语音信号的时域波形');
S=fft(s);%傅里叶变换
subplot(2,1,2);
plot(abs(S));title('加噪语音信号的频域波形')
程序结果如下图:
(4)设计FIR和IIR数字滤波器
根据语音信号的特点给出有关滤波器的新能指标:
1低通滤波器的性能指标
fp=1000Hz,fc=1200Hz,As=100db,Ap=1dB
2高通滤波器的性能指标
fp=4800Hz,fc=5000Hz,As=100dB,Ap=1dB;
3带通滤波器的性能指标
fp1=1200Hz,fp2=3000hZ,fc1=1000Hz,fc2=3200Hz,
As=100dB,Ap=1dB
在Matlab中,可以利用函数fir1设计FIR滤波器,利用函数butter,cheby1和ellip设计IIR滤波器,利用Matlab中的函数freqz画出各步步器的频率响应。
分析如下:
函数fir1默认的设计滤波器的方法为窗函数法,其中可选的窗函数有RectangularBarlrttHammingHannBlackman窗,其相应的都有实现函数。
函数butter,cheby1和ellip设计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
IIR带通:
Fp1=1200;
Fp2=3000;
Fs1=1000;
Fs2=3200;
Ft=8000;
wp1=tan(pi*Fp1/Ft);%带通到低通滤波器的转换
wp2=tan(pi*Fp2/Ft);
ws1=tan(pi*Fs1/Ft);
ws2=tan(pi*Fs2/Ft);
w=wp1*wp2/ws2;
bw=wp2-wp1;
wp=1;
ws=(wp1*wp2-w.^2)/(bw*w);
[n12,wn12]=buttord(wp,ws,1,50,'s');%求低通滤波器阶数和截止频率
[b12,a12]=butter(n12,wn12,'s');%求S域的频率响应参数
[num2,den2]=lp2bp(b12,a12,sqrt(wp1*wp2),bw);%将S域低通参数转为带通的
[num12,den12]=bilinear(num2,den2,0.5);%利用双线性变换实现频率响应S域到Z域的转换
[h,w]=freqz(num12,den12);%根据参数求出频率响应
plot(w*8000*0.5/pi,abs(h));
axis([0400001.5]);
legend('用butter设计');
grid;
IIR高通:
Ft=8000;
Fp=4000;
Fs=3500;
wp1=tan(pi*Fp/Ft);%高通到低通滤波器参数转换
ws1=tan(pi*Fs/Ft);
wp=1;
ws=wp1*wp/ws1;
[n13,wn13]=cheb1ord(wp,ws,1,50,'s');%求模拟的低通滤波器阶数和截止频率
[b13,a13]=cheby1(n13,1,wn13,'s');%求S域的频率响应的参数
[num,den]=lp2hp(b13,a13,wn13);%将S域低通参数转为高通的
[num13,den13]=bilinear(num,den,0.5);%利用双线性变换实现频率响应S域到Z域转换
[h,w]=freqz(num13,den13);
plot(w*21000*0.5/pi,abs(h));
title('IIR高通滤波器');
legend('用cheby1设计');
axis([01200001.5]);
grid;
FIR低通
用窗函数设计低通滤波器的程序如下:
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=[wpws];
mag=[10];
dev=[ps];
[n21,wn21,beta,ftype]=kaiserord(fpts,mag,dev);%由kaiserord求滤波器的阶数和截止频率
b21=fir1(n21,wn21,Kaiser(n21+1,beta));%由fir1设计滤波器
[h,w]=freqz(b21,1);%得到频率响应
plot(w/pi,abs(h));
title('FIR低通滤波器');
grid;
FIR带通滤波器:
Fp1=1200;
Fp2=3000;
Fs1=1000;
Fs2=3200;
Ft=8000;
wp1=tan(pi*Fp1/Ft);%带通到低通滤波器参数转换
wp2=tan(pi*Fp2/Ft);
ws1=tan(pi*Fs1/Ft);
ws2=tan(pi*Fs2/Ft);
w=wp1*wp2/ws2;
bw=wp2-wp1;
wp=1;
ws=(wp*wp2-w.^2)/(bw*w);
[n22,wn22]=buttord(wp,ws,1,50,'s');%求低通滤波器阶数和截止频率
[b22,a22]=butter(n22,wn22,'s');%求S域的频率响应的参数
[num2,den2]=lp2bp(b22,a22,sqrt(wp1*wp2),bw);%将S域低通参数转为带通的
[num22,den22]=bilinear(num2,den2,0.5);%利用双线性变换实现S域到Z域的转换
[h,w]=freqz(num22,den22);%根据参数求出频率响应
plot(w*8000*0.5/pi,abs(h));
axis([0400001.5]);
legend('用butter设计');
grid
FIR高通:
Ft=8001;
Fp=4000;
Fs=3500;
wp=2*Fp/Ft;
ws=2*Fs/Ft;
rp=1;
rs=50;
p=1-10.^(-rp/20);%通带阻带波纹
s=10.^(-rs/20);
fpts=[wswp];
mag=[01];
dev=[ps];
[n23,wn23,beta,ftype]=kaiserord(fpts,mag,dev);
b23=fir1(n23,wn23,'high',Kaiser(n23+1,beta));%由fir1设计滤波器
[h,w]=freqz(b23,1);%得到频率响应
plot(w*12000*0.5/pi,abs(h));
title('FIR高通滤波器');
axis([3000600001.2]);
grid
(5)用滤波器对加噪语音信号进行滤波
用自己设计的各滤波器分别对加噪的语音信号进行滤波,在Matlab中,FIR滤波器利用函数fftfilt对信号进行滤波,IIR滤波器利用函数filter对信号进行滤波。
双线性变换法:
i.低通滤波器
z11=filter(num11,den11,s);
ii.带通滤波器
z12=filter(num12,den12,s);
iii.高通滤波器
z13=filter(num13,den13,s);
窗函数法
i.低通滤波器
z21=fftfilt(b21,s);
ii.带通滤波器
z22=fftfilt(b22,s);
iii.高通滤波器
z23=fftfilt(b23,s);
(
6)比较滤波前后语音信号的波形及频谱
双线性变换法
i.低通滤波器
[y,fs,nbits]=wavread('speech');
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);
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('滤波后的信号波形');
grid;
ii.带通滤波器
[y,fs,nbits]=wavread('speech');
n=length(y);%求出语音信号的长度
noise=0.01*randn(n,2);%随机函数产生噪声
s=y+noise;%语音信号加入噪声
S=fft(s);%傅里叶变换
z12=filter(num12,den12,s);
sound(z12);
m12=fft(z12);%求滤波后的信号
subplot(2,2,1);
plot(abs(S),'g');
title('滤波前信号的频谱');
grid;
subplot(2,2,2);
plot(abs(m12),'r');
title('滤波后信号的频谱');
grid;
subplot(2,2,3);
plot(s);
title('滤波前信号的波形');
grid;
subplot(2,2,4);
plot(z12);
title('滤波后的信号波形');
grid;
iii.高通滤波器
[y,fs,nbits]=wavread('speech');
n=length(y);%求出语音信号的长度
noise=0.01*randn(n,2);%随机函数产生噪声
s=y+noise;%语音信号加入噪声
S=fft(s);%傅里叶变换
z13=filter(num13,den13,s);
sound(z13);
m13=fft(z13);%求滤波后的信号
subplot(2,2,1);
plot(abs(S),'g');
title('滤波前信号的频谱');
grid;
subplot(2,2,2);
plot(abs(m13),'r');
title('滤波后信号的频谱');
grid;
subplot(2,2,3);
plot(s);
title('滤波前信号的波形');
grid;
subplot(2,2,4);
plot(z13);
title('滤波后的信号波形');
grid;
窗函数法
i.低通滤波器
[y,fs,nbits]=wavread('speech');
n=length(y);%求出语音信号的长度
noise=0.01*randn(n,2);%随机函数产生噪声
s=y+noise;%语音信号加入噪声
S=fft(s);%傅里叶变换
z21=fftfilt(b21,s);
sound(z21);
m21=fft(z21);%求滤波后的信号
subplot(2,2,1);
plot(abs(S),'g');
title('滤波前信号的频谱');
grid;
subplot(2,2,2);
plot(abs(m21),'r');
title('滤波后信号的频谱');
grid;
subplot(2,2,3);
plot(s);
title('滤波前信号的波形');
grid;
subplot(2,2,4);
plot(z21);
title('滤波后的信号波形');
grid;
ii.带通滤波器
[y,fs,nbits]=wavread('speech');
n=length(y);%求出语音信号的长度
noise=0.01*randn(n,2);%随机函数产生噪声
s=y+noise;%语音信号加入噪声
S=fft(s);%傅里叶变换
z22=fftfilt(b22,s);
sound(z22);
m22=fft(z22);%求滤波后的信号
subplot(2,2,1);
plot(abs(S),'g');
title('滤波前信号的频谱');
grid;
subplot(2,2,2);
plot(abs(m22),'r');
title('滤波后信号的频谱');
grid;
subplot(2,2,3);
plot(s);
title('滤波前信号的波形');
grid;
subplot(2,2,4);
plot(z22);
title('滤波后的信号波形');
grid;
iii.高通滤波器
[y,fs,nbits]=wavread('speech');
n=length(y);%求出语音信号的长度
noise=0.01*randn(n,2);%随机函数产生噪声
s=y+noise;%语音信号加入噪声
S=fft(s);%傅里叶变换
z23=fftfilt(b23,s);
sound(z23);
m23=fft(z23);%求滤波后的信号
subplot(2,2,1);
plot(abs(S),'g');
title('滤波前信号的频谱');
grid;
subplot(2,2,2);
plot(abs(m23),'r');
title('滤波后信号的频谱');
grid;
subplot(2,2,3);
plot(s);
title('滤波前信号的波形');
grid;
subplot(2,2,4);
plot(z23);
title('滤波后的信号波形');
grid;
分析:
加入噪声后回放的声音与原始的语音信号有明显的不同,其伴随较尖锐的干扰啸叫声。
从含噪语音信号的频谱图中可以看出是含噪的语音信号的频谱,在整个频域范围内分布均匀,这正是干扰所造成的。
通过滤波前后的对比,低通滤波后效果最好,高通滤波后的效果最差。
由此可见,语音信号主要分布在低频,而噪声主要分布在高频。
(7)回放语音信号
在Matlab中,函数sound可以对声音进行回放,其调用格式:
sound(y,Fs),sound(y)和sound(y,Fs,bits),可以感觉滤波前后的声音有变化。
这一步在上一过程中已做。
5、心得体会
我感受到只有在了解课本知识的前提下,才能更好的应用这个工具;并且熟练的应用MATLAB也可以很好的加深我对课程的理解,为我带来方便。
这次设计使我了解了MATLAB的使用方法,学会分析滤波器的优劣和性能,提高了分析和动手实践能力。
同时我相信,进一步加强对MATLAB的学习与研究对我今后的学习将会起到很大的帮助。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。
总的来说,这次课程设计还是比较成功的,在设计中遇到了很多问题,在同学和书本的帮助下,终于一一解决了,有点小小的成就感,终于觉得平时所学的知识有了实用的价值,达到了理论与实际相结合的目的,不仅学到了不少知识,而且锻炼了自己的能力,使自己对以后的路有了更加清楚的认识,同时,对未来有了更多的信心。
6、参考文献
1.刘泉,阙大顺.数字信号处理原理与实现.电子工业出版社.2005
2.胡航.语音信号处理.哈尔滨工业大学出版社.2002.
3.张威.MATLAB基础与编程入门.西安电子科技大学出版社.2006
4.陈怀琛,吴大正,高西全.MATLAB及在电子信息课程中的应用.2002