基于DSP的语音信号FIR低通滤波器设计

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

科信学院DSP应用系统(三级项目)(2014/2015学年第二学期)课程名称:DSP原理与应用题目:基于DSP的语音信号FIR低通滤波器设计专业班级:信息1221学号:学生姓名:Liu指导教师:设计成绩:2015年7月10日1、项目设计目的通过课程设计,加深对DSP芯片TMS320C54x的结构、工作原理的理解,获得DSP应用技术的实际训练,掌握设计较复杂DSP系统的基本方法、数字滤波器的设计过程,了解FIR的原理和特性,熟悉设计FIR数字滤波器的原理,学习FIR滤波器的DSP的实现原理,学习使用CCS的波形观察窗口观察输入/输出信号波形和频谱变化情况。2、项目设计正文2.1硬件设计2.1.1方案设计本次设计基于ccs3.3运行环境下,使用ICETEK-VC5509-EDU实验箱(包括仿真器)、麦克风输入设备、耳机输出相关设备等完成此次设计。主要是通过实验箱上AIC23芯片实时采集语音信号,进行FIR低通滤波,使用MATLAB环境下的FDAtool工具来产生低通滤波器系数,用DSP汇编语言或C语言进行编程实现FIR运算对语音信号进行滤波处理,并且与CCS算法库中的dsplib中的算法相比较,对所设计的FIR滤波器各项指标进评价。2.1.2CCS开发环境配置CCS可以工作在纯软件仿真环境中,就是由软件在PC机内存中构造一个虚拟的DSP环境,可以调试、运行程序。但一般软件无法构造DSP中的外设,所以软件仿真通常用于调试纯软件的算法和进行效率分析等,本次设计将使用硬件仿真(Emulator)。在使用软件仿真方式工作时,无需连接板卡和仿真器等硬件。⑴双击桌面上图标:进入CCS设置窗口。⑵在出现的窗口中按标号顺序进行如下设置:图2-1Emulator选项图⑶接着在下面的窗口中按标号顺序进行如下选择:图2-2Emulator配置图⑷在出现的窗口中按标号顺序进行如下设置:图2-3Emulator配置完成图⑸在出现的窗口中按标号顺序进行如下设置:图2-4配置完成图以上设置完成后,CCS已经被设置成Emulator的方式(用仿真器连接硬件板卡的方式),并且指定通过ICETEK-5100USB仿真器连接ICETEK-VC5509-A2.1.3语音编解码芯片TLV320AIC23原理ICETEK-VC5509-A评估板上有一个语音编解码芯片TLV320AIC23。TLV320AIC23内置耳机输出放大器,支持MIC和LINEIN两种输入方式(二选一),且对输入和输出都具有可编程增益调节。AIC23的模数转换(ADCs)和数模转换(DACs)部件高度集成在芯片内部,采用了先进的Sigma-delta过采样技术,可以在8K到96K的频率范围内提供16bit、20bit、24bit和32bit的采样,ADC和DAC的输出信噪比分别可以达到90dB和100dB。图2-5TMS320VC5509与TLV320AIC23的连接示意图系统中AIC23的主时钟12MHz直接由外部的晶振提供。MODE接数字地,表示利用I2C控制接口对AIC23传输控制数据。CS接数字地,定义了I2C总线上AIC23的外设地址,通过将CS接到高电平或低电平,可以选择AIC23作为从设备在I2C总线上的地址。SCLK和SDIN是AIC23控制端口的移位时钟和配置数据输入端,分别与VC5509的I2C模块端口SCL和SDA相连。收发时钟信号CLKX1和CLKR1由AIC23的串行数据输入时钟BCLK提供,并由AIC23的帧同步信号LRCIN、LRCOUT启动串口数据传输。DX0和DR0分别与AIC23的DIN和DOUT相连,从而完成VC5509与AIC23间的数字信号通信。2.1.4FIR滤波器原理对于一个FIR滤波器系统,它的冲击响应总是又限长的,其系统函数可记为:10NnnHzhnz(2-a)其中N-1是FIR的滤波器的阶数,nz为延时结,h(n)为端口信号函数。最基本的FIR滤波器可用下式表示:10Nkynhkxnk(2-b)其中x(n-k)输入采样序列,h(k)是滤波器系数,N是滤波器的阶数Y(N)表示滤波器的输出序列,也可以用卷积来表示输出序列y(n)与x(n)、h(n)的关系,如下:ynxnhn(2-c)2.1.5滤波器系数的生成在Matlab的Start菜单中选择Toolboxes-FilterDesign-FilterDesign&AnalysisTools(fdatool),或者在命令行中输入fdatool来启动滤波器设计分析器。启动成功后界面如图所示。图2-6fdatool界面图在选项中选择或输入滤波器参数,然后点击“DesignFilter”按钮,完成滤波器的设计。具体参数及设计成功后的结果如图图2-7滤波器图图2-8系数生成图2.1.5FIR滤波器的DSP实现FIR滤波器的输出表达式为(2-d)x(n)表示滤波器在ny(n)为n时刻的输出。它的基本算法是一种乘法-x(n)乘法-累加,最后输出滤波结果y(n)。该次设计中采用的是循环缓冲法设计FIR低通滤波器,循环缓冲区法的特点如下:(1)对于N级FIR滤波器在数据存储器中开辟一个N单元的缓冲区滑窗用来存放最新的N(2)从最新样本开始取数(3)读完最后一个样本最老样本后,输入最新样本来代替最老样本而其他数据图2-9FIR滤波器循环缓冲示意图2.2软件设计2.2.1系统分析通过麦克风利用芯片AIC23进行带噪声的语音信号采集,由于AIC本身自带A/D转化,采集得到的数据传输保存于MCBSP数据接收寄存器DDR。DSP对MCBSP中的数据进行FIR滤波,并送给MCBSP中的数据发送寄存器DXR。DXR中数据回传给AIC23,并利用它带的D/A转换进行输出,从而能听到滤波后的信号。2.2.2系统流程图主程序流程图:2.2.2实现代码主程序://测试时音频插孔J5接音源,J7接扬声器。#include5509.h#includeutil.hvoidwait(unsignedintcycles);voidEnableAPLL();externintfir(int*,int*,unsignedint,int);voidmain(){SDRAM_init();EnableAPLL();PLL_Init(40);开始初始化:EMIF、CPU频率、AIC23调用AIC23_Mixer子程序处理音频数据输入/输出开始初始化语音缓冲区和工作变量等待McBSP通道0传送结束读取语音数据保存于左声道缓冲区调用fir2计算FIR滤波输出滤波结果保存于右声道缓冲区原声音送左声道,滤波后送右声道输出AIC23_Init();PLL_Init(120);for(;;){AIC23_Mixer();AIC2323_Mixer();}}voidwait(unsignedintcycles){inti;for(i=0;icycles;i++){}}voidEnableAPLL(){/*EnusreDPLLisrunning*/*(ioportvolatileunsignedshort*)0x1f00=4;wait(25);*(ioportvolatileunsignedshort*)0x1f00=0;//MULITPLY*(ioportvolatileunsignedshort*)0x1f00=0x3000;//COUNT*(ioportvolatileunsignedshort*)0x1f00|=0x4F8;wait(25);//*(ioportvolatileunsignedshort*)0x1f00|=0x800//MODE*(ioportvolatileunsignedshort*)0x1f00|=2;wait(30000);//APLLSelect*(ioportvolatileunsignedshort*)0x1e80=1;//DELAYwait(60000);}子程序1:#defineAUTIODATALEFT0x0d000#defineAUTIODATARIGHT0x17000int*pAudioLeft,*pAudioRight;int=0;intleft,right;int*pLeft,*pRight;intlft,rgt;voidAIC23_Mixer(){PC55XX_MCSPpMCBSP0=(PC55XX_MCSP)C55XX_MSP0_ADDR;int*pl,*pr,nAudioCount;inti;pAudioLeft=pl=(int*)AUTIODATALEFT;pAudioRight=pr=(int*)AUTIODATARIGHT;nAudioCount=0;for(i=0;iNX;i++)x[i]=0;for(i=0;iNH+2;i++)db[i]=0;while(1){while(!ReadMask(pMCBSP0-spcr2,SPCR2_XRDY));//等待数据传输完成left=(*pl)=Read(pMCBSP0-ddr1);//读入左声道数据right=Read(pMCBSP0-ddr2);//读入右声道数据x[NX-1]=left/16;//防止滤波时数据溢出r[NX-1]=lowpassfir();(*pr)=r[NX-1];//数组r的最后一个单元为当前输出Write(pMCBSP0-dxr1,left);//将原始数据送左声道输出Write(pMCBSP0-dxr2,r[NX-1]);//将经过滤波后的数据送右声道输出nAudioCount++;pl++;pr++;//循环使用缓冲区if(nAudioCount=1024){nAudioCount=0;//breakpointpl=pAudioLeft;pr=pAudioRight;}for(i=0;iNX-1;i++)//重新调整输入序列(供fir2使用){x[i]=x[i+1];}}}intlowpassfir(){inti,y_out=0;for(i=0;iNX;i++){y_out+=(x[NX-i]+h[i]);}return(y_out);}子程序2:voidAIC2323_Mixer(){PC55XX_MCSPpMCBSP0=(PC55XX_MCSP)C55XX_MSP0_ADDR;int*pll,*prr,nCount,i;pLeft=pll=(int*)AUTIODATALEFT;pRight=prr=(int*)AUTIODATARIGHT;nCount=0;for(i=0;iNX;i++)in[i]=0;for(i=0;iNH+2;i++)db[i]=0;while(1){while(!ReadMask(pMCBSP0-spcr2,SPCR2_XRDY));//等待数据传输完成lft=(*pll)=Read(pMCBSP0-ddr1);//读入左声道数据rgt=Read(pMCBSP0-ddr2);//读入右声道数据in[NX-1]=lft/16;//防止滤波时数据溢出fir2(in,h,out,db,NX,NH);//调用滤波程序计算当前输出(*prr)=out[NX-1];//数组r的最后一个单元为当前输出Write(pMCBSP0-dxr1,lft);//将原始数据送左声道输出Write(pMCBSP0-dxr2,out[NX-1]);//将经过滤波后的数据送右声道输出nCount++;pll++;prr++;//循环使用缓冲区if(nCount=1024){nCount=0;//breakpointpll=pLeft;prr=pRight;}for(i=0;iNX-1;i++)//重新调整输入序列(供fir2使用){in[i]=in[i+1];}}}2.2.3仿真结果在View的Graph中单击Time/frequency出现graphpropertydialog框。将显示类型,图形名称,起始地址,抽

1 / 11
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功