基于DSP的语音信号FIR低通滤波器设计概要.docx
《基于DSP的语音信号FIR低通滤波器设计概要.docx》由会员分享,可在线阅读,更多相关《基于DSP的语音信号FIR低通滤波器设计概要.docx(18页珍藏版)》请在冰豆网上搜索。
基于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-A
2.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滤波器系统,它的冲击响应总是又限长的,其系统函数可记为:
(2-a)
其中N-1是FIR的滤波器的阶数,
为延时结,h(n)为端口信号函数。
最基本的FIR滤波器可用下式表示:
(2-b)
其中x(n-k)输入采样序列,h(k)是滤波器系数,N是滤波器的阶数Y(N)表示滤波器的输出序列,也可以用卷积来表示输出序列y(n)与x(n)、h(n)的关系,如下:
(2-c)
2.1.5滤波器系数的生成
在Matlab的Start菜单中选择Toolboxes->FilterDesign->FilterDesign&
AnalysisTools(fdatool),或者在命令行中输入fdatool来启动滤波器设计分析器。
启动成功后界面如图所示。
图2-6fdatool界面图
在选项中选择或输入滤波器参数,然后点击“DesignFilter”按钮,完成滤
波器的设计。
具体参数及设计成功后的结果如图
图2-7滤波器图
从Matlab中导出FIR滤波器系数。
在Fdatool中,选择Targets->CodeComposerStudio(tm)IDE,在出现的对话框中选择输出文件类型为Cheaderfile,输出系数类型为signed16-bitinteger,如图2.1.3.3所示。
点击Generate按钮,选择路径,即可输出前一步设计出的FIR滤波器的系数表。
图2-8系数生成图
2.1.5FIR滤波器的DSP实现
FIR滤波器的输出表达式为
(2-d)
式中为滤波器系数x(n)表示滤波器在n时刻的输入y(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接扬声器。
#include"5509.h"
#include"util.h"
voidwait(unsignedintcycles);
voidEnableAPLL();
externintfir(int*,int*,unsignedint,int);
voidmain()
{
SDRAM_init();
EnableAPLL();
PLL_Init(40);
AIC23_Init();
PLL_Init(120);
for(;;)
{
AIC23_Mixer();
AIC2323_Mixer();
}
}
voidwait(unsignedintcycles)
{
inti;
for(i=0;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;
//DELAY
wait(60000);
}
子程序1:
#defineAUTIODATALEFT0x0d000
#defineAUTIODATARIGHT0x17000
int*pAudioLeft,*pAudioRight;
intwww=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;ifor(i=0;iwhile
(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;//breakpoint
pl=pAudioLeft;
pr=pAudioRight;
}
for(i=0;i{
x[i]=x[i+1];
}
}
}
intlowpassfir()
{
inti,y_out=0;
for(i=0;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;ifor(i=0;iwhile
(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;//breakpoint
pll=pLeft;
prr=pRight;
}
for(i=0;i{
in[i]=in[i+1];
}
}
}
2.2.3仿真结果
在View的Graph中单击Time/frequency出现graphpropertydialog框。
将显示类型,图形名称,起始地址,抽样点数,数据类型等分别进行设置,输出各种波形。
输出滤波前的信号时域波形
语音输入波形图:
图2-10语音输入(时域)图2-11语音输入(频域)
图2-12滤波语音输出(时域)图2-13滤波语音输出(频域)
图2-14滤波器(时域)图2-15滤波器(频域)
图2-16库函数滤波语音输出(时域)图2-17库函数滤波语音输出(时域)
图2-18库函数与自编函数滤波对比图
通过分析仿真图可知,自己编写的函数基本与库函数中FIR算法没有差异,该滤波器性能较好。
3、项目设计总结
在这次课程设计中,我了解到了数字滤波是信号处理技术中的重要部分,研究了数字滤波器的基本理论知识以及它实现方法。
学习了数字滤波器的结构、设计理论,掌握了各种数字滤波器的原理和特性。
并且复习了MATLAB的相关知识,并且利用MATLAB与CCS设计了低通滤波器以及高通滤波器,还研究了如何在定点DSP中实现数字滤波器的算法,掌握了CCS环境下的程序开发方法、调试工具的使用及优化级别的选择等。
学会利用MATLAB软件编程实现FIR滤波器设计。
利用DSP来快速设计FIR数字滤波器的方法。
在今后的工作和学习生活中,综合运用模拟电子、数字电子和DSP基本原理等课程中所学的理论知识去独立完成一个项目的设计。
不仅要完善以上的MATLAB设计方法,更要学会利用多种途径设计各种DSP最小系统,熟练C语言编程。
4、参考文献
[1]戴明桢等编著.TMS320C54XDSP结构原理及应用.北京:
航空航天大学出版社,第2版,2007;
[2]彭启琮编著.DSP技术的发展与应用.北京:
高等教育出版社,2002;
[3]胡广书编著.数字信号处理理论、算法与实现.北京:
清华大学出版社,2005;
[4]王秀芳,关凌涛.基于MatLab与DSP的滤波器的快速设计方法[期刊文章].现代计算机,2008,总第二七七期:
97--99
[5]赵秀玲.基于定点DSP的FIR数字滤波器的研究与设计[硕士论文].曲阜师范大学,2007.15--32
课程设计
评语
课程设计
成绩
指导教师
(签字)
年月日
注:
此表必须在同一页面。