
课程设计
资料袋
计算机与通信学院(系、部)2009~2010 学年第二学期课程名称:MATLAB 语言与应用
指导教师:文鸿职称讲师
学生姓名:申鹏专业班级通信071班学号07408200112 设计题目:语音信号的滤波处理及时频域分析
成绩:
起止日期:2009 年7 月5 日至2010 年7 月11 日
目录清单
序号材料名称资料数量备注
1 课程设计任务书 1
2 课程设计说明书 1
3 张
4
5
6湖南工业大学
课程设计任务书
2009 — 2010学年第二学期
计算机与通信学院(系、部)通信工程专业071 班级课程名称:MATLAB语言及应用
设计题目:语音信号的滤波处理及时频域分析
完成期限:自2010 年 6 月26 日至2010 年7 月 2 日共 1 周
内容及任务一、设计的主要技术参数
语音信号的录入、波形的滤波处理和信号的回放效果比较分析。
二、设计任务
1.录制声音信号
2.设计滤波器
3.用设计的滤波器进行滤波
4.回放声音信号
三、设计工作量
1周完成
进度安排
起止日期工作内容
2010.7.5 查找相关资料掌握语音信号的滤波和时频域分析2010.7.6—7.8 设计时频域分析的方法
2010.7.9—7.10 设计滤波器(包括低通、高通和带通)
2010.7.11 总结,撰写课程设计报告
主要参考资料1、陈怀琛.MATLAB及在电子信息课程中的应用[M].北京:电子工业出版社
2、张文.基于MATLAB的语音信号的滤波与实现[J].山西电子技术.
3、蔡莲红,黄德智.现代语音技术基础与应用清华大学出版社
4、胡航.语音信号处理[M].哈尔滨:哈尔滨工业大学出版社
指导教师(签字):年月日系(教研室)主任(签字):年月日
MATLAB语言与应用
课程设计说明书
语音信号的滤波处理及时频域分析起止日期:2010年07月5日至2010年07月11日
学生姓名申鹏
班级通信071班
学号07408200112
成绩
指导教师(签字)
计算机与通信学院
2010年7 月11日课题名称语音信号的滤波处理及时频域分析人数 6
组长申鹏同组人员申鹏、郭胜华、朱钧宇、姚广哲、罗顺湖、邓勇
课题的主要内容和要求一、设计的要求
设计要求:
1。录制一段2s左右的语音信号,并对录制的信号进行8000Hz采样,画出采样后语音信号的时域波形和频谱图。
2。给定滤波器的性能指标,采用窗函数法和双线性变换设计滤波器,并画出滤波器的频率响应。各滤波器的性能指标:
(1)低通滤波器性能指标fb=1 000 Hz, fc=1 200 Hz, As=100 dB, Ap=1 dB。
(2)高通滤波器性能指标fc=4 800 Hz, fb=5000 Hz As=100 dB, Ap=1 dB。
(3)带通滤波器性能指标fb1=1200 Hz, fb2=3000 Hz, fc1=1 000 Hz, fc2=3200 Hz, As=100 dB, Ap=1 dB。要求用窗函数法或双线性变换法设计上面要求的3种IIR滤波器。
3。然后用自己设计的滤波器对采集的信号进行滤波,画出滤波后信号的时域波形和频谱,并对滤波前后的信号进行对比,分析信号的变化。
4。回放语音信号。
二、设计任务:
1、录制一段2S左右的声音文件
2、设计三种滤波器对信号进行滤波(包括低通,高通和带通)
3、对滤波前后的波形进行比较
4、回放各个部分的语音信号
三、内容:
1、语音信号的滤波处理
2、语音信号的时频域分析
3、滤波器的设计
4、滤波后的语音信号的效果
具体任务
求
查找资料 录制声音信号 设计滤波器
用设计的滤波器进行滤波 回放声音信号 书写报告
时
时间安排与完成情况
2010.7.5 查找相关资料掌握语音信号的滤波处理及时频域分析; 2010.7.6 完成实验的总体设计; 2010.7.7 分析时频域的信号图像; 2010.7.8 设计椭圆低通滤波器; 2010.7.9 设计高通滤波器,并且比较两者的细节; 2010.7.10 设计带通滤波器,会放声音部分; 2010.7.11
比较信号各个时机的绘图情况和滤波后的声音效果。
一、MATLAB环境简介
MATLAB 语言是一种数据分析和处理功能十分强大的计算机应用软件 ,它可以将声音文件变换为离散的数据文件 , 然后利用其强大的矩阵运算能力处理数据 ,如数字滤波、傅里叶变换、时域和频域分析、声音回放以及各种图的呈现等 , 信号处理是MATLAB 重要应用的领域之一。
本课程设计介绍了基于Matlab的对语音信号采集、处理及滤波器的设计,并使之实现的过程。理解与掌握课程中的基本概念、基本原理、基本分析方法,用Matlab进行数字语音信号处理,并阐述了课程设计的具体方法、步骤和内容。综合运用本课程的理论知识进行频谱分析以及滤波器设计,通过理论推导得出相应结论,并利用MATLAB作为工具进行实现,从而复习巩固课堂所学的理论知识,提高对所学知识的综合应用能力,并从实践上初步实现对数字信号的处理。二、设计步骤
1.整体设计思路
Matlab 语言是一种数据分析和处理功能十分强大的计算机应用软件 ,它可以将声音文件变换为离散的数据文件 , 然后利用其强大的矩阵运算能力处理数据 ,如数字滤波、傅里叶变换、时域和频域分析、声音回放以及各种图的呈现等 , 信号处理是 Matlab 重要应用的领域之一。本文是用 Matlab对含噪的的语音信号同时在时域和频域进行滤波处理和分析。整个设计思路的设计原理示意图如图 1 所示:2.整体实现过程
采样器的作用是把连续信号变为脉冲或数字序列。图中示出了一个连续信号f(t)经采样器采样后变为离散信号的过程
图 2 连续信号f(t)经采样器采样后变为离散信号
图中f(t)为被采样的连续信号,S(t)为周期性窄脉冲信号,f s(t)为采样后的离散信号,它用下式来表征:fs(t)=f(t)s(t) 采样信号的频率特性为:
如果|F*(jω)|中各个波形不重复搭接,相互间有一定的距离(频率)即若
即采样定理可叙述如下:如果采样周期满足下列条件,即:
式中ωma x为连续信号f(t)的最高次谐波的角频率。则采样信号f*(t)
就可以无失真地再恢复为原连续信号f(t)。需要指出的是,采样定理只是在理论上给出了信号准确复现的条件。
我们可以利用windows自带的录音机录制语音文件,进行数字信号的采集。(开始—程序—附件—娱乐—录音机,文件—属性—立即转换—8000KH z,8位,单声道)或其他软件,将话筒输入计算机的语音输入插口上,启动录音机,录制一段自己的话音。然后在MATLAB软件平台下,利用函数wavread对语音信号进行采样,记住采样频率和采样点数。通过wavread函数的使用进一步理解采样频率、采样
位数等概念。图2是基于PC 机的语音信号采集过程:
声音
图3 语音采集过程
3.语音信号的读取
在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 中。
对语音信号“shiyan.wav ”进行采样其程序如下:
[y,fs,nbits]=wavread('shiyan.wav')
可知该语音信号的采样频率fs = 8000Hz ,数据位nbits = 16Bit 。
4语音信号的频谱分析
首先画出语音信号的时域波形,然后对语音信号进行频谱分析。在Matlab 中可以利用函数fft 对信号行快速傅里叶变换,得到信号的频谱特性,从而加深对频谱特性的理解。
其程序如下:
Windows 自带录音机
麦克风 声卡 滤波 采样 A/D 转换 Wav
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:
图4 语音信号的频谱
5.噪声信号的构建
利用MATLAB中的随机函数(randn)产生噪声加入到语音信号中,模仿语音信号被污染,并对其进行频谱分析。程序如下:N=length(y); %求出语音信号的长度
noise=rand(N,2)/20; %噪声信号的函数
z=fft(noise); %快速傅里叶变换
subplot(2 ,1 ,1),plot(noise);title('噪声信号波形');
subplot(2 ,1 ,2),plot(abs(z));title('噪声信号频谱');
axis([0,250000,0,100]);
图5 噪声信号的频谱
6.加入噪声的语音信号的频谱
matlab程序如下:
y=wavread(' yuyin.wav');
N=length(y);
noise=rand(N,2)/20;
s=y+noise; %噪声信号的叠加
Subplot(2,1,1);
plot(s);title ('滤波前的时域波形');
S=fft(s);Subplot(2,1,2);
plot(abs(S));title ('滤波前的频域波形');
axis([0,45000,0,200]);
图6 加噪语音信号的频谱
7. 滤波器的设计原理
设计数字滤波器的任务就是寻求一个因果稳定的线性时不变系统,并使系统函数H(z)具有指定的频率特性。数字滤波器根据其冲激响应函数的时域特性,可分为两种,即无限长冲激响应(IIR)滤波器和有限长冲激响应(FIR)滤波器。IIR滤波器的特征是,具有无限持续时间冲激响应。这种滤波器一般需要用递归模型来实现,因而有时也称之为递归滤波器。FIR滤波器的冲激响应只能延续一定时间,在工程实际中可以采用递归的方式实现,也可以采用非递归的方式实现。
8. 滤波器的性能指标
在设计一个滤波器之前,必须首先根据工程实际的需要确定滤波器的技术指标。在很多实际应用中,数字滤波器常常被用来实现选频操作。因此,指标的形
式一般在频域中给出幅度和相位响应。幅度指标主要以两种方式给出。第一种是绝对指标。它提供对幅度响应函数的要求,一般应用于FIR 滤波器的设计。第二种指标是相对指标。它以分贝值的形式给出要求。在工程实际中,这种指标最受欢迎。对于相位响应指标形式,通常希望系统在通频带中人有线性相位。运用线性相位响应指标进行滤波器设计具有如下优点:①只包含实数算法,不涉及复数运算;②不存在延迟失真,只有固定数量的延迟;③长度为N 的滤波器(阶数为N-1),计算量为N/2数量级。下面给出了有关滤波器的性能指标
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 ;
9. IIR 数字滤波器设计
IIR 数字滤波器是一种离散时间系统,其系统函数为
(1-3)
假设M ≤N ,当M >N 时,系统函数可以看作一个IIR 的子系统和一个(M-N)的FIR 子系统的级联。IIR 数字滤波器的设计实际上是求解滤波器的系数和 ,它是数学上的一种逼近问题,即在规定意义上(通常采用最小均方误差准则)去逼近系统的特性。如果在S 平面上去逼近,就得到模拟滤波器;如果在z 平面上去逼近,就得到数字滤波器。
设计流程如图所示:
频域指标 双线性变换法 脉冲响应不变法
图7 IIR 滤波器的间接法设计
8.IIR 低通滤波器:
Ft=8000;
设计模拟滤波器
H (s ) 数字滤波器 H (z )
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]=ellipord(wp,ws,1,50,'s');
[b,a]=ellip(N,wc,'s');
[bz,az]=bilinear(b,a,0.5);
[h,w]=freqz(bz,az);
plot(w*8000*0.5/pi,abs(h));
Legend('用椭圆设计');
title('IIR低通滤波器');
grid;
图8
9.滤波器对信号滤波
用设计好的数字滤波器对含噪语音信号进行滤波,在Matlab 中FIR 滤波器利用函数fftfilt 对信号进行滤波, IIR滤波器利用函数filter 对信号进行滤波,在一个窗口同时画出滤波前后的波形及频谱如图。
程序源代码:
[y,fs,nbits]=wavread('shiyan.wav');
N=length(y);
y=wavread('shiyan.wav'); %把语音信号进行加载入Matlab 仿真软件平台中
sound(y,fs,nbits); %对加载的语音信号进行回放
Y=fft(y); %快速傅里叶变换
figure(1);
subplot(2 ,1 ,1),plot(y);title('原始信号波形');
subplot(2 ,1 ,2),plot(abs(Y));title('原始信号频谱');
noise=rand(N,2)/20; %噪声信号的函数
z=fft(noise); %快速傅里叶变换
figure(2);
subplot(2 ,1 ,1),plot(noise);title('噪声信号波形');
subplot(2 ,1 ,2),plot(abs(z));title('噪声信号频谱');
axis([0,1000,0,10]);
s=y+noise; %噪声信号的叠加
figure(3)
subplot(2,2,1);plot(s);title ('滤波前的时域波形');
S=fft(s);subplot(2,2,2);plot(abs(S));title ('滤波前的频域波形');
%设计低通椭圆滤波器
Ft=8000;
Fp1=1000;
Fs1=1200;
wp1=2*Fp1/Ft;
ws1=2*Fs1/Ft;
[N,wc]=ellipord(wp1,ws1,1,100,'s'); %最小阶数和截止频率根据转换后的技术指标使用滤波器阶数函数,确定滤波器的最小阶数N和截止频率Wc; 巴特沃斯模拟滤波器的阶数N 及频率参数wc,
[b,a]=ellip(N,1,100,wc);
[h,w]=freqz(b,a); %绘出频率响应曲线
figure(4);
subplot(3,1,1);
plot(w*Ft*0.5/pi,abs(h));
legend('用ellip设计');
title('IIR低通滤波器');
axis([0,2000,0,1]);
z11=filter(b,a,s);
m11=fft(z11);
figure(3)
subplot(2,2,3);plot(z11,'g');title ('滤波后的时域波形');
subplot(2,2,4);plot(abs(m11),'r');title ('滤波后的频域波形');
sound(z11);
%设计高通滤波器
%Ft=8000;
Fp2=5000;
Fs2=4800;
wp2=Fp2/Ft;
ws2=Fs2/Ft;
[N,wc]=ellipord(wp2,ws2,1,100,'s'); %最小阶数和截止频率
[b,a]=ellip(N,1,100,wc,'high');
[h,w]=freqz(b,a); %绘出频率响应曲线
figure(4);
subplot(3,1,2)
plot(w*Ft*0.5/pi,abs(h));
legend('用ellip设计');
title('IIR高通滤波器');
axis([0,5000,0,1]);z12=filter(b,a,s);
m12=fft(z12);
figure(5)
subplot(2,1,1);plot(z12,'g');title ('高通滤波后的时域波形');
subplot(2,1,2);plot(abs(m12),'r');title ('高通滤波后的频域波形');
sound(z12);
%设计带通滤波器
wp3=[1200,3000]/(Ft/2);
ws3=[1000,3200]/(Ft/2);
[N,wc]=ellipord(wp3,ws3,1,100,'s'); %最小阶数和截止频率
[b,a]=ellip(N,1,100,wc);
[h,w]=freqz(b,a); %绘出频率响应曲线
figure(4);
subplot(3,1,3);
plot(w*Ft*0.5/pi,abs(h));
legend('用ellip设计');
title('IIR带通滤波器');
axis([0,5000,0,1]);
z13=filter(b,a,s);
m13=fft(z13);
figure(6);
subplot(2,1,1);plot(z13,'g');title ('带通滤波后的时域波形');
subplot(2,1,2);plot(abs(m13),'r');title ('带通滤波后的频域波形');
sound(z13);
10.语音信号回放
以上几种滤波,我们都可以从信号滤波前后的波形图以及频谱图上看出变化。我们可以用sound()函数来播放滤波后的语音,从听觉上直接感受语音信号的变化,但由于人耳听力的,有些情况下我们是很难听出异同的。在matlab 中, 函数sound 可以对声音进行回放,其调用格式为: sound( z13) 。通过回放可以发现滤波前后的声音有变化。
三、心得体会
通过这次的课程设计我们可以学的到很多的东西,不仅可以巩固以前所学过的知识,还可以学到很多在书本上所没有学到过的知识。进一步加深了对数字信号处理的了解,让我对它有了更加浓厚的兴趣。因为以前学过信号与系统和数字信号处理两门课,但这只是理论知识,通过实验我们才能真正理解其意义。语音信号处理在以前的学习中并没有怎么接触,但是通过网上查找资料,我很快的理解了其基本原理。
在设计的过程中我还是遇到不少的问题的,比如刚开始,要处理的是WAV 格式的语音信号,可是我发现并不是所有的WAV文件都可以用WAVREAD函数读取的,这才了解到WAV文件之间也是有区别的,并且如果格式不对的话,我们要把格式转换成WAV格式。刚开始由于对滤波器的滤波原理并不是很了解,于是我又翻出学过的数字信号处理课本,认真研究起各种滤波器了,这才使我明白了大多数滤波器是如何工作地,不再单单只是懂理论,理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论。
总的来说,通过这次的课程设计我对语音信号有了全面的认识,对数字信号处理的知识又有了深刻的理解,让我感受到只有在充分理解课本知识的前提下,才能更好的应用这个工具;并且熟练的应用MATLAB也可以很好的加深我对课程的理解,方便我的思维。这次设计使我了解了MATLAB的使用方法,学会分析滤波器的优劣和性能,提高了分析和动手实践能力。同时我相信,进一步加强对MATLAB的学习与研究对我今后的学习将会起到很大的帮助!
