语音信号课设文档格式.docx
《语音信号课设文档格式.docx》由会员分享,可在线阅读,更多相关《语音信号课设文档格式.docx(22页珍藏版)》请在冰豆网上搜索。
采样
A/D转换
Wav
声音
图2.语音采集过程
4.2.2语音信号的读取
在matlab软件平台下,利用wavread函数对语音信号进行采样,记住采样频率和采样点数。
通过使用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中。
对语音信号“zx.wav”进行采样其程序如下:
[y,fs,nbits]=wavread('
zx.wav'
)
结果如下:
可知该语音信号的采样频率fs=8000Hz,数据位nbits=16Bit。
4.2.3语音信号的频谱分析
首先画出语音信号的时域波形,然后对语音信号进行频谱分析。
在Matlab中可以利用函数fft对信号行快速傅里叶变换,得到信号的频谱图
其程序如下:
y=wavread('
);
%把语音信号进行加载入Matlab仿真软件平台中
sound(y,fs,nbits);
%对加载的语音信号进行回放
Y=fft(y);
%快速傅里叶变换
subplot(2,1,1),plot(y);
title('
原始信号波形'
subplot(2,1,2),plot(abs(Y));
原始信号频谱'
程序结果如下图3:
图3语音信号的频谱
4.2.4噪声信号的构建
利用MATLAB中的随机函数(rand或randn)产生噪声加入到语音信号中,模仿语音信号被污染,并对其进行频谱分析。
1)Matlab中的rand函数:
均匀分布的随机数或矩阵
Y=rand(n)
Y=rand(m,n)
Y=rand([mn])
Y=rand(m,n,p,...)
Y=rand([mnp...])
Y=rand(size(A))
2)rand函数产生由在(0,1)之间均匀分布的随机数组成的数组。
Y=rand(n)返回一个nxn随机矩阵。
如果n不是数量,则返回错误信息。
Y=rand(m,n)或Y=rand([mn])返回一个mxn的随机矩阵。
Y=rand(m,n,p,...)或Y=rand([mnp...])产生随机数组。
Y=rand(size(A))返回一个和A有相同尺寸的随机矩阵。
3)程序如下:
N=length(y);
%求出语音信号的长度
noise=rand(N,2)/20;
%噪声信号的函数
z=fft(noise);
%快速傅里叶变换
subplot(2,1,1),plot(noise);
噪声信号波形'
subplot(2,1,2),plot(abs(z));
噪声信号频谱'
axis([0,250000,0,100]);
图4噪声信号的频谱
4.2.5加入噪声的语音信号的频谱
matlab程序如下:
s=y+noise;
%噪声信号的叠加
Subplot(2,1,1);
plot(s);
title('
滤波前的时域波形'
S=fft(s);
Subplot(2,1,2);
plot(abs(S));
滤波前的频域波形'
axis([0,45000,0,200]);
图5加噪语音信号的频谱
4.2.6数字滤波器的设计
●滤波器的设计原理
设计数字滤波器的任务就是寻求一个因果稳定的线性时不变系统,并使系统函数H(z)具有指定的频率特性。
数字滤波器从实现的网络结构或者从单位冲激响应分类,可以分成无限长单位冲激响应(IIR)数字滤波器和有限长单位冲激响应(FIR)数字滤波器。
MATLAB中提供了几个函数,分别用于实现IIR滤波器和FIR滤波器。
1)卷积函数conv
卷积函数conv的调用格式为
c=conv(a,b)
该格式可以计算两向量a和b的卷积,可以直接用于对有限长信号采用FIR滤波器的滤波。
2)函数filter
函数filter的调用格式为
y=filter(b,a,x)
该格式采用数字滤波器对数据进行滤波,既可以用于IIR滤波器,也可以用于FIR滤波器。
其中向量b和a分别表示系统函数的分子、分母多项式的系数,若a=1,此时表示FIR滤波器,否则就是IIR滤波器。
该函数是利用给出的向量b和a,对x中的数据进行滤波,结果放入向量y。
3)函数fftfilt
函数fftfilt的调用格式为
y=fftfilt(b,x)
该格式是利用基于FFT的重叠相加法对数据进行滤波,这种频域滤波技术只对FIR滤波器有效。
该函数是通过向量b描述的滤波器对x数据进行滤波。
关于用butter函数求系统函数分子与分母系数的几种形式。
[b,a]=butter(N,wc,'
high'
):
设计N阶高通滤波器,wc为它的3dB边缘频率,以为单位,故。
[b,a]=butter(N,wc):
当wc为具有两个元素的矢量wc=[w1,w2]时,它设计2N阶带通滤波器,3dB通带为,w的单位为。
stop'
若wc=[w1,w2],则它设计2N阶带阻滤波器,3dB通带为,w的单位为。
如果在这个函数输入变元的最后,加一个变元“s”,表示设计的是模拟滤波器。
这里不作讨论。
为了设计任意的选项巴特沃斯滤波器,必须知道阶数N和3dB边缘频率矢量wc。
这可以直接利用信号处理工具箱中的buttord函数来计算。
[N,wc]=buttord(wp,ws,Rp,As)
对于不同类型的滤波器,参数wp和ws有一些限制:
对于低通滤波器,wp<
ws;
对于高通滤波器,wp>
对于带通滤波器,wp和ws分别为具有两个元素的矢量,wp=[wp1,wp2]和ws=[ws1,ws2],并且ws1<
wp1<
wp2<
ws2;
对于带阻滤波器wp1<
ws1<
ws2<
wp2。
●根据语音信号的特点给出有关滤波器的性能指标:
1)低通滤波器的性能指标:
Fp=1000Hz,Fs=1200Hz,As=50dB,Ap=1dB;
2)高通滤波器的性能指标:
Fp=4000Hz,Fs=3500Hz,As=50dB,Ap=1dB;
3)带通滤波器的性能指标:
Fp1=1200Hz,Fp2=3000HZ,Fs1=1000Hz,
Fs2=3200Hz,As=50dB,Ap=1dB;
●IIR数字滤波器设计
1).对设计性能指标中频率指标进行转换使其满足模拟滤波器原型设计性能指标;
2).估计模拟滤波器最小阶数和边界频率。
Matlab提供的函数(buttord,cheb1ord,cheb2ord,ellipord);
3).设计模拟低通滤波器原型,Matlab提供的函数(buttap,cheb1ap,cheb2ap,ellipap);
4).由模拟低通原型经频率变换获得模拟滤波器,Matlab提供的函数(lp2lp,lp2hp,lp2bp,lp2bs)
5).将模拟滤波器离散化获得IIR数字滤波器,Matlab提供的函数(bilinear,impinvar)
设计流程如图所示:
设计模拟滤波器
H(s)
数字滤波器
H(z)
频域指标双线性变换法
脉冲响应不变法
图6IIR滤波器的间接法设计
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*Ft*tan(ws/2);
[N,wc]=buttord(wp,ws,1,50,'
s'
[bz,az]=bilinear(b,a,0.5);
[h,w]=freqz(bz,az);
plot(w*8000*0.5/pi,abs(h));
Legend('
用butter设计'
IIR低通滤波器'
grid;
●FIR数字滤波器设计
IIR滤波器设计只能保证其幅频响应满足性能指标,相位特性无法考虑且往往非线性。
FIR滤波器的突出优点是,在保证满足滤波器幅频响应要求的同时,还可以获得严格的线性相位特性,这对于高保真的信号处理。
如语音处理、数据处理和测试等是十分重要的。
它的主要缺点是,达到相同性能指标所需滤波器阶数要高得多,延迟也比较大。
窗函数设计法:
♦设计思想
先给定理想filter的频响Hd(ejw),设计一个FIR的filter的频响为H(ejw),使H(ejw)逼近Hd(ejw)。
♦设计过程
先用傅氏反变换求出理想filter的单位抽样响应hd(n),然后加时间窗w(n)对hd(n)截断,以求得FIRfilter的单位抽样响应h(n)。
♦函数调用格式
b=fir1(n,wn)
b=fir1(n,wn,’ftype’)
b=fir1(n,wn,window)
b=fir1(n,wn,’ftype’,window)
其中,n为FIR滤波器的阶数,对于高通、带阻滤波器n取偶数,wn为滤波器截止频率;
‘ftype’为滤波器类型;
window为窗函数(列向量、其长度为n+1),缺省时,自动取Hamming窗。
FIR低通滤波器:
wp=2*Fp/Ft;
ws=2*Fs/Ft;
Ap=1;
As=50;
p=1-10.^(-Ap/20);
s=10.^(-As/20);
fpts=[wpws];
mag=[10];
dev=[ps];
[N,wc,beta,ftype]=kaiserord(fpts,mag,dev);
b=fir1(N,wc,kaiser(N+1,beta));
[h,w]=freqz(b,1);
plot(w/pi,abs(h));
FIR低通滤波器'
4.2.7滤波器对信号滤波:
用设计好的数字滤波器对含噪语音信号进行滤波,在Matlab中FIR滤波器利用函数fftfilt对信号进行滤波,IIR滤波器利用函数filter对信号进行滤波,在一个窗口同时画出滤波前后的波形及频谱如图。
⏹IIR低通滤波:
k=y+noise;
Subplot(2,2,1);
plot(k);
K=fft(k);
Subplot(2,2,2);
plot(abs(K));
axis([0,50000,0,300]);
z11=filter(bz,az,k);
m11=fft(z11);
subplot(2,2,3);
plot(z11,'
g'
滤波后的时域波形'
subplot(2,2,4);
plot(abs(m11),'
r'
sound(z11);
图7IIR低通滤波
⏹IIR带通通滤波
图8IIR带通滤波
⏹IIR高通滤波:
图9IIR高通滤波
⏹FIR低通滤波:
z21=fftfilt(b,k);
m21=fft(z21);
plot(z21,'
plot(abs(m21),'
图10FIR低通滤波
⏹FIR带通通滤波:
图11FIR带通滤波
⏹FIR高通滤波:
图12FIR高通滤波
4.2.8语音信号回放
以上几种滤波,我们都可以从信号滤波前后的波形图以及频谱图上看出变化。
我们可以用sound()函数来播放滤波后的语音,从听觉上直接感受语音信号的变化,但由于人耳听力的限制,有些情况下我们是很难听出异同的。
在matlab中,函数sound可以对声音进行回放,其调用格式为:
sound(x,fs,nbits)。
通过回放可以发现滤波前后的声音有变化。
总之,可用软件设计的滤波器代替硬件滤波器,软件设计的滤波器可以完成硬件的滤波功能。
在数字系统中,任何信号处理器件都可以看成是一个滤波器。
滤波器的设计是数字信号处理的重要内容,设计时要根据信号的特征,确定滤波器的类型、阶数、截止频率、衰减幅度等,才能有效地滤波。
5.心得体会
专业课程设计是这个学期的第一个课程设计,因此有充分的时间来准备,而且这次课设所要用的软件是我们已经接触过好多次的MATLAB,在以前的学习中,我们经常会用到MATLAB,它是一个功能强大的软件。
这次课设的目的就是用它来处理语音信号的。
通过这次的课程设计我们可以学的到很多的东西,不仅可以巩固以前所学过的知识,还可以学到很多在书本上所没有学到过的知识。
进一步加深了对数字信号处理的了解,让我对它有了更加浓厚的兴趣。
因为以前学过信号与系统和数字信号处理两门课,但这只是理论知识,通过实验我们才能真正理解其意义。
语音信号处理在以前的学习中并没有怎么接触,但是通过网上查找资料,我很快的理解了其基本原理。
这次课设的要求是要我们用matlab处理语音信号,并且加入一定噪声,然后设计出数字滤波器来滤除掉噪声。
在设计的过程中我还是遇到不少的问题的,比如刚开始,要处理的是WAV格式的语音信号,可是我发现并不是所有的WAV文件都可以用WAVREAD函数读取的,这才了解到WAV文件之间也是有区别的,并且如果格式不对的话,我们要把格式转换成WAV格式。
刚开始由于对滤波器的滤波原理并不是很了解,于是我又翻出学过的数字信号处理课本,认真研究起各种滤波器了,这才使我明白了大多数滤波器是如何工作地,不再单单只是懂理论,理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,有助于设计出能滤除由rand函数制造的噪声的滤波器。
总的来说,通过这次的课程设计我对语音信号有了全面的认识,对数字信号处理的知识又有了深刻的理解,让我感受到只有在充分理解课本知识的前提下,才能更好的应用这个工具;
并且熟练的应用MATLAB也可以很好的加深我对课程的理解,方便我的思维。
这次设计使我了解了MATLAB的使用方法,学会分析滤波器的优劣和性能,提高了分析和动手实践能力。
同时我相信,进一步加强对MATLAB的学习与研究对我今后的学习将会起到很大的帮助!
6.参考文献
[1]刘泉,阙大顺.数字信号处理原理与实现.电子工业出版社2005.
[2]刘敏,魏玲.Matlab通信仿真与应用.国防工业出版社2001.
[3]胡航.语音信号处理.哈尔滨工业大学出版社2002.
[4]张威.MATLAB基础与编程入门西安电子科技大学出版社2006.
[5]蔡莲红,黄德智.现代语音技术基础与应用清华大学出版社2003.
附录:
IIR带通滤波器:
Fp1=1200;
Fp2=3000;
Fs1=1000;
Fs2=3200;
wp1=tan(pi*Fp1/Ft);
wp2=tan(pi*Fp2/Ft);
ws1=tan(pi*Fs1/Ft);
ws2=tan(pi*Fs2/Ft);
wp1*wp2>
ws1*ws2;
w=wp1*wp2/ws2;
bw=wp2-wp1;
wp=1;
ws=(wp1*wp2-w.^2)/(bw*w);
[b1,a1]=butter(N,wc,'
[b,a]=lp2bp(b1,a1,sqrt(wp1*wp2),bw);
IIR带通滤波器'
IIR高通滤波器:
Fp=4000;
Fs=3500;
wp1=tan(pi*Fp/Ft);
ws1=tan(pi*Fs/Ft);
ws=wp1*wp/ws1;
[N,wc]=cheb1ord(wp,ws,1,50,'
[b,a]=cheby1(N,1,wc,'
[b1,a1]=lp2hp(b,a,wc);
[bz,az]=bilinear(b1,a1,0.5);
plot(w*21000*0.5/pi,abs(h));
IIR高通滤波器'
legend('
cheby1设计'
axis([01200001.5]);
FIR带通滤波器:
FIR带通滤波器'
FIR高通滤波器:
Ft=8001;
rp=1;
rs=50;
p=1-10.^(-rp/20);
%通带阻带波纹
s=10.^(-rs/20);
fpts=[wswp];
mag=[01];
[n23,wn23,beta,ftype]=kai