数字信号处理设计报告
题目:基于Matlab的语音信号处理
系 别 信息工程学院 专业班级 通信工程1342 学生姓名 范泉 指导教师 吉李满 提交日期 2016年6月 10日
摘 要
数字信号处理的目的是对真实世界的连续模拟信号进行测量或滤波。因此在进行数字信号处理之前需要将信号从模拟域转换到数字域,这通常通过模数转换器实现。而数字信号处理的输出经常也要变换到模拟域,这是通过数模转换器实现的。数字信号处理的算法需要利用计算机或专用处理设备如数字信号处理器(DSP)和专用集成电路(ASIC)等。数字信号处理技术及设备具有灵活、精确、抗干扰强、设备尺寸小、造价低、速度快等突出优点,这些都是模拟信号处理技术与设备所无法比拟的。
本设计的具体内容是基于MATLAB的语音信号处理,核心算法是离散傅立叶变换(DFT),是DFT使信号在数字域和频域都实现了离散化,从而可以用通用计算机处理离散信号。然后添加噪声信号,选用合适的滤波器对噪声信号进行滤除,使数字信号处理从理论走向实用。
MATLAB功能强大,可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程序等,主要应用于工程计算、控制设计、信号处理与通讯、图像处理、信号检测、金融建模设计与分析等领域.用MATLAB来解算问题要比用其他语言简捷得多,并且mathwork也吸收了像Maple等软件的优点,使MATLAB成为一个强大的数学软件。在新的版本中也加入了对C,FORTRAN,C++ ,JAVA的支持.可以直接调用,用户也可以将自己编写的实用程序导入到MATLAB函数库中方便自己以后调用,此外许多的MATLAB爱好者都编写了一些经典的程序,用户可以直接进行下载就可以用.
关键词:数字信号处理器;离散傅立叶变换;MATLAB
I
目 录
目 录
第一章 绪论......................................................... 1
1.1课题研究的目的............................................... 1 1.2课题研究的意义和现状......................................... 1
1.2.1课题研究的意义 ......................................... 1 1.2.2课题研究的现状 ......................................... 1
第二章 课题研究方案的确定........................................... 3
2.1概要设计..................................................... 3
2.1.1主要工作 ............................................... 3
2.1.2研究步骤 ............................................... 3 2.2方案选择..................................................... 3
2.2.1运行的环境 ............................................. 3 2.2.2总体方案 ............................................... 4
第三章 课题研究内容................................................. 5
3.1 Matlab简单介绍.............................................. 5 3.2语音信号的采样理论依据....................................... 5
3.2.1采样频率 ............................................... 5 3.2.2采样位数 ............................................... 5 3.2.3采样定理 ............................................... 6 3.3语音信号的采集............................................... 6 3.4设计数字滤波器............................................... 6
3.4.1数字滤波器设计的基本思路 ............................... 6 3.4.2 IIR数字滤波器概述 ..................................... 6 3.4.3 FIR数字滤波器概述 ..................................... 7 3.4.4 FIR数字滤波器和IIR数字滤波器比较 ..................... 7 3.4.5低通高通及带通滤波器 ................................... 7 3.5程序流程图................................................... 8 第四章 软件仿真调试结果分析......................................... 9
4.1语音信号的时频分析........................................... 9
4.2语音信号加噪与频谱分析...................................... 10 4.3滤波器的设计................................................ 12
4.3.1设计FIR滤波器 ........................................ 12 4.3.2设计IIR滤波器 ........................................ 12 4.3.3双线性变换法和窗函数法 ................................ 12 4.4验证所设计的滤波器.......................................... 14 4.5滤波........................................................ 15 第五章 GUI界面 .................................................... 17
I
目 录
5.1 GUI界面概述................................................ 17 5.2创建GUI界面................................................ 17 第六章 总结与展望.................................................. 20 参考文献........................................................... 21 附录I设计FIR和IIR数字滤波器...................................... 1 附录II比较滤波前后语音信号的波形及频谱............................. 7 附录III 源程序代码 ................................................ 16
II
第一章 绪论
第一章 绪论
1。1课题研究的目的
1.学会MATLAB的使用,掌握MATLAB的程序设计方法。 2.掌握在Windows环境下语音信号采集的方法。
3.掌握数字信号处理的基本概念、基本理论和基本方法.
4。掌握MATLAB设计数字滤波器的方法并会对信号进行分析和处理。
1.2课题研究的意义和现状
1。2.1课题研究的意义
语音信号的采集与分析技术是一门涉及面很广的交叉科学,它的应用和发展与语音学、声音测量学、电子测量技术以及数字信号处理等学科紧密联系,语音是人类获取信息的重要来源和利用信息的重要手段。在信号传输过程中,由于实验条件或各种其他主观或客观条件的原因,语音处理系统都不可避免地要受到各种噪声的干扰.噪声不但降低了语音质量和语音的可懂度,而且还将导致系统性能的急剧恶化,严重时使整个系统无法正常工作。
MATLAB是由美国math works公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言(如C、Fortran)的编辑模式,代表了当今国际科学计算软件的先进水平。其强大的数据处理能力可以极大程度上削弱噪声影响,还原出真实的语音信号. 1.2。2课题研究的现状
MATLAB是Matrix Laboratory(矩阵实验室)的缩写,是Math Works推出的一套高性能可视化软件,它集数值分析,矩阵运算,函数生成,信号处理,图像处理,建模与仿真等诸多功能于一体,为使用者提供一个高效的编程工具.本次毕业设计中,我们就用它作为编程工具和辅助工具进行设计。
噪声污染位于联合国四大公认污染之一,无论是尖锐的火车汽笛声,还是我们肉耳听不到的超声波,次声波都有可能给人们生活带来极大不便。在机械方面,机械件碰撞带来的噪声会缩短器件寿命,在电子方面,电器件在噪声的影响下可能会失灵.
华中师范大学教育信息技术工程研究中心(武汉)刘智老师曾经就机械噪声给人们身心带来的伤害进行过一次计算机仿真,同时用MATLAB进行了信号处理。此次研究,他通过比较加噪前后,语音的频谱和语音回放,能明显的感觉到加入噪声后回放的声音与原始的语音信号有很大的不同,前者有较尖锐的噪声干扰人声.从含噪语音信号的频谱图中可以看出含噪声的语音信号频谱,在整个频域范围内分是布均匀.其实,这正是干扰所造成的。通过滤波前后的对比,得出低通滤波后效果最好,高通滤波后的效果最差的结果。
1
第一章 绪论
大连理工大学2000级硕士蒋瑞艳也曾经做过一个振动,噪声处理系统,它是WINDOWS界面下的振动、噪声信号处理系统,它在专用模拟输入硬件(数据采集系统)支持下,可以完成振动、噪声信号的数据采集以及功率谱、倒谱、谱阵和传递函数分析等功能。能将数据转化成各种对应的图形,并具备ZOOM功能.它可以广泛应用于实验室、生产现场和教学中做振动、噪声的测试和分析,可以代替专用信号处理机的工作。 本系统软件采用先进的C++ Builder语言编制,在WINDOWS系统下运行。软件界面的设计以满足大多数用户为主,力求直观通俗,通过菜单驱动完成各个功能.
华中科技大学能源与动力工程学院就“基于MATLAB的噪声信号采集与分析系统研究\"做过研究报告,他们利用MATLAB的数据采集工具箱(DAQ)和信号处理工具箱开发了一套声音信号采集分析系统,该系统不仅能够实现低成本、高精度的实时采集,还能将声音信号资料导入系统进行时域和频域分析。利用另外一个工具Compiler使编制的MATLAB程序能够独立运行从而提高了运行速度;配备了友好的图形用户界面(GUI),方便用户操作。最后给出了系统在内燃机噪声诊断方面的应用实例。
在机械方面,西北工业大学航海工程学院就“基于MATLAB的舰船辐射噪声信号小波消噪处理”做过研究报告,他们针对舰船辐射噪声信号的特点提出了小波消噪的方法,对小波消噪理论作了简要的阐述,并设计了一种消噪方案,最后利用MATLAB,在计算机上选用不同的小波基和阈值进行了实船信号的消噪处理试验,并对结果进行了简单的分析比较.试验结果表明,在选择了合适的小波基和阈值的情况下,利用小波变换的方法对舰船辐射噪声进行消噪处理可以取得良好的效果.
由此可见,MATLAB给噪声处理带来了极大“福音”.
2
第二章 课题研究方案的确定
第二章 课题研究方案的确定
2.1概要设计
2。1。1主要工作
本文简要介绍了语音信号采集与分析的发展史以及语音信号的特征、采集与分析方法,并通过手机录制自己的一段声音,运用Matlab进行仿真,最后对于声音中的噪声进行滤波处理,比较铝箔前后的变化以及介绍语音信号的特点与采集,仿真主要是验证奈奎斯特定理,对于语音信号进行时域、频域上的分析,率 谱,是对语音信号的综合分析,包括语音信号的调制和滤波。 2。1。2研究步骤 1。理论依据
根据设计要求分析系统功能,掌握设计中所需理论,阐明设计原理。 2。信号采集 采集语音信号并对其进行频谱分析,画出信号的时域波形图和频谱图。 3。构造受干扰信号并对其进行频谱分析 对所采集的语音信号假如干扰噪声,对语音信号进行回放,感觉加噪前后声音变化,分析原因,得出结论。并对其进行频谱分析,比较加噪前后语音信号的波形及频谱,对所的结果进行分析,阐明原因得出结论。 4。数字滤波器设计 根据待处理信号特点,设计合适数字滤波器,绘制所设计滤波器的幅频和相频特性
5.信号处理 用所设计的滤波器对含噪语音信号进行滤波。对滤波后的语音信号进行频谱分析。画出处理过程中所得各种波形及频谱图。 对语音信号进行回放,感觉滤波前后声音的变化。比较滤波前后语音信号的波形及频谱,对所得结果和滤波器性能进行频谱分析,阐明原因,得出结论.
2.2方案选择
2.2。1运行的环境
运行环境主要介绍了硬件环境和软件环境 硬件环境:
(1) 处理器:Inter Core I3 (2) 内存:4G
(3) 硬盘空间:500G
(4) 显卡:Nvidia GTX940 软件环境:
操作系统:Windos 8。1 开发环境:Matlab 2014a
3
第二章 课题研究方案的确定
2。2.2总体方案
用Matlab画出原始信号的波形图和频谱图,然后给原始语音信号加如噪声,并对其进行频谱分析,最后利用滤波器对被噪声污染的语音信号进行滤波并分析滤波后的时域和频域特性,最后建立GUI界面.
4
第三章 课题研究方案及内容
第三章 课题研究内容
3。1 Matlab简单介绍
MATLAB是矩阵实验室(Matrix Laboratory)的简称,是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。
MATLAB是由美国mathworks公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言(如C、Fortran)的编辑模式,代表了当今国际科学计算软件的先进水平。
MATLAB和Mathematica、Maple并称为三大数学软件。它在数学类科技应用软件中在数值计算方面首屈一指。MATLAB可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程序等,主要应用于工程计算、控制设计、信号处理与通讯、图像处理、信号检测、金融建模设计与分析等领域。
MATLAB的基本数据单位是矩阵,它的指令表达式与数学、工程中常用的形式十分相似,故用MATLAB来解算问题要比用C,FORTRAN等语言完成相同的事情简捷得多,并且MATLAB也吸收了像Maple等软件的优点,使MATLAB成为一个强大的数学软件.在新的版本中也加入了对C,FORTRAN,C++ ,JAVA的支持。可以直接调用,用户也可以将自己编写的实用程序导入到MATLAB函数库中方便自己以后调用,此外许多的MATLAB爱好者都编写了一些经典的程序,用户可以直接进行下载就可以用。
MATLAB 的应用范围非常广,包括信号和图像处理、通讯、控制系统设计、测试和测量、财务建模和分析以及计算生物学等众多应用领域.附加的工具箱(单独提供的专用 MATLAB 函数集)扩展了 MATLAB 环境,以解决这些应用领域内特定类型的问题
3.2语音信号的采样理论依据
3.2.1采样频率
采样频率是指计算机每秒钟采集多少个声音样本,是描述声音文件的音质、音调,衡量声卡、声音文件的质量标准。采样频率越高,即采样的间隔时间越短,则在单位时间内计算机得到的声音样本数据就越多,对声音波形的表示也越精确。采样频率与声音频率之间有一定的关系,根据奎斯特理论,只有采样频率高于声音信号最高频率的两倍时,才能把数字信号表示的声音还原成为原来的声音。这就是说采样频率是衡量声卡采集、记录和还原声音文件的质量标准。 3。2.2采样位数
采样位数即采样值或取样值,用来衡量声音波动变化的参数,是指声卡在采集和播放声音文件时所使用数字声音信号的二进制位数.采样频率是指录音设备
5
第三章 课题研究方案及内容
在一秒钟内对声音信号的采样次数,采样频率越高声音的还原就越真实越自然.
采样位数和采样率对于音频接口来说是最为重要的两个指标,也是选择音频接口的两个重要标准.无论采样频率如何,理论上来说采样的位数决定了音频数据最大的力度范围。每增加一个采样位数相当于力度范围增加了6dB。采样位数越多则捕捉到的信号越精确.对于采样率来说你可以想象它类似于一个照相机,44。1kHz意味着音频流进入计算机时计算机每秒会对其拍照达441000次。显然采样率越高,计算机摄取的图片越多,对于原始音频的还原也越加精确。 3.2.3采样定理
在进行模拟/数字信号的转换过程中,当采样频率fs。max大于信号中,最高频率fmax的2倍时,即:fs。max〉=2fmax,则采样之后的数字信号完整地保留了原始信号中的信息,一般实际应用中保证采样频率为信号最高频率的5~10倍;采样定理又称奈奎斯特定理.
1924年奈奎斯特(Nyquist)就推导出在理想低通信道的最高大码元传输速率的公式:
理想低通信道的最高大码元传输速率=2W*log2 N (其中W是理想低通信道的带宽,N是电平强度)
3。3语音信号的采集
利用PC机上的声卡和WINDOWS操作系统可以进行数字信号的采集。将话筒输入计算机的语音输入插口上,启动录音机。按下录音按钮,接着对话筒说话“语音信号处理”,说完后停止录音,屏幕左侧将显示所录声音的长度.点击放音按钮,可以实现所录音的重现。以文件名“Orisound”保存入c :\\ MATLAB \\ work中。可以看到,文件存储器的后缀默认为。 wav ,这是WINDOWS操作系统规定的声音文件存的标准。 3。4设计数字滤波器
3。4.1数字滤波器设计的基本思路
数字滤波器的实现有两个关键步骤:一个从数字域到模拟域间的变换,这个变换实现了数字滤波器技术指标到模拟滤波器技术指标的转换,同样也实现了模拟滤波器系统函数到数字滤波器系统函数的转换;另一个是从模拟滤波器技术指标到满足该指标的模拟滤波器的设计。
3。4。2 IIR数字滤波器概述
IIR(Infinite Impulse Response)数字滤波器,又名“无限脉冲响应数字滤波器”,或“递归滤波器”.递归滤波器,也就是IIR数字滤波器,顾名思义,具有反馈,一般认为具有无限的脉冲响应.IIR滤波器有以下几个特点:
(1)封闭函数:IIR数字滤波器的系统函数可以写成封闭函数的形 式。
(2)IIR数字滤波器采用递归型结构:IIR数字滤波器采用递归型结构,即结构上带有反馈环路。IIR滤波器运算结构通常由延时、乘以系数和相加等基本
6
第三章 课题研究方案及内容
运算组成,可以组合成直接型、正准型、级联型、并联型四种结构形式,都具有反馈回路。由于运算中的舍入处理,使误差不断累积,有时会产生微弱的寄生振荡。
(3)借助成熟的模拟滤波器的成果:IIR数字滤波器在设计上可以借助成熟的模拟滤波器的成果,如巴特沃斯、契比雪夫和椭圆滤波器等,有现成的设计数据或图表可查,其设计工作量比较小,对计算工具的要求不高。在设计一个IIR数字滤波器时,我们根据指标先写出模拟滤波器的公式,再通过一定的变换,将模拟滤波器的公式转换成数字滤波器的公式。
(4)需加相位校准网络:IIR数字滤波器的相位特性不好控制,对相位要求较高时,需加相位校准网络。 3。4。3 FIR数字滤波器概述
FIR数字滤波器(finite impulse response filter)又名“有限脉冲响应数字滤波器”,这类滤波器对于脉冲输入信号的响应最终趋向于0,因此而得名.有限脉冲响应滤波器(FIR filter)的优点:
(1)脉冲响应(impulse response)为有限长:造成当输入数位讯号为有限长的时候,输出数位讯号也为有限长。
(2)比无限脉冲响应滤波器(IIR filter)较容易最佳化(optimize). (3)线性相位(linear phase):造成h(n),是偶对称(even)或奇对称(odd)且有限长。
(4)一定是稳定的(stable):因为Z转换(Z transform)后所有的极点(pole)都在单位圆内
3。4。4 FIR数字滤波器和IIR数字滤波器比较
不论是IIR滤波器还是FIR滤波器的设计都包括三个步骤: (1)按照实际任务的要求,确定滤波器的性能指标。
(2)用一个因果、稳定的离散线性时不变系统的系统函数去逼近这一性能指标。根据不同的要求可以用IIR系统函数,也可以用FIR系统函数去逼近。
(3)利用有限精度算法实现系统函数,包括结构选择、字长选择等。 但IIR滤波器和FIR滤波器的设计方法完全不同。IIR滤波器设计方法有间接法和直接法,间接法是借助于模拟滤波器的设计进行的.
其设计步骤是:
先设计过渡模拟滤波器得到系统函数H(s),然后将H(s)按某种方法转换成数字滤波器的系统函数H(z)。FIR滤波器比鞥采用间接法,常用的方法有窗函数法、频率采样发和切比雪夫等波纹逼近法。对于线性相位滤波器,经常采用FIR滤波器.
3。4。5低通高通及带通滤波器
低通滤波器:对于不同滤波器而言,每个频率的信号的减弱程度不同。当使用在音频应用时,它有时被称为高频剪切滤波器, 或高音消除滤波器.低通滤波器概念有许多不同的形式,其中包括电子线路(如音频设备中使用的hiss 滤波器、平滑数据的数字算法、音障(acoustic barriers)、图像模糊处理等等,
7
第三章 课题研究方案及内容
这两个工具都通过剔除短期波动、保留长期发展趋势提供了信号的平滑形式。低通滤波器在信号处理中的作用等同于其它领域如金融领域中移动平均数(moving average)所起的作用;低通滤波器有很多种,其中,最通用的就是巴特沃斯滤波器和切比雪夫滤波器。
高通滤波器:去掉信号中不必要的低频成分,去掉低频干扰的滤波器。在电力系统中,谐波补偿时用高通滤波器滤除某次及其以上的各次谐波。高通滤波器是指车载功放中能够让中、高频信号通过而不让低频信号通过的电路,其作用是滤去音频信号中的低音成分,增强中音和高音成分以驱动扬声器的中音和高音单元。此外高通滤波器常常和低通滤波器成对出现,不论哪一种,都是为了把一定的声音频率送到应该去的单元。 带通滤波器:能通过某一频率范围内的频率分量、但将其他范围的频率分量衰减到极低水平的滤波器,与带阻滤波器的概念相对。一个模拟带通滤波器的例子是电阻-电感-电容电路(RLC circuit)。这些滤波器也可以用低通滤波器同高通滤波器组合来产生。
3.5程序流程图
图3—1程序流程图
8
第四章 软件仿真调试及结果分析
第四章 软件仿真调试结果分析
4.1语音信号的时频分析
在MATLAB软件平台下,利用wavread函数对语音信号进行采样,记住采样频率和采样点数,Wavread函数调用格式
y=wavread(file)%读取file所规定的wav文件,返回采样值放在向量y中。 [y,fs,bits]=wavread(file) %采样值放在向量y中,fs表示采样频率(hz),bits表示采样位数。
y=wavread(file,N) %读取前N点的采样值放在向量y中。 y=wavread(file,[N1,N2])%读取从N1到N2点的采样值放在向量y中. 对语音信号Orisound.wav进行采样其程序如下:
[y,fs,nbits]= wavread(’E:\\yuanyinpin。wav’);%把语音信号加载入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(’E:\\yuanyinpin。wav'); %语音信号的采集
sound(y,fs,nbits); %语音信号的播放
n=length(y);
Y=fft(y,n); %快速傅里叶变换
figure;
subplot(2,1,1);
plot(y);
title('原始信号波形',’fontweight',’bold’); axis([67000 87000 -0.5 0.5]); grid;
subplot(2,1,2);
plot(abs(Y));
title('原始信号频谱','fontweight’,’bold'); axis([0 15000 0 1000]);
9
第四章 软件仿真调试及结果分析
grid;
程序结果如下图:
图4—1原始信号采集波形图
4.2语音信号加噪与频谱分析
在MATLAB中产生高斯白噪声非常方便,我们可以直接应用两个函数:一个是WGN,另一个是AWGN。WGN用于产生高斯白噪声,AWGN则用于在某一信号中加入高斯白噪声。也可直接用randn函数产生高斯分布序列.
在本次设计中,我们是利用MATLAB中的随机函数(rand或randn)产生噪声加入到语音信号中,模仿语音信号被污染,并对其频谱分析。randn函数有两种基本调用格式:randn(n)和randn(m,n),前者产生n×n服从标准高斯分布的随机数矩阵,后者产生m×n的随机数矩阵。在这里,我们选用randn(m,n)函数。语音信号添加噪声及其频谱分析的主要程序如下: [y,fs,nbits]= wavread('E:\\yuanyinpin.wav’);
10
第四章 软件仿真调试及结果分析
sound(y,fs,nbits);
n = length (y)
Noise=0。03*randn(n,2); s=y+Noise;
sound(s,fs); figure;
subplot(2,1,1); plot(s);
title('加噪语音信号的时域波形',’fontweight','bold'); axis([ 67000 87000 —0。5 0.5]); grid;
S=fft(s);
subplot(2,1,2); plot(abs(S));
title(’加噪语音信号的频域波形’,’fontweight’,'bold’); axis([ 0 15000 0 1000]); grid;
程序结果如下图:
11
第四章 软件仿真调试及结果分析
图4—2信号加噪时域波形图与频谱图
4。3滤波器的设计
4.3.1设计FIR滤波器
如前所述,IIR滤波器和FIR滤波器的设计方法有很大的区别.下面我们着重介绍用窗函数法设计FIR滤波器的步骤。如下:
(1)根据对阻带衰减及过渡带的指标要求,选择窗函数类型(矩形窗、三角窗、汉宁窗、哈明窗、凯塞窗等),并估计窗口长度N.先按照阻带衰减选择窗函数类型。原则是在保证阻带衰减满足要求的情况下,尽量选择主瓣的窗函数.
(2)构造希望逼近的频率响应函数。 (3)计算h(n).。
(4)加窗得到设计结果。 4.3.2设计IIR滤波器
无论是数字滤波器还是模拟滤波器,他们技术指标的建立都是以所谓的“固有衰减\"参数为参照。以数字滤波器为例,固有衰减参数(关于之旅分量归一化)定义为:
A(w)=—20lg|H(ejw)|-20lg|H(ej0)
目前IIR数字滤波器设计的最通用的方法是借助于模拟滤波器的设计方法。模拟滤波器设计已经有了一套相当成熟的方法,它不但有完整的设计公式,而且还有较为完整的图表供查询,因此,充分利用这些已有的资源将会给数字滤波器的设计带来很大方便。IIR数字滤波器的设计步骤是:
(1)按一定规则将给出的数字滤波器的技术指标转换为模拟低通滤波器的技术指标;
(2)根据转换后的技术指标设计模拟低通滤波器Gs; (3)再按一定规则将G(s)转换成H(z)。 若设计的数字滤波器是低通的,那么上述设计工作可以结束,若所设计的是高通,带通或带阻滤波器,那么还有步骤(4);
(4)将高通、带通、或带阻数字l不去的技术指标先转化为低通模拟滤波器的技术指标,然后按照上述步骤(2)设计出低通Gs,再将Gs转换为所需的H(z)。 4。3。3双线性变换法和窗函数法
对于数字高通、带通滤波器的设计,通用方法为双线性变换法。可以借助于模拟滤波器的频率转换设计一个所需类型的过渡模拟滤波器,再经过双线性变换将其转换策划那个所需的数字滤波器.具体设计步骤如下:
(1)确定所需类型数字滤波器的技术指标。 (2)将所需类型数字滤波器的边界频率转换成相应的模拟滤波器的边界频率,转换公式为Ω=2/T tan(0。5ω)
(3)将相应类型的模拟滤波器技术指标转换成模拟低通滤波器技术指标。
12
第四章 软件仿真调试及结果分析
(4)设计模拟低通滤波器。
(5)通过频率变换将模拟低通转换成相应类型的过渡模拟滤波器。
(6)采用双线性变换法将相应类型的过渡模拟滤波器转换成所需类型的数字滤波器。
我们知道,脉冲响应不变法的主要缺点是会产生频谱混叠现象,使数字滤波器的频响偏离模拟滤波器的频响特性.为了克服之一缺点,可以采用双线性变换法。
下面我们总结一下利用模拟滤波器设计IIR数字低通滤波器的步骤: (1)确定数字低通滤波器的技术指标:通带边界频率、通带最大衰减,阻带截止频率、阻带最小衰减。
(2)将数字低通滤波器的技术指标转换成相应的模拟低通滤波器的技术指标。
(3)按照模拟低通滤波器的技术指标设计及过渡模拟低通滤波器。 (4)用双线性变换法,模拟滤波器系统函数转换成数字低通滤波器系统函数。
接下来,我们根据语音信号的特点给出有关滤波器的技术指标:
(1)低通滤波器的性能指标:
fp=1000Hz,fc=1200Hz,As=100db ,Ap=1dB (2)高通滤波器的性能指标:
fp=3500Hz,fc=4000Hz,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画出各步步器的频率响应。 hn=fir1(M,wc,window),可以指定窗函数向量window。如果缺省window参数,则fir1默认为哈明窗。中可选的窗函数有Rectangular Barlrtt Hamming Hann Blackman窗,其相应的都有实现函数.
MATLAB信号处理工具箱函数buttp buttor butter是巴特沃斯滤波器设计函数,其有5种调用格式,本课程设计中用到的是[N,wc]=butter(N,wc,Rp,As,'s'),该格式用于计算巴特沃斯模拟滤波器的阶数N和3dB截止频率wc.
MATLAB信号处理工具箱函数cheblap,cheblord和cheeby1是切比雪夫I型滤波器设计函数。我们用到的是cheeby1函数,其调用格式如下:
[B,A]=cheby1(N,Rp,wpo,’ftypr')
函数butter,cheby1和ellip设计IIR滤波器时都是默认的双线性变换法,所以在设计滤波器时只需要代入相应的实现函数即可。
IIR高通要用cheby1(即切比雪夫I型滤波器)函数来设计,1p2hp[其中p;pose(模型),h(high)],同理,1p2bp中b表示band(带通),FIR与此类似。
具体程序及运行结果如附录I设计FIR和IIR数字滤波器
13
第四章 软件仿真调试及结果分析
4。4验证所设计的滤波器
为了验证滤波器的可使用性,我们用常用的sin函数来进行验证。其具体程序及运行结果如下:
t=[0:1/1023:1]; s=sin(2*pi*t); N=length(s);
y=s+0.5*rand(1,N); subplot(2,1,1); plot(y);
title('加噪语音信号的时域波形','fontweight',’bold'); S=fft(y); subplot(2,1,2); plot(abs(S));
title('加噪语音信号的频域波形’,’fontweight','bold'); Ft=8000;
Fp=1000; Fs=1200;
wp=2*pi*Fp/Ft; ws=2*pi*Fs/Ft;
[n11,wn11]=buttord(wp,ws,1,50,’s’); %求低通滤波器的阶数和
截止频率 [b11,a11]=butter(n11,wn11,’s’); %求S域的频率响应的参数 [num11,den11]=bilinear(b11,a11,0。5); %利用双线性变换实现频率
响应S域到Z域的变换
z11=filter(num11,den11,s); sound(z11); m11=fft(z11); %求滤波后的信号 figure; subplot(2,2,1); plot(abs(S),’g’);
title(’滤波前信号的频谱','fontweight’,'bold’); grid;
subplot(2,2,2); plot(abs(m11),’r’);
title(’滤波后信号的频谱’,'fontweight’,’bold’); grid;
subplot(2,2,3); plot(y);
title(’滤波前信号的波形’,’fontweight’,’bold');
grid;
subplot(2,2,4); plot(z11);
14
第四章 软件仿真调试及结果分析
title(’滤波后的信号波形’,'fontweight’,’bold'); grid;
由程序运行结果,如图4—3可知,所涉及的滤波器符合要求。
图4-3验证所涉及的滤波器
4.5滤波
用自己设计的各滤波器分别对加噪的语音信号进行滤波,在Matlab中,FIR滤波器利用函数fftfilt对信号进行滤波,IIR滤波器利用函数filter对信号进行滤波.
函数fftfilt用的是重叠相加法实现线性卷积的计算。调用:y=fftfilter(h,x,M)。其中,h是系统单位冲击响应向量;x是输入序列向量;y是系统的输出序列向量;M是有用户选择的输入序列的分段长度,缺省时,默认的输入向量的重长度M=512.
函数filter的调用格式:yn=filter(B,A。xn),它是按照直线型结构实现对xn的滤波。其中xn是输入信号向量,yn输出信号向量。
由于所设计的滤波器有六个,故我们需要进行六次滤波,然后比较得出哪种
15
第四章 软件仿真调试及结果分析
滤波器的效果最好。
对原始语音信号具体程序及运行结果如附录II比较滤波前后语音信号的波形及频谱
经过以上的加噪处理后,可在Matlab中用函数sound对声音进行回放。其调用格式:sound(y,Fs),sound(y)和sound(y,Fs,bits)。可以察觉滤波前后的声音有明显的变化。比较后可得;低通效果较好,高通其次,带通最差。
16
第五章 GUI界面
第五章 GUI界面
5。1 GUI界面概述
图形用户界面(graphical user interfaces ,GUI)则是由窗口、光标、按键、菜单、文字说明等对象(objects)构成的一个用户界面。用户通过一定的方法(如鼠标或键盘)选择、激活这些图形对象,使计算机产生某种动作或变化,比如实现计算、绘图等。在MATLAB中GUI是一中包含多种对象的图形窗口,并为GUI开发提供一个方便高效的集成开发环境GUIDE。GUIDE主要是一个界面设计工具集,MAYLAB将所有GUI支持度控件都集成在这个环境中,并提供界面外观、属性和行为响应方式的设置方法。GUIDE将设计好的GUI保存在一个FIG文件中,同时生成M文件框架.
FIG文件:包括GUI图形窗口及其所有后裔的完全描述,包括所有对象属性的属性值。它是一个二进制文件调用hsave课保存图形窗口时将生车该文件。M文件包括GUI设计、控件函数以及定义为子函数的用户控件回调函数,主要用于控制GUI展开时的各种特征。
GUI创建包括界面设计和控件编程两部分,主要步骤如下: 第一步,通过设置GUIDE应用程序的选项来运行GUIDE; 第二步,使用界面设计编辑器进行面设计;
第三步,编写控件行为响应控制(即回调函数)代码。
5.2创建GUI界面
首先,新建一个图形用户界面:新建/图形用户界面,选择Blank GUI(Default)如图5-1 GUI创建界面所示
5-1 GUI创建界面
17
第五章 GUI界面
然后,根据需要建立相应的按钮组、按钮和静态文本框如图5—2 GUI界面所示:
5—2 GUI界面
最后,编置好各控件以后,既可以来为这些控件编写程序了。如图5-3 控件程序编写界面
图5-3 控件程序编写界面
18
第五章 GUI界面
控件各个程序编写完成后单击“运行\",出现如图5-4 GUI运行界面所示界面,点击按钮,执行相应程序.
图5—4 GUI运行界面
19
第六章 总结与展望
第六章 总结与展望
本次的数字信号处理综合实验的题目是应用Matlab对语音信号进行频谱分析及滤波,首先通过网络和书籍查找有关本次综合实验的资料,编写相关程序,并通过Matlab软件运行得到相关波形频谱图。
实验中利用双线性变换法设计IIR数字滤波器,利用窗函数设计FIR数字滤波器,可以是低通、高通和带通滤波器的设计,通过设计的滤波器对语音信号进行滤波,再对得出的频谱图进行分析。在实验中遇到一些困难,在设计数字滤波器的时候,通带频率和阻带频率的选取要满足低通的要求,以及通带允许的最大衰减和阻带应达到的最小衰减。
在这次的综合实验中,总的来说并不是很辛苦,实验将上课所学的理论知识运用到实践中。通过这次应用Matlab对语音信号进行频谱分析及滤波的综合实验,让我对Matlab的应用以及数字滤波器的设计有了更深层次的理解,每个程序中的语句表示什么意思也有了很清楚的了解.在实践中增强了我的动手能力,以及增强了我的团队意识,并提高了我的综合能力,使自身得到了很大的锻炼。最后要感谢老师的悉心指导和帮助,
20
参考文献
参考文献
[1] 周阴清.数字信号处理。人民邮电出版社。2006
[2] 刘晓阳.数字信号处理.北京大学出版社。2012
[3] 陈怀琛。数字信号处理.电子工业出版社。2010
[4] 高西全。丁玉美.数字信号处理(第三版)。西安电子科技大学出版社.2008
[5] 李正周。MATLAB数字信号处理与应用.清华大学出版社.2008
21
附 录
附录I设计FIR和IIR数字滤波器
1.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’);
[num11,den11]=bilinear(b11,a11,0。5); [h,w]=freqz(num11,den11); figure; plot(w*8000*0.5/pi,abs(h));
legend('IIR低通滤波器,'Location’,'NorthWest'); grid;
程序结果如下图:
2.IIR带通滤波器
Fp1=1200; Fp2=3000; Fs1=1000; Fs2=3200;
1
附 录
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');
[num2,den2]=lp2bp(b12,a12,sqrt(wp1*wp2),bw); [num12,den12]=bilinear(num2,den2,0.5); [h,w]=freqz(num12,den12); figure;
plot(w*8000*0。5/pi,abs(h)); axis([0 4500 0 1。5]);
legend(’IIR带通滤波器,’Location’,’NorthWest'); grid;
程序结果如下图:
3.IIR高通滤波器
Ft=8000; Fp=4000; Fs=3500;
2
附 录
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’); [num,den]=lp2hp(b13,a13,wn13);
[num13,den13]=bilinear(num,den,0。5); [h,w]=freqz(num13,den13); figure;
plot(w*21000*0.5/pi,abs(h));
legend('IIR高通滤波器',’Location’,'NorthWest'); axis([0 11000 0 1。5]); grid;
程序结果如下图:
4.FIR低通滤波器
Ft=8000; Fp=1000; Fs=1200; wp=2*Fp/Ft; ws=2*Fs/Ft; rp=1; rs=50;
3
附 录
p=1—10.^(-rp/20); s=10.^(-rs/20); fpts=[wp ws]; mag=[1 0]; dev=[p s];
[n21,wn21,beta,ftype]=kaiserord(fpts,mag,dev); b21=fir1(n21,wn21,kaiser(n21+1,beta)); [h,w]=freqz(b21,1); figure;
plot(w*8000*0。5/pi,abs(h));
title(’FIR低通滤波器,’fontweight’,’bold’); grid;
程序结果如下图:
5.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);
4
附 录
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’);
[num2,den2]=lp2bp(b22,a22,sqrt(wp1*wp2),bw); [num22,den22]=bilinear(num2,den2,0。5); [h,w]=freqz(num22,den22); figure;
plot(w*8000*0。5/pi,abs(h)); axis([0 4500 0 1.5]);
legend(’FIR带通滤波器',’Location’,’NorthWest’); grid;
程序结果如下图:
6.FIR高通滤波器
Ft=8001;
Fp=4000; %通带边界频率 Fs=3500; %阻带截止频率 wp=2*Fp/Ft; ws=2*Fs/Ft; rp=1; rs=50;
p=1-10.^(—rp/20);
5
附 录
s=10.^(—rs/20); fpts=[ws wp]; mag=[0 1]; dev=[p s];
[n23,wn23,beta,ftype]=kaiserord(fpts,mag,dev); b23=fir1(n23,wn23,’high',kaiser(n23+1,beta)); [h,w]=freqz(b23,1); figure;
plot(w*12000*0.5/pi,abs(h));
title(’FIR高通滤波器','fontweight','bold'); axis([2500 5500 0 1。2]); grid; 程序结果如下图:
6
附 录
附录II比较滤波前后语音信号的波形及频谱
1.IIR双线性低通滤波
[y,fs,nbits]=wavread('E:\\yuanyinpin.wav'); n = length (y) Noise=0.03*randn(n,2); s=y+Noise;
S=fft(s); Ft=8000; Fp=1000; Fs=1200;
wp=2*pi*Fp/Ft; ws=2*pi*Fs/Ft;
[n11,wn11]=buttord(wp,ws,1,50,'s'); [b11,a11]=butter(n11,wn11,’s'); [num11,den11]=bilinear(b11,a11,0.5); z11=filter(num11,den11,s); sound(z11,fs);
m11=fft(z11); figure;
subplot(2,2,1); plot(abs(S),'g');
title('滤波前信号的频谱’,'fontweight’,’bold’); axis([ 0 15000 0 1000]); grid;
subplot(2,2,2);
plot(abs(m11),’r');
title(’滤波后信号的频谱’,'fontweight’,’bold'); axis([ 0 15000 0 1000]); grid;
subplot(2,2,3); plot(s);
title('滤波前信号的波形','fontweight’,'bold'); axis([67000 87000 -0.5 0.5]); grid;
subplot(2,2,4); plot(z11);
title(’滤波后信号的波形','fontweight',’bold'); axis([67000 87000 -0.5 0。5]); grid;
程序结果如下图:
7
附 录
2.IIR双线性带通滤波
[y,fs,nbits]= wavread('E:\\yuanyinpin。wav’); n = length (y) Noise=0.03*randn(n,2); s=y+Noise; S=fft(s); Ft=20000; Fp=700; Fs=1400; wp=2*Fp/Ft; ws=2*Fs/Ft; rp=1; rs=50;
p=1—10.^(—rp/20); q=10.^(-rs/20); fpts=[wp ws]; mag=[1 0]; dev=[p q];
[n21,wn21,beta,ftype]=kaiserord(fpts,mag,dev); b21=fir1(n21,wn21,kaiser(n21+1,beta)); z21=fftfilt(b21,s); sound(z21,fs);
m21=fft(z21); figure(4);
8
附 录
subplot(2,2,1);
plot(abs(S),'g’);
title(’滤波前信号的频谱’,'fontweight',’bold’); axis([0 15000 0 1000]); grid;
subplot(2,2,2); plot(abs(m21),’r’);
title('滤波后信号的频谱','fontweight',’bold'); axis([0 15000 0 1000]); grid;
subplot(2,2,3); plot(s);
title(’滤波前信号的波形','fontweight’,’bold'); axis([67000 87000 -0.5 0。5]); grid;
subplot(2,2,4); plot(z21);
title('滤波后信号的波形','fontweight’,'bold'); axis([67000 87000 -0.5 0.5]); grid;
程序结果如下图:
9
附 录
3.IIR双线性高通滤波
[y,fs,nbits]= wavread(’E:\\yuanyinpin。wav'); n = length (y) Noise=0.03*randn(n,2); s=y+Noise; S=fft(s); Fp1=1400; Fs1=700; Ft=10000;
wp1=tan(pi*Fp1/Ft); ws1=tan(pi*Fs1/Ft); wp=1;
ws=wp1*wp/ws1;
[n13,wn13]=cheb1ord(wp,ws,1,50,’s'); [b13,a13]=cheby1(n13,1,wn13,’s');
[num,den]=lp2hp(b13,a13,wn13); [num13,den13]=bilinear(num,den,0。5); z13=filter(num13,den13,s); sound(z13,fs);
m13=fft(z13); figure;
subplot(2,2,1); plot(abs(S),'g’);
title(’滤波前信号的频谱’,’fontweight’,’bold’); axis([0 15000 0 1000]); grid;
subplot(2,2,2); plot(abs(m13),'r’);
title(’滤波后信号的频谱',’fontweight’,’bold'); axis([0 15000 0 1000]); grid;
subplot(2,2,3); plot(s);
title(’滤波前信号的波形’,’fontweight’,'bold’); axis([67000 87000 —0.5 0。5]); grid;
subplot(2,2,4); plot(z13);
title(’滤波后信号的波形’,’fontweight','bold’); axis([67000 87000 -0.5 0.5]); grid;
程序结果如下图:
10
附 录
14.FIR窗函数低通滤波
[y,fs,nbits]= wavread('E:\\yuanyinpin。wav’); n = length (y) Noise=0.03*randn(n,2); s=y+Noise; S=fft(s); Ft=10000; Fp=700; Fs=1400;
wp=2*Fp/Ft; ws=2*Fs/Ft; rp=1; rs=50;
p=1—10。^(-rp/20); q=10。^(-rs/20); fpts=[wp ws]; mag=[1 0]; dev=[p q];
[n21,wn21,beta,ftype]=kaiserord(fpts,mag,dev); b21=fir1(n21,wn21,kaiser(n21+1,beta)); z21=fftfilt(b21,s); sound(z21,fs);
m21=fft(z21);
11
附 录
figure(4);
subplot(2,2,1); plot(abs(S),’g');
title(’滤波前的信号频谱','fontweight’,'bold'); axis([0 15000 0 1000]); grid;
subplot(2,2,2);
plot(abs(m21),’r’);
title(’滤波后的信号频谱’,'fontweight’,'bold'); axis([0 15000 0 1000]); grid;
subplot(2,2,3); plot(s);
title(’滤波前的信号波形','fontweight','bold’); axis([67000 87000 -0.5 0。5]); grid;
subplot(2,2,4); plot(z21);
title(’滤波后的信号波形’,'fontweight’,'bold'); axis([67000 87000 -0.5 0.5]); grid;
程序结果如下图:
12
附 录
5.FIR窗函数带通滤波
[y,fs,nbits]= wavread(’E:\\yuanyinpin.wav'); n = length (y) Noise=0.03*randn(n,2); s=y+Noise; S=fft(s); Fp1=1200; Fp2=3000; Fs1=1000; Fs2=3200; Ft=2200;
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'); z22=fftfilt(b22,s); sound(z22,fs);
m22=fft(z22); figure;
subplot(2,2,1); plot(abs(S),'g’);
title('滤波前的信号频谱’,’fontweight','bold'); axis([0 15000 0 1000]); grid;
subplot(2,2,2);
plot(abs(m22),’r’);
title(’滤波后的信号频谱',’fontweight’,’bold’); axis([0 15000 0 1000]); grid;
subplot(2,2,3); plot(s);
title(’滤波前的信号波形’,’fontweight',’bold’); axis([67000 87000 -0.5 0。5]); grid;
subplot(2,2,4); plot(z22);
title('滤波后的信号波形’,'fontweight','bold’); axis([67000 87000 -0。5 0。5]);
13
附 录
grid;
程序结果如下图:
6.FIR窗函数高通滤波
[y,fs,nbits]= wavread(’E:\\yuanyinpin.wav’); n = length (y)
Noise=0.03*randn(n,2); s=y+Noise; S=fft(s); Ft=10000; Fp=1400; Fs=700; wp=2*Fp/Ft; ws=2*Fs/Ft; rp=1; rs=50;
p=1—10.^(—rp/20); q=10。^(—rs/20); fpts=[ws wp]; mag=[0 1]; dev=[p q];
[n23,wn23,beta,ftype]=kaiserord(fpts,mag,dev);
b23=fir1(n23,wn23,’high',kaiser(n23+1,beta)); z23=fftfilt(b23,s);
14
附 录
sound(z23,fs);
m23=fft(z23); figure;
subplot(2,2,1); plot(abs(S),'g’);
title('滤波前的信号频谱’,’fontweight',’bold’); axis([0 15000 0 1000]); grid;
subplot(2,2,2);
plot(abs(m23),’r');
title(’滤波后的信号频谱’,’fontweight’,'bold'); axis([0 15000 0 1000]); grid;
subplot(2,2,3); plot(s);
title(’滤波前的信号波形',’fontweight’,'bold’); axis([67000 87000 —0.5 0.5]); grid;
subplot(2,2,4); plot(z23);
title('滤波后的信号波形’,’fontweight','bold'); axis([67000 87000 -0。5 0.5]); grid;
程序结果如下图:
15
附 录
附录III 源程序代码
function varargout = G0606001(varargin) % G0606001 MATLAB code for G0606001。fig
% G0606001, by itself, creates a new G0606001 or raises the existing % singleton*。 %
% H = G0606001 returns the handle to a new G0606001 or the handle to % the existing singleton*。 %
% G0606001('CALLBACK',hObject,eventData,handles,...) calls the local % function named CALLBACK in G0606001.M with the given input arguments。 %
% G0606001('Property’,'Value’,.。。) creates a new G0606001 or raises the % existing singleton*. Starting from the left, property value pairs are % applied to the GUI before G0606001_OpeningFcn gets called. An % unrecognized property name or invalid value makes property application % stop。 All inputs are passed to G0606001_OpeningFcn via varargin. %
% *See GUI Options on GUIDE’s Tools menu。 Choose \"GUI allows only one % instance to run (singleton)\". %
% See also: GUIDE, GUIDATA, GUIHANDLES
% Edit the above text to modify the response to help G0606001
% Last Modified by GUIDE v2。5 06-Jun-2016 12:08:17
% Begin initialization code — DO NOT EDIT gui_Singleton = 1;
gui_State = struct(’gui_Name', mfilename, .。. 'gui_Singleton', gui_Singleton, .。.
’gui_OpeningFcn’, @G0606001_OpeningFcn, 。.。 ’gui_OutputFcn’, @G0606001_OutputFcn, ... ’gui_LayoutFcn’, [] , ... ’gui_Callback’, []); if nargin && ischar(varargin{1})
gui_State。gui_Callback = str2func(varargin{1});
16
附 录
end if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else
gui_mainfcn(gui_State, varargin{:}); end
% End initialization code — DO NOT EDIT
% ——- Executes just before G0606001 is made visible.
function G0606001_OpeningFcn(hObject, eventdata, handles, varargin) % This function has no output args, see OutputFcn。 % hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % varargin command line arguments to G0606001 (see VARARGIN)
% Choose default command line output for G0606001 handles。output = hObject;
% Update handles structure guidata(hObject, handles);
% UIWAIT makes G0606001 wait for user response (see UIRESUME) % uiwait(handles。figure1);
% --— Outputs from this function are returned to the command line.
function varargout = G0606001_OutputFcn(hObject, eventdata, handles) % varargout cell array for returning output args (see VARARGOUT); % hObject handle to figure
% eventdata reserved — to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
% Get default command line output from handles structure varargout{1} = handles.output;
17
附 录
% ——— Executes on button press in pushbutton12. function pushbutton12_Callback(hObject, eventdata, handles) [y,fs,nbits]=wavread('E:\\yuanyinpin。wav'); %IIRµÍͨ n = length (y) Noise=0.03*randn(n,2); s=y+Noise;
S=fft(s); Ft=20000; Fp=700; Fs=1400; wp=2*pi*Fp/Ft; ws=2*pi*Fs/Ft;
[n11,wn11]=buttord(wp,ws,1,50,’s’); [b11,a11]=butter(n11,wn11,’s’); [num11,den11]=bilinear(b11,a11,0.5); z11=filter(num11,den11,s); sound(z11,fs);
m11=fft(z11); figure; subplot(2,2,1); plot(abs(S),'g');
title('滤波前信号的频谱’,'fontweight’,'bold'); axis([ 0 15000 0 1000]); grid;
subplot(2,2,2); plot(abs(m11),'r’);
title(’滤波后信号的频谱',’fontweight’,'bold’); axis([ 0 15000 0 1000]); grid;
subplot(2,2,3); plot(s);
title(’滤波前信号的波形',’fontweight','bold’); axis([67000 87000 -0.5 0.5]); grid;
subplot(2,2,4); plot(z11);
title(’滤波后信号的波形’,'fontweight','bold’);
18
附 录
axis([67000 87000 -0。5 0。5]); grid;
% -—— Executes on button press in pushbutton13.
function pushbutton13_Callback(hObject, eventdata, handles)
[y,fs,nbits]= wavread('E:\\yuanyinpin。wav’); n = length (y) Noise=0.03*randn(n,2); s=y+Noise; S=fft(s); Fp1=1400; Fs1=700; Ft=10000;
wp1=tan(pi*Fp1/Ft); ws1=tan(pi*Fs1/Ft); wp=1;
ws=wp1*wp/ws1;
[n13,wn13]=cheb1ord(wp,ws,1,50,'s'); [b13,a13]=cheby1(n13,1,wn13,’s’); [num,den]=lp2hp(b13,a13,wn13); [num13,den13]=bilinear(num,den,0。5); z13=filter(num13,den13,s); sound(z13,fs);
m13=fft(z13); figure;
subplot(2,2,1); plot(abs(S),'g’);
title(’滤波前信号的频谱',’fontweight',’bold'); axis([0 15000 0 1000]); grid; subplot(2,2,2);
plot(abs(m13),'r');
title('滤波后信号的频谱’,'fontweight',’bold’); axis([0 15000 0 1000]); grid;
subplot(2,2,3); plot(s);
19
附 录
title('滤波前信号的波形',’fontweight’,’bold’); axis([67000 87000 -0。5 0。5]); grid;
subplot(2,2,4); plot(z13);
title(’滤波后信号的波形’,’fontweight','bold'); axis([67000 87000 -0。5 0.5]); grid;
% ——- Executes on button press in pushbutton14. function pushbutton14_Callback(hObject, eventdata, handles) [y,fs,nbits]= wavread('E:\\yuanyinpin。wav’); n = length (y) Noise=0.03*randn(n,2); s=y+Noise; S=fft(s); Ft=20000; Fp=700; Fs=1400; wp=2*Fp/Ft; ws=2*Fs/Ft; rp=1; rs=50;
p=1—10.^(—rp/20); q=10。^(—rs/20); fpts=[wp ws]; mag=[1 0]; dev=[p q];
[n21,wn21,beta,ftype]=kaiserord(fpts,mag,dev); b21=fir1(n21,wn21,kaiser(n21+1,beta)); z21=fftfilt(b21,s); sound(z21,fs);
m21=fft(z21); (4);
subplot(2,2,1); plot(abs(S),'g');
20
figure 附 录
title(’滤波前信号的频谱',’fontweight’,’bold'); axis([0 15000 0 1000]); grid;
subplot(2,2,2); plot(abs(m21),'r’); title(’滤波后信号的频谱’,'fontweight’,’bold’); axis([0 15000 0 1000]); grid;
subplot(2,2,3); plot(s);
title(’滤波前信号的波形','fontweight','bold'); axis([67000 87000 —0.5 0。5]); grid;
subplot(2,2,4); plot(z21);
title('滤波后信号的波形’,’fontweight’,’bold'); axis([67000 87000 -0。5 0。5]); grid;
% ——- Executes on button press in pushbutton15.
function pushbutton15_Callback(hObject, eventdata, handles)[y,fs,nbits]= wavread(’E:\\yuanyinpin。wav’); n = length (y) Noise=0。03*randn(n,2); s=y+Noise; S=fft(s); Ft=10000; Fp=700; Fs=1400; wp=2*Fp/Ft; ws=2*Fs/Ft; rp=1; rs=50;
p=1-10.^(-rp/20); q=10.^(-rs/20); fpts=[wp ws]; mag=[1 0]; dev=[p q];
21
¨
附 录
[n21,wn21,beta,ftype]=kaiserord(fpts,mag,dev); b21=fir1(n21,wn21,kaiser(n21+1,beta)); z21=fftfilt(b21,s); sound(z21,fs);
m21=fft(z21); figure(4); subplot(2,2,1); plot(abs(S),’g’);
title(’滤波前信号的频谱’,’fontweight',’bold’); axis([0 15000 0 1000]); grid;
subplot(2,2,2); plot(abs(m21),'r’);
title(’滤波后信号的频谱',’fontweight’,'bold’); axis([0 15000 0 1000]); grid;
subplot(2,2,3); plot(s);
title(’滤波前信号的波形','fontweight’,'bold'); axis([67000 87000 —0。5 0.5]); grid;
subplot(2,2,4); plot(z21);
title('滤波后信号的波形’,'fontweight','bold'); axis([67000 87000 -0.5 0.5]); grid;
% -—- Executes on button press in pushbutton17。
function pushbutton17_Callback(hObject, eventdata,[y,fs,nbits]= wavread('E:\\yuanyinpin.wav'); n = length (y) Noise=0。03*randn(n,2); s=y+Noise; S=fft(s); Ft=10000; Fp=1400;
22
handles) 附 录
Fs=700; wp=2*Fp/Ft; ws=2*Fs/Ft; rp=1; rs=50;
p=1-10.^(-rp/20); q=10.^(—rs/20); fpts=[ws wp]; mag=[0 1]; dev=[p q];
[n23,wn23,beta,ftype]=kaiserord(fpts,mag,dev);
b23=fir1(n23,wn23,’high’,kaiser(n23+1,beta)); z23=fftfilt(b23,s); sound(z23,fs);
m23=fft(z23); figure; subplot(2,2,1); plot(abs(S),’g’);
title('滤波前信号的频谱’,'fontweight’,'bold'); axis([0 15000 0 1000]); grid;
subplot(2,2,2); plot(abs(m23),'r');
title(’滤波后信号的频谱’,’fontweight’,'bold’); axis([0 15000 0 1000]); grid;
subplot(2,2,3); plot(s);
title('滤波前信号的波形’,'fontweight',’bold'); axis([67000 87000 -0。5 0。5]); grid;
subplot(2,2,4); plot(z23);
title('滤波后信号的波形’,'fontweight','bold’); axis([67000 87000 -0.5 0.5]); grid;
23
附 录
% --- Executes on button press in pushbutton19.
function pushbutton19_Callback(hObject, eventdata, handles) [y,fs,nbits]= wavread('E:\\yuanyinpin.wav’); n = length (y) Noise=0。03*randn(n,2); s=y+Noise; S=fft(s); Fp1=1200; Fp2=3000; Fs1=1000; Fs2=3200; Ft=2200;
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’); z22=fftfilt(b22,s); sound(z22,fs);
m22=fft(z22); figure;
subplot(2,2,1); plot(abs(S),’g’);
title(’滤波前信号的频谱’,’fontweight','bold’); axis([0 15000 0 1000]); grid;
subplot(2,2,2); plot(abs(m22),’r’);
title('滤波后信号的频谱’,’fontweight’,'bold'); axis([0 15000 0 1000]); grid;
subplot(2,2,3); plot(s);
24
附 录
title(’滤波前信号的波形','fontweight’,’bold’); axis([67000 87000 —0.5 0。5]); grid;
subplot(2,2,4); plot(z22);
title('滤波后信号的波形’,'fontweight’,'bold’); axis([67000 87000 —0.5 0。5]); grid;
% ——- Executes on button press in pushbutton20.
function pushbutton20_Callback(hObject, eventdata, handles) % hObject handle to pushbutton20 (see GCBO)
% eventdata reserved — to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
% -—- Executes on button press in pushbutton8。
function pushbutton8_Callback(hObject, eventdata, handles) [y,fs,nbits]=wavread('E:\\yuanyinpin。wav’); sound(y,fs,nbits); n=length(y);
Y=fft(y,n);
function pushbutton9_Callback(hObject, eventdata, handles) [y,fs,nbits]=wavread(’E:\\yuanyinpin。wav’); n=length(y); Y=fft(y,n); figure;
subplot(2,1,1); plot(y);
title('原始信号波形’,’fontweight',’bold'); axis([67000 87000 —0.5 0.5]); grid;
subplot(2,1,2); plot(abs(Y));
25
附 录
title('原始信号频谱’,'fontweight','bold'); axis([0 15000 0 1000]); grid;
% —-— Executes on button press in pushbutton10.
function pushbutton10_Callback(hObject, eventdata, handles) [y,fs,nbits]= wavread(’E:\\yuanyinpin.wav’); n = length (y) Noise=0.03*randn(n,2); s=y+Noise; sound(s,fs);
% —-- Executes on button press in pushbutton11。
function pushbutton11_Callback(hObject, eventdata, handles) [y,fs,nbits]= wavread(’E:\\yuanyinpin.wav'); n = length (y) Noise=0。03*randn(n,2); s=y+Noise; figure; subplot(2,1,1); plot(s);
title(’加噪语音信号的时域波形',’fontweight','bold'); axis([ 67000 87000 -0.5 0.5]); grid; S=fft(s);
subplot(2,1,2); plot(abs(S));
title(’加噪语音信号的时域波形',’fontweight',’bold’); axis([ 0 15000 0 1000]); grid;
% -—— Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles) Ft=8000; Fp=1000; Fs=1200;
26
附 录
wp=2*Fp/Ft; ws=2*Fs/Ft; rp=1; rs=50;
p=1—10.^(—rp/20); s=10.^(-rs/20); fpts=[wp ws]; mag=[1 0]; dev=[p s];
[n21,wn21,beta,ftype]=kaiserord(fpts,mag,dev); b21=fir1(n21,wn21,kaiser(n21+1,beta)); [h,w]=freqz(b21,1); figure;
plot(w*8000*0。5/pi,abs(h)); title('FIR低通滤波器’,’fontweight’,'bold'); grid;
% -—— Executes on button press in pushbutton3. function pushbutton3_Callback(hObject, eventdata, handles) 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');
[num2,den2]=lp2bp(b22,a22,sqrt(wp1*wp2),bw); [num22,den22]=bilinear(num2,den2,0。5); [h,w]=freqz(num22,den22);
27
附 录
figure;
plot(w*8000*0。5/pi,abs(h)); axis([0 4500 0 1.5]);
legend(’FIR带通滤波器’,'Location’,’NorthWest’); grid;
% -—— Executes on button press in pushbutton4.
function pushbutton4_Callback(hObject, eventdata, handles) 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=[ws wp]; mag=[0 1]; dev=[p s];
[n23,wn23,beta,ftype]=kaiserord(fpts,mag,dev); b23=fir1(n23,wn23,'high’,kaiser(n23+1,beta)); [h,w]=freqz(b23,1); figure;
plot(w*12000*0.5/pi,abs(h)); title('FIR高通滤波器',’fontweight’,’bold'); axis([2500 5500 0 1。2]); grid;
% --— Executes on button press in pushbutton5.
function pushbutton5_Callback(hObject, eventdata, handles) Ft=8000; Fp=1000; Fs=1200; wp=2*pi*Fp/Ft; ws=2*pi*Fs/Ft;
28
附 录
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'); [num11,den11]=bilinear(b11,a11,0.5); [h,w]=freqz(num11,den11); figure; plot(w*8000*0.5/pi,abs(h));
legend('IIR低通滤波器’,’Location','NorthWest’); grid;
% —-- Executes on button press in pushbutton6。
function pushbutton6_Callback(hObject, eventdata, handles) 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');
[num2,den2]=lp2bp(b12,a12,sqrt(wp1*wp2),bw); [num12,den12]=bilinear(num2,den2,0.5); [h,w]=freqz(num12,den12); figure;
plot(w*8000*0。5/pi,abs(h)); axis([0 4500 0 1。5]);
legend(’IIR带通滤波器’,’Location','NorthWest'); grid;
29
附 录
% --- Executes on button press in pushbutton7.
function pushbutton7_Callback(hObject, eventdata, handles) 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'); [num,den]=lp2hp(b13,a13,wn13); [num13,den13]=bilinear(num,den,0。5); [h,w]=freqz(num13,den13); figure;
plot(w*21000*0.5/pi,abs(h));
legend(’IIR高通滤波器',’Location','NorthWest'); axis([0 11000 0 1.5]); grid;
% --— If Enable == 'on', executes on mouse press in 5 pixel border。
% --— Otherwise, executes on mouse press in 5 pixel border or over pushbutton8。 function pushbutton8_ButtonDownFcn(hObject, eventdata, handles) % hObject handle to pushbutton8 (see GCBO)
% eventdata reserved — to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
30
因篇幅问题不能全部显示,请点此查看更多更全内容