基于DSP的语音采集与FIR滤波器的设计与实现摘要:介绍了一种基于TMS320C5402的语音采集与FIR数字滤波器的设计与实现,采用TLC320AD50作为语音CODEC模块的核心器件,简述了FIR数字滤波器的特点,以及其在DSP上实现的原理。利用TMS320C5402对采集到的语音信号进行FIR滤波,该系统具有较强的数据处理能力和灵活的接口电路,能够满足语音信号滤波的要求,可以扩展为语音信号处理的通用平台.关键词:语音采集;FIR滤波器;TMS320C5402数字信号处理是把数字或符号表示的序列,通过计算机或专用处理设备,用数字的方式去处理,以达到更符合人们要求的信号形式。而语音处理是数字信号处理最活跃的研究方向之一,在IP电话和多媒体通信中得到广泛应用.一个完备的语音信号处理系统不但要具有语音信号的采集和回放功能,还要能够进行复杂的语音信号分析和处理。通常这些信号处理算法的运算量很大,而且又要满足实时的快速高效处理要求,随着DSP技术的发展,以DSP为内核的设备越来越多,为语音信号的处理提供了优质可靠的平台.软件编程的灵活性给很多设备增加不同的功能提供了方便,利用软件在已有的硬件平台上实现不同的功能已成为一种趋势。本文设计了一个语音处理系统,采用定点DSP芯片TMS320C5402作为CPU,完成对语音信号的采集和滤波处理.1语音采集系统的设计1.1系统总体设计语音采集与处理系统主要包括3个主要部分:以TMS320C5402为核心的数据处理模块;以TLC320AD50为核心的语音采集与编解码(CODEC)模块;用户根据需要扩展的存储器模块.系统硬件结构如图1所示.1.1.1CODEC模块本设计选用TLC320AD50(以下简称AD50)完成语音信号的A/D转换和D/A转换.AD50是TI公司生产的一款集成有A/D和D/A的音频芯片,DSP与音频AD50连接后,可使用一个缓冲串行口来同时实现语音信号的采集和输出,从而可以节省DSP的硬件开销.AD50使用过采样技术提供从数字信号到模拟信号和模拟信号到数字信号的高分辨率低速信号转换.该器件包括2个串行的同步转换通道,分别用于各自的数据传输.语音信号直接从AD50的模拟信号输入端输入,AD50对其进行采样,并将采样后的数据传送至DSP.DSP应用相应的算法对数据进行处理,并将处理后的数据传送到AD50的D/A输入端.AD50再对DSP处理后的数据进行数模转换,变为语音信号后输出到音响设备.本系统中TLC320AD50与TMS320C5402之间采用串行通信,通过DSP芯片的MCBSP串口实现.接口电路如图2所示.1.1.2MCBSP的工作原理TMS320C5402有2个McBSP多通道缓存串行口.McBSP提供了全双工的通信机制,以及双缓存的发送寄存器和三缓存的接收寄存器,允许连续的数据流传输,数据长度可以为8、12、16、20、24、32;同时还提供了A律和L律压扩.数据信号经DR和DX引脚与外设通讯,控制信号则由CLKX、CLKR、FSX、FSR等4个引脚来实现[4].CPU和DMA控制器可以读取DRR[1,2]的数据实现接收,并且可以对DXR[1,2]写入数据实现发送.串行口控制寄存器SPCR[1,2]和引脚控制寄存器PCR用来配置串行口;接收控制寄存器RCR[1,2]和发送控制寄存器XCR[1,2]用来设置接收通道和发送通道的参数;采样率发生器寄存器SRGR[1,2]用来设置采样率.TMS320C5402芯片串口控制寄存器功能强大,用户通过编程不但可以设置时钟信号的极性及输入输出方向,还可以设置同步信号的极性及输入输出方向.1.1.3AD50与DSP的同步通信在应用中,将TLC320AD50C接至DSP的同步串口,并将TLC320AD50设置在主动工作模式下,即由TLC320AD50提供帧同步信号和移位时钟,TMS320C5402的管脚电压为3.3V,可以与AD50直接相连.串口的移位时钟SCLK由AD发出,串行数据在SCLK的驱动下经DIN、DOUT移进、移出,在SCLK的下降沿采样DIN数据,在SCLK下降沿送出数据到DOUT.XF控制首次或二次通信,XF为低时是AD50的首次通信,是正常的AD、DA的数据;XF为高时是AD50的二次通信,这时可以读写AD50的4个寄存器.进入二次通信有软件的方法,即把AD50设为15+1位数据模式,最后一位标记下一个数据是否为二次通信数据,1表示是,0表示否.一次通信格式的16位都用来传输数据.DAC的数据长度由寄存器1的D0位决定.启动和复位时,默认值为15+1模式,最后一位要求二次通信.如果工作在16位传输模式下,则必须由FC产生二次通信请求.二次通信格式则用来初始化和修改TLC320AD50C内部寄存器的值.在二次通信中可通过向DIN写数据来完成初始化.二次通信格式如图3所示,D13=1表示读DIN的数据,D13=0表示向DIN写数据.系统复位后,必须通过DSP的DX接口向TLC320AD50C的DIN写数据,因为采用一片TLC320AD50C,只需初始化寄存器1、寄存器2、寄存器4.由于通信数据长度为16位,初始化是应通过RCR1和XCR1设置McBSP的传输数据长度为16.2语音采集语音信号的采集,是通过话筒经模拟放大输入到AD50,AD50作相应的低频滤波并进行A/D转化,再通过MCBSP通道输入DSP芯片.语音信号采集程序包括以下几个部分:(1)DSP初始化.对DSP的寄存器以及缓冲串口进行初始化.(2)AD50初始化.通过DSP的缓冲串口和XF引脚对AD50进行初始化,再设置AD50的4个控制寄存器;确定AD50的4个控制寄存器设置正确后,AD50才能开始采集数据.此时,可以用示波器检测AD50的DOUT引脚,能发现引脚是否有连续的信号输出.(3)设置DSP的中断,从缓冲串口读取数据.如果此时在缓冲串口连续读取数据,就可以在仿真软件CCS中查看读取的数据是否正确.(4)DSP存放数据.可以将缓冲串口读取的数据存放到DSP的RAM单元,连续存放,可通过CCS的图形显示功能判断AD50采样的数据是否正确.3语音滤波语音去噪在语音信号上应用较多,在实质上和普通的数字信号去噪没有什么区别,使用滤波器和各种算法均可以实现语音信号的去噪,使得含有噪声的信号更加清晰.但语音信号的去噪和一般的数字信号去噪又存在着很大的差别,因为语音信号的频谱覆盖在100Hz~3.4kHz,较为丰富的信号主要集中在1kHz附近,所以一般的滤波去噪时必须考虑语音信号的自身特征.本系统中应用的AD50内置了低通滤波器,可以通过设置来有效滤除信号中混杂的高频干扰信号,而对于低于100Hz的干扰信号,则无能为力.因此,要用DSP进行编程设计一个软件可实现高通滤波器,由处理器来完成信号的去噪,采用FIR滤波.3.1FIR滤波器的基本结构及特点有限冲激响应(FIR)滤波器的基本结构是一个分节的延时线,把每一节的输出加权累加,得到滤波器的输出.数学上表示为y(n)=EN-1n=0h(n)x(n-m),(0[n[N-1)(1)对(1)式进行Z变换,整理后可得出FIR滤波器的传递函数为H(z)=EN-1n=0h(n)z-n,(0[n[N-1)(2)由(2)式可知FIR滤波器的一般结构如图1所示.图1FIR数字滤波器直接实现形式3.2FIR滤波器的DSP实现原理由(1)式可知,FIR滤波器的冲激响应为h(0),h(1),,,h(N-1).x(n)表示滤波器在n时刻的输入,则n时刻的输出为y(n)=h(0)x(n)+h(1)x(n-1)+,+h(N-1)x[n-(N-1)],这是一个乘、加的过程,可以使用DSP中的MAC指令实现该运算.图2说明了使用循环寻址实现FIR滤波器的方法.为了能正确使用循环寻址,必须先初始化BK,块长为N.同时,数据缓冲区和冲激响应(FIR滤波器的系数)的开始地址必须是大于N的2的最小幂的倍数.例如,当N=11时,大于N的最小2的幂为16,则数据缓冲区的第一位地址应该是16的倍数,因此数据缓冲区起始地址的最低4位必须是0.在图2中,滤波系数指针初始化时指向h(N-1),经过一次FIR滤波计算后,在循环寻址的作用下,仍然指向h(N-1).而数据缓冲区指针指向的是需要更新的数据,如x(n).在写入新数据并完成FIR运算后,该指针指向x(n-(N-1)),所以,使用循环寻址可以方便地完成滤波窗口数据的自动更新.4FIR滤波器设计实例给定FIR数字带通滤波器的技术指标为:2个通带截止频率分别为4kHz和6kHz,2个阻带截止频率分别为3kHz和7kHz,采样频率均为25kHz.输入为一个混合信号f=[cos(2000Pt)+cos(10000Pt)+cos(20000Pt)]/6,利用Matlab设计FIR带通滤波器的系数,将得到的滤波器系数乘以32768(即215)后舍尾取整可得DSP中滤波器系数列表.用.word汇编命令将各滤波器系数直接输入到DSP程序中;模拟输入数据由C语言程序实现,然后用.copy命令将C语言程序生成的数据文件firinput拷贝到DSP程序中.DSP程序实现读入数据、滤波、显示波形等方面的任务.完成FIR滤波器的程序框图如图3所示,可知FIR滤波器的DSP实现主要由以下4方面的内容组成.4.1模拟输入数据的生成用C语言程序生成输入数据,通过.copy汇编命令将生成的数据文件拷贝到汇编程序中,作为FIR滤波器的输入数据.C语言程序运行后所生成的数据文件名为firinpu,t生成firinput数据文件的C语言程序如下所示:#includestdio.h#includemath.hmain(){int;idoublef[256];FILE*fp;if((fp=fopen(e:\\firinput,wt))==NULL){printf(canctopenfile!\n);}for(i=0;i=255;i++){f[i]=(cos(2*3.14159265**i1000/25000)+cos(2*3.14159265**i5000/25000)+cos(2*3.14159265**i10000/25000))/6;fprintf(fp,.word%ld\n,(long)(f[i]*32768));}fclose(fp);}4.2DSP初始化程序DSP初始化程序包括了对堆栈指针(SP)、软件等待状态寄存器(SWWSR)、中断寄存器(IFR)、中断屏蔽寄存器(IMR)以及处理器工作状态寄存器(PMST)的初始化;另外还对各变量赋值,具体的程序如下:.def_c_int00.mmregsswcr.set2bht_ar2.set066ht_ar3.set067hout_wave_buf.set0d00hdata_in.set0f00hN.set51fir_coef_buf.set100hfir_data.set200h.textrsb_c_int00_c_int00:stm#2020h,pmstssbxintmssbxsxmssbxfrctstm#10h,26hstm#10h,36hstm#0ffh,spld#0,dpstm#0ffffh,ifrstm#20h,imrstm#02492h,swwsrstm#0,swcr可看出,FIR滤波器的系数列表将存在100h开始的单元中,输入数据将存在200h开始的单元中,而输出数据将存在0d00h开始的单元中.4.3滤波系数以及输入数据的调入由于滤波器系数一开始是存在程序存储器中,输入数据则是存在程序外的文件中,程序对这2组数据进行处理时,需要把两者都调到数据存储器中,具体实现程序如下:stm#fir_data,ar6rpt#255mvpd#inpu,t*ar6+stm#fir_coef_bu,far6rpt#N-1mvpdfir_coe,f*ar6+stm#fir_coef_bu,ft_ar2stm#fir_data,t_ar3这段程序实现的是把输入数据调到以200h开始的单元,