通信原理课程设计Word格式文档下载.docx
《通信原理课程设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《通信原理课程设计Word格式文档下载.docx(17页珍藏版)》请在冰豆网上搜索。
4、设计FIR和IIR低通、带通和高通滤波器;
5、把加噪音的语音信号分别经FIR和IIR低通、带通和高通滤波器,分析滤波后的波形和频谱;
6、对比六种滤波器谁的效果好;
7、设计信号处理系统界面,以实现上面所属功能。
因滤波器和滤波程序共有六个模块,因此我组六个人分别负责一个模块设计,并且分别设计一个系统界面,而本次实训中我负责IIR带通滤波器和加噪语音信号带通滤波模块程序设计。
二、设计思路
首先,选择一个语言信号作为分析对象,或录制一段各人自己的语音信号,对其进行频谱分析;
利用MATLAB中的随机函数产生高斯分布的噪声加入到语音信号中,模仿语音信号被污染,并进行频谱分析;
设计FIR和IIR低通、带通和高通数字滤波器,把被噪声污染的语言信号分别进行滤波,分析滤波后信号的时域和频域特征,回放语音信号,对比滤波效果。
最后,利用图形用户界面(GUI)设计一个信号处理系统界面,把m文件化的程序做成界面系统方便使用和进行分析,在所设计的系统界面上可以选择滤波器类型。
其原理框图如下所示:
图2—1总系统原理框图
三、具体实现
1、语音信号采集
利用PC机上的声卡和WINDOWS操作系统可以进行数字信号的采集。
启动录音机,按下录音按钮,接着对话筒说话“语音信号处理”,说完后停止录音,屏幕左侧将显示所录音的长度。
点击放音,可以实现所录音的重现。
以文件名“speech”保存入F:
\matlab中。
可以看到,文件存储器的后缀默认为wav,这是windows操作系统规定的声音文件存储的标准。
但win7录音不支持此格式,需进行格式转换。
2、语音信号的时域分析
利用MATLAB中的“wavread”命令来读入语音信号,将他赋值给某一向量。
再对其进行采样。
下面介绍Wavread函数的调用格式。
[y,fs,nbits]=wavread(file)
功能说明:
采样值放在向量y中,fs表示采样频率(hz),nbits表示采样位数。
[y,fs,nbits]=wavread(‘speech’);
%把语音信号加载入matlab仿真软件平台中然后,画出语音信号的时域波形,再对语音信号进行频谱分析。
Matlab提供了快速傅立叶变换法FFT计算DFT函数fft。
其调用格式如下:
Xk=fft(xn,N)
参数xn为被变换的时域序列向量,N是DFT变换区间长度,当N大于xn的长度时,fft函数自动在xn后补零。
当N小于xn的长度时,fft函数计算xn的前N个元素,忽略其后面的元素。
在本次设计中,我们利用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));
原始信号频谱'
其运行结果如下所示:
图3—1原始信号波形及频谱
从频谱图上看这段语音信号采样点数N约为20000多点。
3、语音信号加噪与频谱分析
MATLAB中产生高斯白噪声非常方便,有两个产生高斯白噪声的函数。
我们可以直接应用两个函数:
WGN和AWGN。
WGN用于产生高斯白噪声,AWGN则用于在某一信号中加入高斯白噪声。
也可以直接用randn函数产生高斯白噪声分布序列。
本次课程设计中,我们是利用MATLAB中的随机函数产生噪声加入到语音信号中,模仿语音信号被污染,对其频谱分析。
Randn函数有两种基本调用格式:
randn(n)和randn(nm,n),前者产生n×
n服从标准高斯分布的随机数矩阵,后者产生m×
n的随机数矩阵。
在这里我们选用randn(m,n)函数。
语音信号添加噪声及频谱分析的主要程序如下:
[y,fs,nbits]=wavread('
N=length(y);
%求出语音信号的长度
Noise=0.01*randn(N,2);
%随机函数产生噪音
Si=y+Noise;
%语音信号加入噪音
sound(Si,fs);
subplot(2,1,1);
plot(Si);
title(‘加噪语音信号的时域波形'
S=fft(Si);
%傅立叶变换
subplot(2,1,2);
plot(abs(S));
title(‘加噪语音信号的频域波形'
图3—2加噪音后语音信号的波形及频谱
加噪音后,从频域波形图看整体幅值比原始信号加大,特别是1000到19000这一段。
利用以下程序对可得高斯分布(噪音)频率分布图,如下所示:
A=randn(N,2);
%随机函数产生噪音
hist(A,[-50:
0.1:
50]);
%画出频率分布图
图3—3高斯分布(噪音)的随机数的发生频率分布图
4、设计IIR带通数字滤波器
IIR滤波器设计方法有间接法和直接法,间接法是借助于模拟滤波器的设计方法进行的。
其设计步骤是:
先设计过度模拟滤波器得到系统函数H(s),然后将H(s)按某种方法转换成数字滤波器的系统函数H(z)。
这里我们采用间接法来设计。
将系统函数H(s)从S平面转换到Z平面的方法很多,常用的有脉冲响应不变法和双线性变换法。
脉冲相应不变法的主要缺点是对于高通滤波器产生频谱混叠现象,使数字滤波器的频响偏离模拟滤波器的频响特性。
为了克服这一缺点,统一采用双线性变换法设计IIR数字滤波器。
具体步骤如下:
1)、确定所需类型的数字滤波器的技术指标。
2)、将所需类型的数字滤波器的边界频率转换成相应的模拟滤波器的边界频率,转换公式将相应类型的模拟滤波器技术指标转换成模拟低通;
滤波器的技术指标。
3)、设计模拟低通滤波器。
4)、通过频率变换将模拟低通转换成相应类型的过度模拟滤波器。
5)、采用双线性法变换法将相应类型的过度滤波器转换成所需类型的数字滤波器。
在具体设计之前根据原始信号频谱图,噪音发生频率分布图,和人的声音最大频率不超过3400Hz,给出有关滤波器的技术指标。
低通滤波器的性能指标:
Fp=200Hz;
Fs=300Hz;
As=50db;
Ap=1db
高通滤波器的性能指标:
Fp=900Hz;
Fs=800Hz;
带通滤波器的性能指标:
Fp1=400Hz,fq2=700Hz,Fs1=300Hz,Fs2=800Hz,As=50db,Ap=1db
本程序采用巴特沃斯滤波器来设计IIR带通滤波器,其程序如下所示:
%=============IIR带通滤波器(双线性变换法)===============
Fp1=400;
Fp2=700;
Fs1=300;
Fs2=800;
Ft=4000;
wp1=tan(pi*Fp1/Ft);
wp2=tan(pi*Fp2/Ft);
ws1=tan(pi*Fs1/Ft);
ws2=tan(pi*Fs2/Ft);
%预畸变校正转换指标
w=wp1*wp2;
bw=wp2-wp1;
wp=1;
ws=(ws1*bw)/(w-ws1^2);
%归一化处理
[n12,wn12]=buttord(wp,ws,1,50,'
s'
%求低通滤波器阶数和截止频率
[b12,a12]=butter(n12,wn12,'
%求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*2000/pi,abs(h));
axis([090001.5]);
legend('
用butter设计'
)
图3—4IIR带通滤波器幅频特性曲线
5、滤波器对加噪语音进行滤波处理
用自己设计的各滤波器分别对加噪的语音信号进行滤波,在matlab中,FIR滤波器利用函数fftilt进行滤波,IIR利用函数filter对信号进行滤波。
调用格式如下所示:
y=fftilter(h,x,M)
yn=filter(B,A,xn)
这里重点阐述filter的用法计算系统对输入信号向量xn的零状态响应输出信号向量yn,yn与xn长度相等。
用滤波器对加噪语音信号进行处理程序如下:
n=length(y);
noise=0.01*randn(n,2);
%随机函数产生噪声
s=y+noise;
%语音信号加入噪声
S=fft(s);
%福里叶变换
z12=filter(num12,den12,s);
sound(z12,fs);
%播放语音和求滤波器后的信号
m12=fft(z12);
subplot(2,2,1);
plot(abs(S),'
g'
滤波前信号的频谱'
subplot(2,2,2);
plot(abs(m12),'
r'
滤波后信号的频谱'
subplot(2,2,3);
plot(s);
滤波前信号的波形'
subplot(2,2,4);
plot(z12);
滤波后信号的波形'
图3—5双线性变换法带通滤波
其播放滤波后的语音信号,可以听见几乎听不出原始语音信号,滤波效果不好,其次从滤波后的频谱与原始语音信号频谱已经不是一个模样的图形了。
6、系统用户界面设计
图形用户界面(GraphicalUserInterface,简称GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。
是由窗口、光标、按键、菜单、文字说明等对象构成的一个用户界面。
用户通过一定的方法(如鼠标、键盘)选择、激活这些图形对象,使计算机产生某种动作或变化,比如实现计算、绘图等。
fig文件包括GUI图形窗口及其所有后裔的完全描述,包括所有对象属性的属性值。
它是一个二进制文件调用hasve去保存图形窗口时将生成该文件同时生成一个M文件。
M文件包括GUI设计、控制函数及定义为子函数的用户控制回调函数,主要用于控制GUI展开时的各种特征。
GUI创建包括界面设计和控制编程两部分。
如图所示进行用户界面布局:
图3—6系统用户界面布局
当布局结束后,点击运行会生成两个文件,一个后缀名为fig的文件,另一个后缀名为m的文件,把它们命名为lvboqigui。
利用已经编好的程序去编辑lvboqigui.m文件,利用对象浏览查看生成的器件的先后顺序和层次关系,好去编辑回调程序。
但并不是已经编好的程序照搬到回调程序中,应注意以下几点。
第一所生成的fig文件和m文件必须和原始语音信号放在同一个文件夹内;
第二在编写回调函数时必须联系前后进行编写,例如滤波处理按钮必须在前面加滤波器程序;
第三对于要有两个以上画图时,不能简单利用图形窗口分割(subplot),实现所绘之图在axes图形窗口上显示。
如图所示生成的用户界面:
图3—7系统用户界面
四、程序调试
一开始在编写加噪语音信号频谱分析程序时,调用sound(si)听不见语音且时间比录制语音的时间还长,后来一看才发在sound函数中少设了采样率。
在编写对加噪语音滤波处理程序时,点击运行错误,仔细检查发现程序未错,只是因为利用到滤波器程序中的变量,必须联系起来进行编写。
在编写GUI回调函数时,首先还是出现以前所的错误,造成滤波处理无效或出错,其次因为简单利用subplot进行图形分割,造成多图窗口时在整个fig界面显示。
后来查阅资料利用axes(handles.axes1)这个函数可以限定图形在某个axes窗口显示,只需把后面的1改写为其它的数即可。
五、总结
经过为期三个周的努力,本次课程设计在基于matlab环境下利用所学的知识,通过团队的合作去完成课题和进行简单的答辩。
这次课程设计和以往的不同首先难在选题上,如果选题太简单不利于六人小组工作开展。
太难又因现在所学知识在有限大时间下不可能完成。
所以选题是关键。
其次在于分工应该根据本组成员的能力合理地进行安培。
在答辩时更需要团队的合作与帮助。
本次课题在对语音信号进行加噪后通过滤波处理,查看IIR和FIR低通、带通和高通滤波器滤波效果,发现低通滤波器滤波效果好且FIR的最好,这也证明了一般人正常说话下,频率只有几百赫兹左右。
具体在看IIR和FIR滤波器,FIR的相位特性更好,但时同样的幅频特性下,FIR的阶数比IIR的阶数高出5倍还多,造成成本较高,延时较大。
在滤波效果最好的FIR低通滤波,发现还是有噪音,只是比以前改善了一些,这也证明了为什么语音信号在经信道的时候需要调制与解调,这是为了减少经信道时噪声对语音的干扰。
本次课程设计通过查阅资料和老师同学的帮助,终于达到预期目标。
感谢同组成员对我的帮助,谢谢指导老师对我耐心的教导。
六、参考文献
1、Matlab教程R2010a张志涌等编著北京航空航天大学出版社
2、数字信号处理高西全、丁玉美编著西安电子科技大学出版社
3、matlab仿真在通信与电子工程中的应用徐明远、邵玉斌编著西安电子科技大学出版社
4、XX文库
七、总程序清单
%===========原始语音信号分析=============
sound(y,fs,nbits);
Y=fft(y,N);
subplot(2,1,1)plot(y);
plot(abs(Y));
%===========加噪音后语音信号分析==========
%============IIR低通滤波器(双线性变换法)================
Fp=200;
Fs=300;
Ft=2000;
fp=Fp/Ft;
fs=Fs/Ft;
wp=2*tan(pi*fp/2);
ws=2*tan(pi*fs/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*1000/pi,abs(h));
%画出幅频特性曲线
legend(‘用butter设计'
)
%======用滤波器对加噪语音信号进行处理============
n=length(y);
noise=0.01*randn(n,2);
s=y+noise;
S=fft(s);
z11=filter(num11,den11,s);
sound(z11,fs);
m11=fft(z11);
%播放语音求滤波器后的信号
subplot(2,2,1);
grid;
subplot(2,2,2);
plot(abs(m11),'
subplot(2,2,3);
subplot(2,2,4);
plot(z11);
%=============IIR带通滤波器===============
Fp1=400;
wp1=tan(pi*Fp1/Ft);
ws1=tan(pi*Fs1/Ft);
w=wp1*wp2;
[n12,wn12]=buttord(wp,ws,1,50,'
[b12,a12]=butter(n12,wn12,'
[num2,den2]=lp2bp(b12,a12,sqrt(wp1*wp2),bw);
[num12,den12]=bilinear(num2,den2,0.5);
[h,w]=freqz(num12,den12);
plot(w*2000/pi,abs(h));
%******************带通滤波**************
z12=filter(num12,den12,s);
sound(z12,fs,nbits);
%求滤波器后的信号
%——————IIR高通——————
Ft=1000;
Fp=800;
Fs=900;
wpl=2*tan(pi*Fp/Ft);
wsl=2*tan(pi*Fs/Ft);
ws=wpl*wp/wsl;
%高通到低通滤波器归一化处理
[n13,wn13]=cheb1ord(wp,ws,1,50,'
%求模拟的低通滤波器阶数和截止频率
[b13,a13]=cheby1(n13,1,wn13,'
%求S域的频率响应的参数
[num,den]=lp2hp(b13,a13,wn13);
%将S域低通参数转为高通的
[num13,den13]=bilinear(num,den,0.5);
%利用双线性变换实现S域到Z域转换
[h,w]=freqz(num13,den13);
IIR高通滤波器'
用cheby1设计'
%******************高通滤波**************
z13=filter(num13,den13,s);
sound(z13,fs,nbits);
m13=fft(z13);
plot(abs(m13),'
plot(z13);
%————————FIR低通————————
%用窗函数设计低通滤波器的程序如下
Ft=8000;
wp=2*pi*Fp/Ft;
ws=2*pi*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