基于FIR语音信号的滤波Word文档格式.docx
《基于FIR语音信号的滤波Word文档格式.docx》由会员分享,可在线阅读,更多相关《基于FIR语音信号的滤波Word文档格式.docx(23页珍藏版)》请在冰豆网上搜索。
避免被处理的信号产生相位失真,这一特点在宽频带信号处理、阵列信号处理、数据传输等系统中非常重要;
(2)由于FIR滤波器的单位脉冲响应h(n)是有限长序列,因此FIR滤波器没有不稳定的问题;
(3)由于FIR滤波器一般为非递归的结构,因此在有限精度运算下,不会出现递归结构中极性震荡等不稳定现象,误差较小。
FIR滤波器的数学表达式为:
(2-1)
式中:
N为FIR滤波器的抽头数;
x(n)为第n时刻的输入样本;
h(i)为FIR滤波器第i抽头系数。
其相应的z变换为如公式2-2所示,其中z-i为N-1阶多项式
(2-2)
普通的直接型FIR滤波器结构如下图2所示:
图2FIR滤波器的直接型结构
2.3窗函数的设计原理
FIR滤波器通常采用窗函数方法来设计。
窗设计的基本思想是,首先选择一个适当的理想选频滤波器(它总是具有一个非因果,无限持续时间脉冲响应),然后街区(加窗)它的脉冲响应得到线性相位和因果FIR滤波器。
我们用
表示理想的选频滤波器,它在通带上具有单位增益和线性相位,在阻带上具有零响应。
为了从hd(n)得到一个FIR滤波器,必须同时在两边截取hd(n)。
而要得到一个因果的线性相位滤波器,它的hd(n)长度为N,必须满足公式2-3
(2-3)
h(n)可以看做是hd(n)与窗函数w(n)的乘积,如公式2-4所示
h(n)=hd(n)w(n)(2-4)
这种操作叫做加窗,其中根据w(n)的不同定义,可以得到不同的窗结构在频域中,因果FIR滤波器响应
由
和窗响应
的周期卷积得到,公式如下:
=
(2-5)
常用的窗函数有矩形窗、三角形(Bartlett)窗、汉宁(Hanning)窗、哈明(Hamming)窗、布莱克曼(Blackman)窗、凯泽(Kaiser)窗等。
2.4设计软件简介:
1、MATLAB介绍:
MATLAB是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。
MATLAB应用非常之广泛。
MATLAB的基本数据单位是矩阵,它的指令表达式与数学、工程中常用的形式十分相似,故用MATLAB来解算问题要比用C,FORTRAN等语言完成相同的事情简捷得多,并且MATLAB也吸收了像Maple等软件的优点,使MATLAB成为一个强大的数学软件。
在新的版本中也加入了对C,FORTRAN,C++,JAVA的支持。
可以直接调用,用户也可以将自己编写的实用程序导入到MATLAB函数库中方便自己以后调用,此外许多的MATLAB爱好者都编写了一些经典的程序,用户直接进行下载就可以用。
2、CCS介绍:
CCS是一种针对TMS320系列DSP的集成开发环境,在Windows操作系统下,采用图形接口界面,提供环境配置、源文件编辑、程序调试、跟踪分析等工具。
CCS有两种工作模式:
即软件仿真器模式和硬件在线编程模式,其软件仿真器模式可以脱离DSP芯片,在PC机上模拟DSP的指令集和工作机制用于前期算法的实现和调试;
其硬件在线编程模式,可以实时运行在DSP芯片上,与硬件开发板组合在线编程和调试应用程序。
CCS功能十分强大,其主要功能如下:
1、具有集成可视化代码编程界面,用户可通过其界面编写C、汇编、CMD文件等;
2、含有集成代码生成工具包括汇编器,和链接器等将代码的编辑、编译、链接、和调试等诸多功能集成到一个软件中;
3、高性能编辑器支持汇编文件的动态语法加亮显示使用户很容易阅读代码,发现语法错误;
4、提供GEL工具,利用GEL扩展语言,用户可以编写自己的控制面板/菜单设置GEL菜单选项,方便直观的修改变量配置参数等。
3设计的步骤和过程
3.1语音信号的录放
在选择模转换芯片型号时,需要考虑A/D的转换精度、采样速率以及芯片的工作电压和接口电压。
声音信号经ADC转换后得到的数字信号,输入到数据缓冲区中,TMS320F2812从中提取数据,在系统内部由各种处理算法将录进的音频信号进行快速运算和处理,经处理后的数字信号再输入到输出缓冲区中,经DAC转换器还原成模拟的声音信号。
根据这次设计要求,选择的芯片是TI公司的TLV320AIC23芯片。
利用缓冲区的目的是进行语音信号的实时处理,系统中各模块是并行运行的,一部分信号正在ADC中进行转换,而另一部分信号则在DSP处理器中进行算法处理,整个系统是以流水线的方式进行工作的。
通过实验箱和仿真软件CCS2.0编程来实现语音的录放,并采集语音信号。
通过采集得到一组输入信号。
3.2FIR滤波器的Matlab设计
fir1就是采用经典窗函数法设计线性相位FIR数字滤波器的函数,且具有标准低通,带通,高通,带阻等类型。
函数调用格式为:
b=fir1(n,wn[,'
ftype'
window])(3-1)
式中,n为FIR滤波器的阶数,对于高通,带阻滤波器,n需取偶数;
wn为滤波器截止频率,范围为0~1(归一化频率)。
常用的窗函数有矩形窗、三角形(Bartlett)窗、汉宁(Hanning)窗、哈明(Hamming)窗、布莱克曼(Blackman)窗、凯泽(Kaiser)窗等。
本课程设计采用的是用矩形窗来设计低通滤波器。
其具体操作流程为:
1、把Hd(
)展成Fs,得Hd(n);
2、对Hd(n)自然截短到所需的长度;
3、将截短后Hd(n)的右移M个采样间隔,得h(n);
4、将h(n)乘以合适的窗口,即得所要滤波器的冲击响应,窗函数以
n=M对称。
利用所求得的单位抽样响应,即可用硬件构成滤波器的转移函数H(z)。
如下公式W(
)为矩形窗频谱函数,:
w(
)为矩形窗幅度函数存在如下关系;
W(
)=w(
)e
式中:
)=sin(
)/sin(
)
(3-2)
3.3FIR滤波器的DSP实现方案
图3DSP系统构成的滤波器
如上图3所示DSP系统构成的滤波器,其中的输入信号可以是麦克风输出的语音信号、电话线的已调数据信号,可以是编码后在数字链路上传输或存储在计算机里的摄像机图像信号等输入号。
首先进行带限滤波和抽样,然后进行A/D转换成数字比特流,由耐奎斯特样定理可知为了保证信息完整抽样频率至少是输入带限信号最高频率的2倍。
之后输入DSP芯片的是以抽样形式表示的数字信号,DSP芯片对输入信号行处理,如进行一系列的累乘累加操作,最后经过处理后的数字样值经D/A换成为模拟样值再经过内插和平滑滤波就得到了连续的模拟波形。
FIR滤波器的DSP软件实现方法有两种,一种是用C语言实现,一种是用汇编语言实现,本次课程设计采用用C语言来实现,其软件流程图如下图4所示
图4C语言程序流程图
3.4TMS320F2812芯片介绍
TMS320F2812是TI公司的一款用于控制的高性能、高性价比的32位定点DSP芯片。
该芯片兼容TMS320LF2407指令系统
最高可在150MHz主频下工作,并带有18K×
16位0等待周期片上SRAM和128K×
16位片上FLASH。
其片上外设主要包括2×
8路12位ADC(最快80ns转换时间)、2路SCI、1路SPI、1路McBSP、1路eCAN等,并带有两个事件管理模块(EVA、EVB),分别包括6路PWM/CMP、2路QEP、3路CAP、2路16位定时器(或TxPWM/TxCMP)。
另外,该器件还有3个独立的32位CPU定时器,以及多达56个独立编程的GPIO引脚,可外扩大于1M×
16位程序和数据存储器。
TMS320F2812采用哈佛总线结构,具有密码保护机制,可进行双16×
16位乘加和32×
32位乘法加操作,因而可兼顾控制和快速运算的双重功能。
TMS320F2812芯片具有如下功能;
(1)在一个指令周期内可完成一次乘法和一次加法;
(2)程序和数据空间分离,可以同时访问指令和数据;
(3)片内具有快速RAM,通常可通过独立的数据总线在两块中同时访问;
(4)具有低开销或大开销循环及跳转的硬件支持;
(5)具有在单周期内操作的多个硬件地址产生器可以并行执行多个操作;
(6)支持流水线操作,使取值、译码、和执行等操作可重叠执行
3.5TLV320AIC23芯片介绍
TLV320AIC23是TI公司推出的一款高性能立体声音频编解码器,内置耳机输出放大器,支持mic和linein二选一的输入方式。
输入和输出都具有可编程的增益调节功能。
TLV320AIC23的模/数转换器(ADC)和数/模转换器(DAC)集成在芯片内部.采用先进的
--
过采样技术.可以在8kHz至96kHz的采样率下提供16bit、20bit、24bit和32bit的采样数据。
ADC和DAC的输出信噪比分别可达90dB和100dB。
同时。
TLV320AIC23还具有很低的功耗(回放模式为23mW。
节电模式为15μw)。
上述优点使得TLV320AIC23成为一款非常理想的音频编解码器,与TI的DSP系列相配合更是相得益彰。
4.程序调试结果及结果分析
4.1程序调试结果
启动CCS,输入实验程序代码,进行编译并加载到DSP中。
采用单步运行或执行到光标处,或全速运行,并打开波形观察窗口,跟踪观察其执行过程和滤波效果。
先打开项目,然后编译、加载实验程序,然后点击菜单debug—Gomain就进入预先编译的实验程序然后打开波形观察窗口,路径是View—Graph—Time/Frequence,将显示类型,图形名称,起始地址,抽样点数,数据类型等分别进行设置如下图5所示。
其中PA指原始信号的时域波形,PB指滤波后的时域波形,128指抽样点数,程序运行后的波形如下图6所示。
同理要观察频域的原始波形和滤波后的波形,也按上述步骤操作,其波形观察窗口如下图7所示,其中PC指原始的时域信号的经过傅里叶变换所得到的频域波形,PD指滤波后的时域信号的经过傅里叶变换所得到的频域波形,其波形输出图如图8所示。
其中采样频率fs=8000Hz,截止频率fstop=3000Hz为低通滤器滤除高频部分。
图5设置时域各项参数
图6原始信号时域波形及时域滤波后波形
图7设置频域各项参数
图8原始信号频域波形及频域滤波后波形
4.2结果分析
本次课程设计所用的FIR低通通滤波器,其目的就是要滤除高频部分。
其中采样频率fs=8000Hz,截止频率fstop=3000Hz。
图6是原始语音信号时域波形及时域滤波后的波形,其中上一部分是原始语音信号的时域波形PA,下面的部分是原始语音信号经低通滤波器后时域的波形PB,从图6可以看出幅值较高的部分已经滤去基本达到了滤波效果。
图8是原始语音信号频域波形及频域滤波后的波形,上面的部分为原始语音信号时域的波形经过FFT后频域的波形PC,下面的部分为原始语音信号滤波后的时域信号经过FFT后的频域波形PD。
从图8可以看出经过频域滤波后,高频部分已经明显滤去,达到了滤波效果。
实验证明:
未进行FIR滤波时,声音中含有的高频杂音将明显地影响听觉效果。
但是在进行滤波以后,高频杂音去掉了,声音质量明显的改善了。
因此,在实际应用中对语音信号进行FIR滤波,可以很好的将噪音部分去掉。
5.结论
5.1设计过程所遇到的困难及解决办法
为期两周的课程设计很快就结束了,通过本次课程设计,使我受益匪浅。
在本次实习过程中的确遇到了不少问题。
这是我第一次用CCS这个软件。
刚开始,对于这软件并不是很熟悉,所以导致花费了很多时间用在熟悉这个软件上。
这次的课程设计非常重要,难度也比较大。
它要求的数学知识多,包括高等代数、数值分析、概率统计、随机过程等。
所以设计之初,我受困于基础不扎实,举步维艰,于是我用了三天时间把要用到的一些知识重新复习了一遍,才开始着手于设计。
本设计是一个基于TMS320F2812的语音采集硬件设计方案,叙述和分析了其中的几个主要硬件模块,包括信号采集A/D、D/A模块、存储器模块、和电源模块。
同时对各个模块与DSP芯片之间的接口电路进行了详细的论述和设计。
在设计的过程中的确遇到了很多问题,如仿真软件CCS的具体操作与使用方法等等,但最终通过查阅资料、请教同学等途径使问题得以解决。
本次课程设计,让我对抽象的理论知识,有了更为深刻的理解。
在解决困难的过程中让我获得了许多专业方面的知识,拓展了视野,提高了理论水平和实践动手能力,激发了我们的探索精神。
当然在实习的过程中,比需要强调团队精神,一个人的精力毕竟是有限的,遇到不懂的问题要懂得礼贤下士,才能爬上知识的高峰。
5.2结论
本次课程设计把理论应用到了实践中,同时通过设计,也加深了自己对理论知识的理解和掌握,在解决困难的过程中,获得了许多专业方面的知识,拓展了视野。
提高了理论水平和实际的动手能力,学会了解决问题的方法,激发了我们的探索精神。
这样的课程设计是很好的锻炼机会,希望老师以后也多安排一些这些方面的实习任务,通过实验设计使我深入了解到课程设计在大学学习的重要性,课程设计增强了我们的实践动手能力,也为大四下学期的毕业设计提供了宝贵的经验。
参考文献
[1]顾卫钢.手把手教你学DSP-基于TMS320x281x北京航空航天大学出版社,2011.
[2]苏奎峰等.TMS320X281xDSP原理及C程序开发.北京航空航天大学出版社,2008.
[3]苏奎峰等.TMS320F2812原理与开发.电子工业出版社,2005.
[4]万山明.TMS320F2812/2810原理及应用实例.北京航空航天大学出版社,2007.
[5]TI公司著,胡广书等编译.TMS320C28X系列DSP的5CPU与外设.清华大学出版社,2005.
[6]TI公司著,胡广书等编译.TMS320C28X系列DSP指令和编程指南.清华大学出版社,2005.
附录程序清单
#include"
math.h"
DSP281x_Device.h"
//DSP281xHeaderfileIncludeFile
DSP281x_Examples.h"
//DSP281xExamplesIncludeFile
Uint16read_data2,read_data1;
//MCBSP接收数据变量
Uint16write_data2,write_data1;
//MCBSP发送数据变量
Uint16readaudio1[128],readaudio2[128];
//MCBSP接收数据变量数组
Uint16PA[128];
原始语音信号的时域波形
Uint16PB[128];
原始语音信号的时域滤波后的波形
Uint16PC[128];
原始语音信号的频域波形
Uint16PD[128];
原始语音信号的频域滤波后的波形
doublenpass,h[51],u,y,xmid[51];
intm=50;
voidspi_init(void);
//SPI初始化C
voidaic23_init(void);
//初始化TLV320AIC23,设置内部寄存器
voidmcbsp_init(void);
//MCBSP初始化
voidmcbsp_write_rdy(Uint16out_data1,Uint16out_data2);
//MCBSP发送一个数据32位
voidmcbsp_read_rdy(void);
//MCBSP接收一个数据32位
voidDelay(intnumbers);
//延迟
voidDelay0(Uint16numbers);
voidspi_init()
{
SpiaRegs.SPICCR.bit.SPISWRESET=0;
//ResetSPI
SpiaRegs.SPICCR.all=0x004F;
//Reseton,fallingedge,16-bitcharbits
SpiaRegs.SPICTL.all=0x0006;
//Enablemastermode,normalphase,
//enabletalk,andSPIintdisabled.
SpiaRegs.SPISTS.all=0x0080;
SpiaRegs.SPIBRR=0x0063;
//Baudrate,100KHZ;
SpiaRegs.SPIPRI.bit.FREE=1;
//Setsobreakpointsdon'
tdisturbxmission
SpiaRegs.SPICCR.bit.SPISWRESET=1;
//EnableSPI
}
voidaic23_init(void)
SpiaRegs.SPITXBUF=0x1e00;
//REG10RESETAIC23
asm("
nop"
);
//Address(bits15-9)0001111
Delay0(10);
//RES(bits8-0)000000000
//-----0001111000000000
SpiaRegs.SPITXBUF=0x0117;
//REG0Leftlineinputchannelvolumecontrol
//Address(bits15-9)0000000
//LRS(bits8)1Left/rightlinesimultaneousvolume/muteupdateEnabled
//LIM(bits7)0Leftlineinputmute0=Normal
//XX(bits6-5)00Reserved
//LIV[4:
0](bits4-0)10111Leftlineinputvolumecontrol(10111=0dBdefault)
//-----0000000100010111
SpiaRegs.SPITXBUF=0x0317;
//REG1RightLineInputChannelVolumeControl
//Address(bits15-9)0000001
//RRS(bits8)1Left/rightlinesimultaneousvolume/muteupdateEnabled
//RIM(bits7)0Leftlineinputmute0=Normal
//RIV[4:
//-----0000001100010111
SpiaRegs.SPITXBUF=0x05f9;
//REG2LeftChannelHeadphoneVolumeControl
//Address(bits15-9)0000010
//LRS(bits8)1Left/rightheadphonechannelsimultaneousvolume/muteupdate1=Enabled
//LZC(bits7)1Left-channelzero-crossdetect0=Off
//LHV[6:
0](bits6-0)1111001LeftHeadphonevolumecontrol(1111001=0dBdefault)
//-----0000010111111001
SpiaRegs.SPITXBUF=0x07f9;
//REG3RightChannelHeadphoneVolumeControl
//Address(bits15-9)0000011
//RLS(bits8)1Left/rightheadphonechannelsimultaneousvolume/muteupdate1=Enabled
//RZC(bits7)1Left-channelzero-crossdetect0=Off
//RHV[6:
//-----0000011111111001
//SpiaRegs.SPITXBUF=0x0810;
//选择线性输入
SpiaRegs.SPITXBUF=0x0814;
//选择麦克风输入
//REG4AnalogAudioPathControl