简单语音处理系统设计.docx
- 文档编号:8675594
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:24
- 大小:968.85KB
简单语音处理系统设计.docx
《简单语音处理系统设计.docx》由会员分享,可在线阅读,更多相关《简单语音处理系统设计.docx(24页珍藏版)》请在冰豆网上搜索。
简单语音处理系统设计
摘要
数字信号处理是一门以算法为核心、理论和实践性较强的学科。
是通信工程专业的一门重要的专业基础课。
为了巩固所学的数字信号处理理论知识,理解信号的采集、处理、传输、显示和存储过程以及培养运用专业基础知识,解决实际工程技术问题的能力,本次课程设计要求设计一个基于MATLAB的语音处理系统以实现对语音信号的滤波。
滤波器按频率划分有低通、高通、带通、带阻、全通等类型。
经过滤波器处理后,不仅滤除掉了原信号的部分频率分量,原信号的幅度也会有所衰减,通过对滤波前后各波形的比较,能更清楚的发现滤波器能滤除掉阻带内的频率分量而保留通带内的频率分量的作用。
在这次设计中采用了双线性变换法和窗函数法两种方法设计滤波器,用这两种方法设计的滤波器又分别采用了高通、低通、带通三种频率特性实现,从横向上和纵向上都可以进行对比,表现出各种滤波器的不同特性。
关键词数字信号处理滤波器双线性变换法窗函数法
1绪论
数字信号处理(digitalsignalprocessing,DSP)是从20世纪60年代以来,随着信息学科和计算机学科的高速发展而迅速发展起来的一门新兴学科。
它的重要性日益在各个领域的应用中表现出来。
简言之,数字信号处理是把信号用数字或符号表示的序列,通过计算机或通用(专用)信号处理设备,用数字的数值计算方法处理(例如滤波、变换、压缩、增强、估计、识别等),以达到提取有用信息便于应用的目的。
数字信号处理的应用包括滤波与变换、通信、语音、语言、图像、图形、消费电子、仪器、工业控制与自动化、医疗、军事等。
其发展方向也是多方面的,包括数字汇聚、远程会议系统、融合网络、数字图书馆、图像与文本合一的信息检索业务、多媒体通信、个人信息终端等。
在本次设计中,就以设计一个数字滤波器系统为目的。
2设计目的及要求
2.1课程设计目的
(1)巩固所学的数字信号处理理论知识,理解信号的采集、处理、传输、显示和存储过程;
(2)综合运用专业及基础知识,解决实际工程技术问题的能力;
(3)学习资料的收集与整理,学会撰写课程设计报告。
2.2课程设计基本要求
(1)录制一段个人自己的语音信号,并对录制的信号进行采样;画出采样后语音信号的时域波形和频谱图;给定滤波器的性能指标,采用窗函数法和双线性变换设计滤波器,并画出滤波器的频率响应;然后用自己设计的滤波器对采集的信号进行滤波,画出滤波后信号的时域波形和频谱,并对滤波前后的信号进行对比,分析信号的变化;回放语音信号;最后设计一个信号处理系统界面。
(2)利用课余时间去图书馆或上网查阅课题相关资料,深入理解课题含义及设计要求,注意材料收集与整理;
3课程设计的内容
3.1语音信号的采集
利用Windows下的录音机,录制一段自己的话音,时间在1s内。
然后在Matlab软件平台下,利用函数wavread对语音信号进行采样,记住采样频率和采样点数。
通过wavread函数的使用,学生很快理解了采样频率、采样位数等概念。
3.2语音信号的频谱分析
首先画出语音信号的时域波形;然后对语音号进行快速傅里叶变换,得到信号的频谱特性,从而加深学生对频谱特性的理解。
3.3设计数字滤波器和画出其频率响应
给出各滤波器的性能指标:
(1)低通滤波器性能指标fb=1000Hz,fc=1200Hz,As=100dB,Ap=1dB。
(2)高通滤波器性能指标fc=4800Hz,fb=5000HzAs=100dB,Ap=1dB。
(3)带通滤波器性能指标fb1=1200Hz,fb2=3000Hz,fc1=1000Hz,fc2=3200Hz,As=100dB,Ap=1dB。
用窗函数法和双线性变换法设计上面要求的3种滤波器。
在Matlab中,可以利用函数fir1设计FIR滤波器,可以利用函数butte,cheby1和ellip设计IIR滤波器;利用Matlab中的函数freqz画出各滤波器的频率响应。
3.4用滤波器对信号进行滤波
用自己设计的各滤波器分别对采集的信号进行滤波,在Matlab中,FIR滤波器利用函数fftfilt对信号进行滤波,IIR滤波器利用函数filter对信号进行滤波。
3.5比较滤波前后语音信号的波形及频谱
在一个窗口同时画出滤波前后的波形及频谱。
3.6回放语音信号
在Matlab中,函数sound可以对声音进行回放。
其调用格式:
sound(x,fs,bits);可以感觉滤波前后的声音有变化。
3.7设计系统界面
为了简化界面的设计过程,在这次课程设计中采用了MATLAB中的工具GUI。
其设计过程为:
(1)打开GUI窗口:
File→New→GUI→CreateNewGUI→BlankGUI(Default)→OK
(2)控件设计:
在控件布局设计区放置十个PushButton控件
(3)修改控件属性:
选中需要修改属性的控件,双击打开属性查看器
(4)保存:
设置好各个控件的属性,回到GUI主窗口保存,给文件命名为why,同时why.m文件打开。
(5)设置回调函数:
在why.m文件窗口中设置回函数。
这里,虽然GUI自动生成了回调函数,但是回调函数是空的,需要在why.m文件中对它进行定义说明。
该程序只需要对十个PushButton控件的回调函数进行定义说明:
functionpushbutton1_Callback(hObject,eventdata,handles)
x1=wavread('C:
\ProgramFiles\MatLab71\work\1.wav');%读取原始信号
figure
(1);%绘制原始信号的波形
plot(x1);
title('原始信号的时域波形');
xlabel('时间轴n');
ylabel('幅值A');
functionpushbutton2_Callback(hObject,eventdata,handles)
x1=wavread('C:
\ProgramFiles\MatLab71\work\1.wav');
fs=22052;
f=fs*(0:
511)/1024;
y=fft(x1,1024);
figure
(2);%绘制原始信号的频谱
plot(f,abs(y(1:
512)));
title('原始信号的频谱')
functionpushbutton3_Callback(hObject,eventdata,handles)
[x1,fs,bits]=wavread('C:
\ProgramFiles\MatLab71\work\1.wav');
sound(x1,fs);%播放原始语音信号
functionpushbutton4_Callback(hObject,eventdata,handles)
fb=1000;fc=1200;As=100;Ap=1;fs=22050;%IIR低通滤波器
x2=wavread('C:
\ProgramFiles\MatLab71\work\1.wav');
Ts=1/fs;R1=10;
wp=2*pi*fb/fs;
ws=2*pi*fc/fs;
wp1=2/Ts*tan(wp/2);
ws1=2/Ts*tan(ws/2);
[N,Wn]=buttord(wp1,ws1,Ap,R1,'s');
[Z,P,K]=buttap(N);
[Bap,Aap]=zp2tf(Z,P,K);
[b,a]=lp2lp(Bap,Aap,Wn);
[bz,az]=bilinear(b,a,fs);
[H,W]=freqz(bz,az);
figure
(1)
plot(W*fs/(2*pi),abs(H))
xlabel('频率/Hz')
ylabel('频率响应幅度')
title('IIR低通滤波器')
f1=filter(bz,az,x2);
figure
(2)
subplot(2,1,1)
plot(x2)
title('IIR低通滤波器滤波前的时域波形');
subplot(2,1,2)
plot(f1);
title('IIR低通滤波器滤波后的时域波形');
sound(f1,44100);
F0=fft(f1,1024);
f=fs*(0:
511)/1024;
figure(3)
y2=fft(x2,1024);
subplot(2,1,1);
plot(f,abs(y2(1:
512)));
title('IIR低通滤波器滤波前的频谱')
xlabel('频率/Hz');
ylabel('幅值');
subplot(2,1,2)
F1=plot(f,abs(F0(1:
512)));
title('IIR低通滤波器滤波前的频谱')
xlabel('频率/Hz');
ylabel('幅值');
functionpushbutton5_Callback(hObject,eventdata,handles)
fs=22050;%IIR高通滤波器
x1=wavread('C:
\ProgramFiles\MatLab71\work\1.wav');
Fs=22050;
Ts=1/Fs;R1=50;
Wp=2*pi*5000/fs;
Ws=2*pi*4800/fs;
Rp=1;
Rl=100;
Wp1=2/Ts*tan(Wp/2);
Ws1=2/Ts*tan(Ws/2);
[N,Wn]=cheb2ord(Wp1,Ws1,Rp,Rl,'s');
[Z,P,K]=cheb2ap(N,Rl);
[Bap,Aap]=zp2tf(Z,P,K);
[b,a]=lp2hp(Bap,Aap,Wn);
[bz,az]=bilinear(b,a,Fs);
[H,W]=freqz(bz,az);
figure
(1)
plot(W*fs/(2*pi),abs(H))
grid
xlabel('频率/Hz')
ylabel('频率响应幅度')
title('IIR高通滤波器')
f1=filter(bz,az,x1);
figure
(2)
subplot(2,1,1)
plot(x1)
title('IIR高通滤波器滤波前的时域波形');
subplot(2,1,2)
plot(f1);
title('IIR高通滤波器滤波后的时域波形');
sound(f1,44100);
F0=fft(f1,1024);
f=fs*(0:
511)/1024;
figure(3)
y2=fft(x1,1024);
subplot(2,1,1);
plot(f,abs(y2(1:
512)));
title('IIR高通滤波器滤波前的频谱')
xlabel('频率/Hz');
ylabel('幅值');
subplot(2,1,2)
plot(f,abs(F0(1:
512)));
title('IIR高通滤波器滤波后的频谱')
xlabel('频率/Hz');
ylabel('幅值');
functionpushbutton6_Callback(hObject,eventdata,handles)%IIR带通滤波器
fb1=1200,fb2=3000,fc1=1000,fc2=3200,As=100;Ap=1;fs=22050;
Fs=22050;
x1=wavread('C:
\ProgramFiles\MatLab71\work\1.wav');
Ts=1/fs;R1=30;
W1=2*fb1*pi/fs;W2=2*fc1*pi/fs;
W3=2*fb2*pi/fs;W4=2*fc2*pi/fs;
Wb=[W1,W3];
Wc=[W2,W4];
Wb1=2/Ts*tan(Wb/2);
Wc1=2/Ts*tan(Wc/2);
[N,Wn]=cheb2ord(Wb1,Wc1,Ap,R1,'s');
[Z,P,K]=cheb2ap(N,R1);
[Bap,Aap]=zp2tf(Z,P,K);
[b,a]=lp2bp(Bap,Aap,2100*2*pi,1800*2*pi);
[bz,az]=bilinear(b,a,Fs);
[H,W]=freqz(bz,az);
figure
(1)
plot(W*fs/(2*pi),abs(H))
grid
xlabel('频率/Hz')
ylabel('频率响应幅度')
title('IIR带通滤波器')
f1=filter(bz,az,x1);
figure
(2)
subplot(2,1,1)
plot(x1)
title('IIR带通滤波器滤波前的时域波形');
subplot(2,1,2)
plot(f1);
title('IIR带通滤波器滤波前的时域波形');
sound(f1,44100);
F0=fft(f1,1024);
f=fs*(0:
511)/1024;
figure(3)
y2=fft(x1,1024);
subplot(2,1,1);
plot(f,abs(y2(1:
512)));
title('IIR带通滤波器滤波前的频谱')
xlabel('频率/Hz');
ylabel('幅值');
subplot(2,1,2)
plot(f,abs(F0(1:
512)));
title('IIR带通滤波器滤波前的频谱')
xlabel('频率/Hz');
ylabel('幅值');
functionpushbutton7_Callback(hObject,eventdata,handles)%FIR低通滤波器
fb=1000;fc=1200;As=100;Ap=1;fs=22050;
x1=wavread('C:
\ProgramFiles\MatLab71\work\1.wav');
wc=2*pi*fc/fs;
wn=2*pi*(fc-fb)/fs;
N=ceil((As-7.95)/(2.286*wn));
beta=0.1102*(As-8.7);
Win=Kaiser(N+1,beta);
b=fir1(N,wc/pi,'low',Win);
figure
(1);
freqz(b,1,512);
title('FIR低通滤波器');
f2=filter(b,1,x1);
figure
(2)
subplot(2,1,1)
plot(x1)
title('FIR低通滤波器滤波前的时域波形');
subplot(2,1,2)
plot(f2);
title('FIR低通滤波器滤波后的时域波形');
sound(f2,44100);
F0=fft(f2,1024);
f=fs*(0:
511)/1024;
figure(3)
y2=fft(x1,1024);
subplot(2,1,1);
plot(f,abs(y2(1:
512)));
title('FIR低通滤波器滤波前的频谱')
xlabel('频率/Hz');
ylabel('幅值');
subplot(2,1,2)
F2=plot(f,abs(F0(1:
512)));
title('FIR低通滤波器滤波后的频谱')
xlabel('频率/Hz');
ylabel('幅值');
functionpushbutton8_Callback(hObject,eventdata,handles)%FIR高通滤波器
fc=4800;fb=5000;As=100;Ap=1;fs=22050;
x1=wavread('C:
\ProgramFiles\MatLab71\work\1.wav');
wc=2*pi*fc/fs;wb=2*pi*fb/fs;
wn=wb-wc;
N=ceil((As-7.95)/(2.286*wn))+1;
beta=0.1102*(As-8.7);
Win=Kaiser(N+1,beta);
b=fir1(N,(fb+fc)/(2*fs),'high',Win);
figure
(1);
freqz(b,1,512);
title('FIR高通滤波器');
f2=filter(b,1,x1);
figure
(2);
subplot(2,1,1)
plot(x1)
title('FIR高通滤波器滤波前的时域波形');
subplot(2,1,2)
plot(f2);
title('FIR高通滤波器滤波后的时域波形');
sound(f2,44100);
F0=fft(f2,1024);
f=fs*(0:
511)/1024;
figure(3)
y2=fft(x1,1024);
subplot(2,1,1);
plot(f,abs(y2(1:
512)));
title('FIR高通滤波器滤波前的频谱')
xlabel('频率/Hz');
ylabel('幅值');
subplot(2,1,2)
F2=plot(f,abs(F0(1:
512)));
title('FIR高通滤波器滤波后的频谱')
xlabel('频率/Hz');
ylabel('幅值');
functionpushbutton9_Callback(hObject,eventdata,handles)%FIR带通滤波器
fb1=1200,fb2=3000,fc1=1000,fc2=3200,As=100;Ap=1;fs=22050;
x1=wavread('C:
\ProgramFiles\MatLab71\work\1.wav');
wb1=2*pi*fb1/fs;wb2=2*pi*fb2/fs;
wc1=2*pi*fc1/fs;wc2=2*pi*fc2/fs;
wc=pi*(fb1+fc1)/fs;wb=pi*(fb2+fc2)/fs;
wn=wb-wc;
N=ceil((As-7.95)/(2.286*wn))+1;
beta=0.1102*(As-8.7);
Win=Kaiser(N,beta);
b=fir1(N,[wc,wb]);
figure
(1);
freqz(b,1,512);
title('FIR带通滤波器');
f2=filter(b,1,x1);
figure
(2)
subplot(2,1,1)
plot(x1)
title('FIR带通滤波器滤波前的时域波形');
subplot(2,1,2)
plot(f2);
title('FIR带通滤波器滤波后的时域波形');
sound(f2,44100);
F0=fft(f2,1024);
f=fs*(1:
512)/1024;
figure(3)
y2=fft(x1,1024);
subplot(2,1,1);
plot(f,abs(y2(1:
512)));
title('FIR带通滤波器滤波前的频谱')
xlabel('频率/Hz');
ylabel('幅值');
subplot(2,1,2)
plot(f,abs(F0(1:
512)));
title('FIR带通滤波器滤波前的频谱')
xlabel('频率/Hz');
ylabel('幅值');
functionpushbutton10_Callback(hObject,eventdata,handles)%结束
close;
(6)保存修改后的why.m文件,单击GUI主窗口工具栏中的“激活运行”按钮,在GUI界面中按下“原始信号”按键就可以看到原始信号的波形和频谱,并播放原始信号;选择滤波器种类,就可以看到原信号经过滤波器后的信号的波形与频谱,并播放该信号。
3.8运行结果和分析
3.8.1原始信号采样后时域图和频谱图:
(1)原始语音信号时域图:
图1
(2)原始语音信号频谱图:
图2
3.8.2FIR滤波器及信号通过FIR滤波器后的时域、频谱分析:
(1)FIR低通滤波器:
图3
图4
图5
(2)FIR高通滤波器:
图6
图7
图8
(3)FIR带通滤波器:
图9
图10
图11
3.8.3IIR滤波器及信号通过IIR滤波器后的时域、频谱分析:
(1)IIR低通滤波器:
图12
图13
图14
(2)IIR高通滤波器:
图15
图16
图17
(3)IIR带通滤波器:
图18
图19
图20
3.8.4主程序图:
图21
3.8.5结果分析:
在图1—图21的波形图和频谱图中可以看出,经过滤波器处理后,不仅滤除掉了原信号的部分频率分量,原信号的幅度也会有所衰减,低通滤波器产生的信号相对于原信号变化不大,是因为设定的选频范围是原信号的频率段中较集中的部分,与此同时,高通和带通滤波器产生的信号相对于原信号的幅度就会大大衰减,其原因也是在于高通和带通滤波器的选频范围是原信号频率范围中较少的一部分。
在信号回放时,低通和带阻滤波器回放的音频信号与原信号相比,音色有一点低沉;而高通和带通滤波器回放的音频信号,几乎已经听不到什么声音,这也说明了这两种滤波器产生的信号频率只占原信号频率范围中较少的部分。
所以根据各个滤波器的选频范围及滤波后信号的音效,可大致判断原信号的频率多集中在1000Hz以下。
总结
这是我第一次用MATLAB来完成课程设计,虽然之前我也学过MATLAB的操作,不过由于很久没用过了,而且之前学得也不是很扎实,因而现在运用得不是很流畅,在设计过程中也遇到不少麻烦。
通过用MATLAB设计滤波器,加深了我对数字信号处理理论知识,尤其是采样频率,频谱特性和数字滤波器的设计,更加认识到了matlab在数字信号应用中的重要作用。
与此同时,我深刻体会到了理论与实际相结合的重要性,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正提高自己的实际动手能力和独立思考的能力。
总的来说,这次课程设计还是比较成功的,在设计中遇到了很多问题,但在同学和书本的帮助下,都成功解决了,有点小小的成就感,终于觉得平时所学的知识有了实用的价值,达到了理论与实际相结合的目的,不仅学到了不少知识,而且锻炼了自己的能力,使自己对以后的路有了更加清楚的认识,同时,对未来有了更多的信心。
参考文献
1、高西全,丁玉美.数字信号处理教程.西安电子科技大学出版社,2008
2、罗军辉,罗勇江,白义臣.MATLAB在数字信号处理中的应用.北京:
机械工业出版社,2003
3、刘波,文忠,曾涯.MATLAB信号处理.成都:
电子工业出版社,2005
4、刘泉,阙大顺.数字信号处理原理与实现.西安:
电子工业出版社,2005
5、胡航.语音信号处理.哈尔滨:
哈尔滨工业大学出版社,2002
6、张威.MATLAB基础与编程入门.西安:
西安电子科技大学出版社,2006
7、崔怡.MATLAB5.3实例详解.北京:
航天工业出版社,2000
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 简单 语音 处理 系统 设计