资源描述
第六章:片内外设,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,*,第,8,章,TMS320C54x,应用系统设计举例,DSP,应用中几个典型的案例:,正弦信号发生器,FIR,数字滤波器的设计和实现方法,快速傅里叶变换,语音信号采集和回放的实现方法,第,8,章:,应用系统设计举例,8.1 DSP,应用系统设计基本步骤,第,8,章:,应用系统设计举例,设计基本步骤,典型的,DSP,目标板结构框图,第,8,章:,应用系统设计举例,设计基本步骤,一个,DSP,应用系统设计包括硬件设计和软件设计两部分。,硬件设计,又称为目标板设计,考虑算法需求分析和成本、体积、功耗核算等。,软件设计,是指设计包括信号处理算法的程序,用,DSP,汇编语言或通用的高级语言,(C/C+),编写出来并进行调试。这些程序要放在,DSP,片内或片外存储器中运行,在程序执行时,,DSP,会执行与,DSP,外围设备传递数据或互相控制的指令。,DSP,的软件与硬件设计调试是密不可分的。,第,8,章:,应用系统设计举例,设计基本步骤,8.1 DSP,应用系统设计基本步骤,第,8,章:,应用系统设计举例,正弦信号发生器,8.2,正弦信号发生器,用,DSP,实现正弦信号发生器的基本方法有三种:,(1),查表法。,即将某个频率的正弦,/,余弦值计算出来后制成一个表,,DSP,工作时仅作查表运算即可。这种方法适用于信号精度要求不是很高的情况。当对于信号的精度要求较高时,其信号采样点的个数增多,占用的存储器空间也将增大。,(2),泰勒级数展开法。,与查表法相比,需要的存储单元少,但是泰勒级数展开一般只能取有限次项,精度无法得到保证。,(3),迭代法。,利用数字振荡器通过迭代方法产生正弦信号。,第,8,章:,应用系统设计举例,正弦信号发生器,8.2.1,数字振荡器原理,设单位冲击序列经过一系统后,其输出为正弦序列,则系统的传递函数为,其中,,其振荡频率由系数,A,、,B,和,C,来决定。因此,设计振荡器主要就在于确定这些系数。,第,8,章:,应用系统设计举例,正弦信号发生器,设初始值为,0,,数字振荡器的二阶差分方程形式为:,利用单位冲击函数性质,即仅当,k,=1,时,,x,k,1=1,,得:,当,k,2,,,y,k,能用,y,k,1,和,y,k,2,算出,,递归的差分方程。,第,8,章:,应用系统设计举例,正弦信号发生器,8.2.2,正弦波信号发生器的设计,要求:,设计产生频率为 的正弦波;,采用定时中断的方法输出,yn,;,设采样率为,(,即通过定时器中断,每隔,25,s,产生一个,yn,),。,第,8,章:,应用系统设计举例,正弦信号发生器,递归的差分方程系数为:,将所有系数除以,2,,用,16,位定点,第,8,章:,应用系统设计举例,正弦信号发生器,定时器的初值计算,要求:,定时器产生,25,s,时间间隔,获得,40kHz,的采样频率。,定时器的初值计算由下式决定,式中 为,DSP,时钟频率, 为采样频率。,设预分频系数,TDDR=0,,则定时器周期寄存器初值,PRD,为,本例中 , ,则,PRD=2499,。,第,8,章:,应用系统设计举例,正弦信号发生器,8.2.3,正弦波信号发生器的实现,初始化:,初始化,y1,和,y2,、初始化定时器、初始化中断,1.,初始化,y1,和,y2,SSBXFRCT,;置,FRCT =1,,准备进行小数乘法运算,ST #INIT_A,,,AA,;将常数,A,装入变量,AA,ST #INIT_B,,,BB,;将常数,B,装入变量,BB,ST #INIT_C,,,CC,;将常数,C,装入变量,CC,PSHD CC,;将变量,CC,压入堆栈,POPD,y1,;初始化,y1=CC,LD AA,,,T,;装,AA,到,T,寄存器,MPY,y1,,,A,;,y1,乘系数,A,,结果放入,A,寄存器,STH A,,,y2,;将寄存器,A,的高,16,位存入变量,y2,第,8,章:,应用系统设计举例,正弦信号发生器,2.,初始化定时器程序,STM#10h,,,TCR,;停止定时器,STM#2499,,,PRD,;设置,PRD,寄存器值为,2499,,,TINT,中断频率为,40KHz,STM#20h,,,TCR,;重新装入,TIM,和,PSC,,启动定时器,第,8,章:,应用系统设计举例,正弦信号发生器,3.,中断初始化,包括设置中断总开关和中断屏蔽寄存器,修改中断向量表的入口地址。中断初始化程序代码片断:,LD #0,,,DP,;设置,DP,页指针,SSBX INTM,;关闭所有中断,LD #vector,;读出中断向量,(,地址,vector,在中断,向量表程序中定义,),AND #0FF80h, A,OR PMST, A,;保留,PMST,的低,7,位,STLM A,PMST,;设置,PMST(,其中包括,IPTR),RSBX INTM,;开所有中断,第,8,章:,应用系统设计举例,正弦信号发生器,中断服务程序,利用前面的,y1,和,y2,,计算出新的,yn,。,_tint,:,LD BB, T,;将系数,B,装入,T,寄存器,MPY y1, A,;,y1,乘系数,B,,结果放入,A,寄存器,LTD y2,;将,y2,装入,T,寄存器,同时复制到,y1,MAC AA, A,;完成新正弦数据的计算,,a,寄存器中为,;,y2*AA+y1*BB,STH A, l, y1,;将新数据存入,y1,,因所有系数都除过,2,,所以,;在保存结果时转移一位,恢复数据正常大小,STH A, y0,;将新正弦数据存入,y0,NOP,RETE,第,8,章:,应用系统设计举例,正弦信号发生器,要获得完整的程序,必须有中断向量表文件和内存定位文件。,中断向量表清单如下:,.,mmregs,.ref _ret,.ref _c_int00,.ref _tint,.global vector,.sect.,int_table,;,-,;,interrupte,vector table !,;,-,vector,:,rs,b _c_int00,nop,nop,第,8,章:,应用系统设计举例,正弦信号发生器,内存定位文件清单如下:,MEMORY,PAGE 0,:,VEC,:,origin = 1000h,,,length = 0ffh,PROG,:,origin = 1100h,,,length = 8000h,PAGE 1,:,DATA,:,origin = 080h,,,length = 0807fh,SECTIONS,.text PROG PAGE 0,.,cinit, PROG PAGE 0,.switch PROG PAGE 0,.,int_table, VEC PAGE 0,.data DATA PAGE 1,.,bss, DATA PAGE 1,.const DATA PAGE 1,.,sysmem, DATA PAGE 1,.stack DATA PAGE 1,第,8,章:,应用系统设计举例,正弦信号发生器,4.,观察输出信号波形以及频谱,启动,CCS,,新建工程文件,,sinewave.pjt,。加入:,汇编源程序,sin.asm,,包括初始化代码和中断服务程序;,汇编源程序,vec_table.asm,,为中断向量表。,连接定位,sinewave.cmd,文件,(2),完成编译、连接,生成,.out,文件,并装载,.out,文件到片内存储器。,(3),选择“,ViewGraphTime,/Frequency”,,打开图形显示设置窗口。在弹出的对话框中按图,8.3,设置,主要修改“,Star Address”,为,y0(y0,为生成的正弦波输出变量,),;“,Acquisition Buffer Size”,为,1,,“,DSP Data Type”,为“,16-bit signed integer”,。,第,8,章:,应用系统设计举例,正弦信号发生器,第,8,章:,应用系统设计举例,FIR,数字滤波器,8.3 FIR,数字滤波器,8.3.1 FIR,滤波器的基本原理和结构,差分方程:,结构图:,FIR,滤波算法实际上是一种乘法累加运算。它不断地从输入端读入样本值,x,n,,经延时,( ),后做乘法累加,输出滤波结果,y,n,。,第,8,章:,应用系统设计举例,FIR,数字滤波器,FIR,滤波器的设计方法,FIR,滤波器的设计方法主要有窗函数法和频率采样法 。,窗函数法是最基本的方法 ,窗的类型有:,矩形窗,Hanning,窗,Blackman,窗,Kaiser,窗,DSP,设计者可以利用功能强大的,MATLAB,工具很方便的设计出逼近理想特性的,FIR,滤波器。,然后将,FIR,系数放入,DSP,程序中。,第,8,章:,应用系统设计举例,FIR,数字滤波器,8.3.2 FIR,滤波器的,DSP,实现,FIR,滤波器的输出表达式为,不断地对输入样本进行,n,1,延时后,再进行乘法累加。,C54x,通过两种方法实现,FIR,滤波器的延迟线,:,1.,线性缓冲区法,2.,循环缓冲区法,3.,系数对称,FIR,滤波器的实现方法,第,8,章:,应用系统设计举例,FIR,数字滤波器,1.,线性缓冲区法,(,又称延迟线法,),实现,N,阶,FIR,滤波器,需要在数据存储器中开辟一个,N,单元的缓冲区,(,滑窗,),,用来存放最新的,N,个输入样本。,DSP,每计算一个输出值,都需要读取,N,个样本并进行,N,次乘法和累加,;,每当读取一个样本后,将此样本向后移动,读完最后一个样本后,最老的样本被推出缓冲区,输入最新样本存入缓冲区的顶部。,优点:线性缓冲区法具有存储器中新老数据位置直观明了。,第,8,章:,应用系统设计举例,FIR,数字滤波器,N,=8,的线性缓冲区,:,顶部为低地址单元,存放最新样本,,底部为高地址单元,存放最老样本,;,AR1,被用作间接寻址的数据缓冲区的辅助寄存器,指向最老样本单元。,AR2,被用作间接寻址的系数区的辅助寄存器。,第,8,章:,应用系统设计举例,FIR,数字滤波器,实现 的运算,可通过执行存储器延时指令,DELAY,来实现,其指令为:,DELAY,Smem,;(Smen)Smem+1,或,DELAY*AR1-;AR1,指向源地址,将延时指令与其它指令结合使用,可在同样的机器周期内完成这些操作。例如:,LD+DELAY,LTD,指令,MAC+DELAY,MACD,指令,注意:用线性缓冲区实现运算时,缓冲区的数据需要移动,这样在一个机器周期内需要一次读和一次写操作。因此,线性缓冲区只能定位在,DARAM,中。,第,8,章:,应用系统设计举例,FIR,数字滤波器,线性缓冲区法实现,FIR,滤波器的汇编语言程序设计,.titleFIR1.ASM,.,mmregs,.defstart,X.,usect,x,7,;自定义数据空间,PA0.set0,PA1.set1,.data,COEF:.word,1*32768/10,;定义,b6,.word2*32768/10,;定义,b5,.word-4*32768/10,;定义,b4,.word3*32768/10,;定义,b3,.word-4*32768/10,;定义,b2,.word2*32768/10,;定义,b1,.word1*32768/10,;定义,b0,.text,第,8,章:,应用系统设计举例,FIR,数字滤波器,start:SSBXFRCT,;设置小数乘法,STM#x+7,AR1,;,AR1,指向缓冲区底部,x(n-6),STM#7,AR0,;,AR0=7,设置,AR1,复位值,LD#x+1,DP,;设置页指针,PORTR PA1,x+1,;输入,x(n,),FIR1:,RPTZA, #7,;累加器,A,清,0,设置迭代次数,MACD *AR1-, COEF,A,;完成乘法,-,累加并移位,STHA,*AR1,;暂存,y(,n,),PORTW *AR1+,PA0,;输出,y(,n,),BDFIR1,PORTR PA1, *AR1+0,;,输入最新样本,并修改,;,AR1=AR1+AR0,;指向缓冲区底部,.end,第,8,章:,应用系统设计举例,FIR,数字滤波器,2.,循环缓冲区法,实现,N,阶,FIR,滤波器时,需要在数据存储器中开辟一个称为滑窗为,N,个单元的缓冲区,用来存放最新的,N,个输入样本。,每当输入新的样本时,以新样本改写滑窗中最老的数据,而滑窗的其他数据不需要移动。,优点:,不用移动数据,不需要在一个机器周期中要求进行一次读和一次写的数据存储器,因此,可将循环缓冲区定位在数据存储器的任何位置,而不像线性缓冲区要求定位在,DARAM,中那样。,缺点:,在循环缓冲区新老数据不很直接明了。,第,8,章:,应用系统设计举例,FIR,数字滤波器,8,级循环缓冲区的结构,顶部为低地址单元,底部为高地址单元;,指针,ARx,指向最新样本单元。,第,8,章:,应用系统设计举例,FIR,数字滤波器,实现循环缓冲区间接寻址的关键:循环寻址方式,注意两点:,第一,,必须采用,BK(,循环缓冲区长度,),寄存器按模间接寻址来实现。,BK=N,在实现,N,阶,FIR,时,设定,BK,的值为,FIR,的阶数,就能保证循环缓冲区的指针,ARx,始终指向循环缓冲区,实现循环缓冲区顶部和底部的相邻。,第二,,必须满足,2,k,N,,其中,k,是整数,,N,是,FIR,滤波器的级数,而且循环缓冲区的基地址的,k,个最低有效位必须为,0,。,如,N,=31,时,由于,2,5,=32,31,,,k,=5,,该地址的最低,5,位为,0,,所以循环缓冲区必须从二进制地址,xxxx,xxx0 0000B,开始,第,8,章:,应用系统设计举例,FIR,数字滤波器,利用循环缓冲区和双操作数寻址方法实现的,FIR,滤波器,第,8,章:,应用系统设计举例,FIR,数字滤波器,.titleFIR2.ASM,.,mmregs,.defstart,.,bss,y , 1,X.,usect,x,7,;定义数据存储器空间,b0.,usect,b0,7,PA0.set0,PA1.set1,.data,COEF:,.word1*32768/10,;定义,b6,.word2*32768/10,;定义,b5,.text,第,8,章:,应用系统设计举例,FIR,数字滤波器,start:,SSBXFRCT,;设置小数乘法,STM#b0,AR1,;,AR1,指向,b0,RPT#6,MVPD table,*AR1+,;完成数据搬移,STM#xn+6, AR2,;,AR2,指向缓冲区底部,xn-6,STM#b0+6, AR3,;,AR3,指向系数缓冲区底部,b6,STM#7,BK,;,BK=7,LD#,xn,DP ;,设置页指针,PORTR PA1,xn,;输入,xn,第,8,章:,应用系统设计举例,FIR,数字滤波器,FIR2:,RPTZA,#6,;累加器,A,清,0,设置迭代次数,MAC*AR2+0%, *AR3+0%, A,;完成乘法,-,累加,循环,STH A,y,;暂存,yn,PORTW y,PA0,;输出,yn,BDFIR2,PORTR PA1,*AR2+0%,;,循环输入最新样本并修改,;,AR2=AR2+AR0,;指向缓冲区底部,.end,第,8,章:,应用系统设计举例,FIR,数字滤波器,3.,系数对称,FIR,滤波器的实现方法,优点,:,乘法的次数减少了一半。,实现方法,:,使用专门用于系数对称,FIR,滤波器的指令。,FIRS,Xmem,,,Ymem,,,Pmad,该指令的操作如下:,执行:,PmadPAR,当,(RC)0,(循环计数器),(,Xmem,),(Ymem)16A,(B),(A(32,16)PARB,(PAR,1)PAR,(RC),1RC,第,8,章:,应用系统设计举例,FIR,数字滤波器,说明:,FIRS,指令在同一机器周期内,通过,C,和,D,总线读两次数据存储器,同时通过,P,总线读程序存储区的一个系数。,注意两点:,(1),在数据存储器中开辟两个循环缓冲区,如,New,和,Old,缓冲区,分别存放,N/2,个新数据和老数据,循环缓冲区的长度为,N/2,。设置了循环缓冲区,就需要设置相应的循环缓冲区指针,如用,AR2,指向,New,缓冲区中最新的数据,,AR3,指向,Old,缓冲区中最老的数据;,(2),将系数表存放在程序缓冲区内。,第,8,章:,应用系统设计举例,FIR,数字滤波器,.,mmregs,.def start,.,bss,y, 1,x_new,:.,usect,DATA1,4,x_old,: .,usect,DATA2,4,size .set4,PA0.set0,PA1.set1,.data,COEF .word1*32768/10, 2*32768/10,.word3*32768/10, 4*32768/10,.text,第,8,章:,应用系统设计举例,FIR,数字滤波器,start:LD#y,,,DP,SSBXFRCT,STM#,x_new,,,AR2,;,AR2,指向新缓冲区第一个单元,STM#x_old+(size-1),AR3,;,AR3,指向老缓冲区最后,1,个单元,STM#size, BK,;,循环缓冲区长度,STM#-1,,,AR0,LD#,x_new,,,DP,PORTR PA1,x_new,;,输入,x,n,FIR,:,ADD* AR2,0%,* AR3,0%,A,;,AH=,x,n,+,x,n,-7(,第一次,),RPTZB, # (size-1),;,B=0,下条指令执行,size,次,FIRS* AR2+0%,,*,AR3,0%,,,COEF,;,B+=AH*a0,AH=,x,n,-1+,x,n,-6,STHB,,,y,;保存结果,第,8,章:,应用系统设计举例,FIR,数字滤波器,PORTW y,,,PA0,;输出结果,MAR* +AR2(2)%,;修正,AR2,,指向新缓冲区最老数据,MAR* AR3+%,;修正,AR3,,指向老缓冲区最老数据,MVDD* AR2,,*,AR3+0%,;新缓冲区向老缓冲区传送一个数,BDFIR,PORTR PA1,,*,AR2,;输入新数据至新缓冲区,.end,第,8,章:,应用系统设计举例,FIR,数字滤波器,8.3.3 FIR,滤波器应用举例,设计指标:,设计一个,FIR,低通滤波器,通带边界频率为,1500Hz,,通带波纹小于,1dB,,,阻带边界频率为,2000Hz,,阻带衰减大于,40dB,,,采样频率为,8000Hz,。,设计步骤,(4,步,),:,(1),设计,FIR,滤波器,利用,MATLAB,工具箱,Signal,中的,fir1,函数,选择,Hamming,窗。,b=fir1(16,1500/8000*2);,FIR,数字滤波器系数为,b0,b16,系数对称。,将上述系数存盘,建立一个数据文件,(,如,fir01.txt,),。,第,8,章:,应用系统设计举例,FIR,数字滤波器,(2),建立,DSP,汇编程序的,FIR,滤波器系数文件。,上述系数必须转换成,Q15,格式,并放置在,DSP,汇编程序的,.inc,文件中,进行,FIR,滤波器的汇编程序的汇编、链接时,,inc,文件将被自动地加入到工程中去。,从,MATLAB,中产生的,fir01.txt,文件,通过执行转换命令,将自动变换为,firdata.inc,滤波器系数文件。,利用,MATLAB,中的转换命令:,!,firdat,fir01.txt,将产生,firdata.inc,文件。,第,8,章:,应用系统设计举例,FIR,数字滤波器,(3),产生滤波器输入信号的文件,一个产生输入信号的,C,语言程序。,这个信号是频率为,1000Hz,和,2500Hz,的正弦波合成的波形,文件名为,firinput.c,。,该程序将产生名为,firin.inc,的输入信号程序。,(4),编写应用,FIR,数字滤波器的汇编程序,一个,FIR,滤波器源程序,fir.asm,对应以上,FIR,滤波器的汇编程序的链接文件,fir.cmd,。,第,8,章:,应用系统设计举例,快速傅里叶变换,(FFT),8.4,快速傅里叶变换,(FFT),FFT:,是一种高效实现离散傅氏变换的算法。,FFT:,一个非常重要的工具经常使用,甚至成为,DSP,运,算能力的一个考核因素。,主要内容:,1,基,2,按时间抽取,FFT,算法,2 FFT,算法的,DSP,实现,3 FFT,算法的模拟信号产生和输入,第,8,章:,应用系统设计举例,快速傅里叶变换,(FFT),8.4.1,基,2,按时间抽取,FFT,算法,8,点基,2 FFT,流图与蝶形运算,第,8,章:,应用系统设计举例,快速傅里叶变换,(FFT),第,8,章:,应用系统设计举例,快速傅里叶变换,(FFT),8.4.2 FFT,算法的,DSP,实现,一般假定输入序列是复数。,当输入是实数时,利用对称性质计算,DFT,。,原始的,2,N,个点的实输入序列组合成一个,N,点的复序列,;,之后对复序列进行,N,点的,FFT,运算,;,最后再由,N,点的复数输出拆散成,2,N,点的复数序列。这,2,N,点的复数序列与原始的,2,N,点的实数输入序列的,DFT,输出一致。,使用这种方法,在组合输入和拆散输出的操作中,,FFT,运算量减半。,下面用这种方法来实现一个,256,点实数,FFT(2,N,=256),运算。,第,8,章:,应用系统设计举例,快速傅里叶变换,(FFT),1.,实数,FFT,运算序列的存储分配,程序代码安排在,0x3000,开始的存储器中,其中,0x3000,0x3080,存放中断向量表;,FFT,程序使用的正弦表、余弦表数据,(.data,段,),安排在,0xc00,开始的地方;,变量,(.,bss,段定义,),存放在,0x80,开始的地址中。,256,点实数,FFT,程序的输入数据缓冲为,0x2300,0x23ff,;,图,8.1,FFT,变换后功率谱的计算结果存放在,0x2200,0x22ff,中。,连接定位,.,cmd,文件确定。,第,8,章:,应用系统设计举例,快速傅里叶变换,(FFT),2.,基,2,实数,FFT,运算的算法(四步),1),输入数据的组合和位倒序,组合:,首先,原始输入的,2,N,= 256,个点的实数序列,an,,当成,N,= 128,点的复数序列,dn,,,dn,表示复合,FFT,的输入。,dn,=,rn+j,in,rn,a2n,表示实部;,in,a2n,1,表示虚部。,位倒序:,按位倒序的方式存储,dn,到数据处理缓冲中,是为了在整个运算最后的输出中得到的序列是自然顺序。,使用位倒序寻址方式可以大大提高程序执行的速度和使用存储器的效率。图,8.12,第,8,章:,应用系统设计举例,快速傅里叶变换,(FFT),2),N,点复数,FFT,运算,旋转因子分为正弦和余弦部分,用,Q15,格式将它们存储在两个分离的表中。每个表中有,128,项,对应从,0,180,。,把,128,点的复数,FFT,分为七级来算,第一级是计算,2,点的,FFT,蝶形结,第二级是计算,4,点的,FFT,蝶形结,然后是,8,点、,16,点、,、,128,点的蝶形结计算。最后所得的结果表示为,第,8,章:,应用系统设计举例,快速傅里叶变换,(FFT),3),分离复数,FFT,的输出为奇部分和偶部分,分离,FFT,输出为相关的四个序列:偶实数,RPk,、奇实数,RMk,、偶虚数,IPk,和奇虚数,IMk,,以便第四步形成最终结果。,RPk,=RPN-k=0.5*(,Rk+RN-k,),RMk,=-RMN-k=0.5*(,Rk-RN-k,),IPk,=IPN-k=0.5*(,Ik+IN-k,),IMk,=-IMN-k=0.5*(,Ik-IN-k,),RP0=R0,IP0=I0,RM0=IM0=RMN/2=IMN/2=0,RPN/2=RN/2,IPN/2=IN/2,图,8.14,第,8,章:,应用系统设计举例,快速傅里叶变换,(FFT),4),产生最后的,N,=256,点的复数,FFT,结果, 通过下面的公式由,RPk,、,RMn,、,IPn,和,IMn,四个序列可以计算出,an,的,DFT,。,Ak,=A2N-k=,ARk+j,AIk,=,Fa(n,),即是,an,的,DFT,结果, 实数,FFT,输出按照实数,/,虚数的自然顺序填满整个,4,N,=512,个字节的数据处理缓冲器。如图,8.15,所示。, 计算所求信号的功率,由于最后所得的,FFT,数据是一个复数,通常对所得的,FFT,数据进行处理,取其实部和虚部的平方和即求得该信号的功率。,第,8,章:,应用系统设计举例,快速傅里叶变换,(FFT),8.4.3 FFT,算法的模拟信号产生和输入,在,CCS,集成开发环境下利用,Simulator,进行,FFT,的调试并观察运行结果时,需要输入一个模拟信号,该信号有两种方法产生:,第一种方法:,是用,C,语言程序产生,FFTdata.inc,文件,然后,在,DSP,汇编语言程序中通过,.copy,汇编命令将数据文件,FFTdata.inc,复制到汇编程序中去。,第二种方法:,先建立与信号对应的数据流文件,FFTdata.dat,,然后,输入数据通过,CCS,开发环境下的,FileI,/O,功能完成待处理的数据的输入。,第,8,章:,应用系统设计举例,快速傅里叶变换,(FFT),8.4.4,观察信号时域波形及其频谱,第,8,章:,应用系统设计举例,语音信号采集,8.5,语音信号采集,8.5.1,语音接口芯片,TLC320AD50C,简介,TLC320AD50C,是,TI,公司生产的音频接口芯片,集成了,16,位,A/D,和,D/A,转换器,可工作在主、从两种方式,由上电时,M/S,管脚的电平决定。在与,DSP,的,McBSP,连接时,一般,TLC320AD50C,配置为主方式,而,McBSP,为从方式。,支持主通信和辅助通信两种通信模式,主通信用于正常的,ADC,或,DAC,的数据传输,辅助通信用于控制寄存器的读写。辅助通信模式可由硬件和软件两种方式触发。,工作方式通过对其内部,7,个控制寄存器的设置来进行控制。其中寄存器,0,是无操作寄存器。寄存器,5,和,6,保留用于工厂测试,故只有,4,个寄存器可用。表,8-1,表,8-4,第,8,章:,应用系统设计举例,语音信号采集,8.5.2 TLC320AD50C,与,DSP,的连接,在实际应用中,一般将,TLC320AD50C,接至,DSP,的同步串行口,并将,TLC320AD50C,设置在主动工作方式,即由,TLC320AD50C,提供帧同步信号和移位时钟。,第,8,章:,应用系统设计举例,语音信号采集,8.5.3,语音采集和回放程序,实现初始化,DSP,后,打开,McBSP,串口,;,初始化,AD50C,,然后使串口在,AD50C,的控制下接受数据。,主函数用,C,语言编写,(,参考,8.6,节,),,,其中,InitC5402(void),是初始化,DSP,,,OpenMcBSP(void,),是初始化串口和初始化,AD50C,,,READAD50(void),用来读取数据。,第,8,章:,应用系统设计举例,C,语言编程及应用,8.6 C,语言编程及应用,8.6.1 C,语言编程的基本方法,通常,DSP,应用程序需要用,C,语言和汇编语言的混合编程方法来实现。以达到最佳的利用,DSP,芯片软、硬件资源的目的。,用,C,语言和汇编语言混合编程方法主要有以下,3,种,:,(1),独立编写,C,程序和汇编程序,分开编译或汇编形成各自的目标代码模块,然后用链接器将,C,模块和汇编模块链接起来。,(2),直接在,C,程序的相应位置嵌入汇编语句。,(3),对,C,程序进行编译生成相应的汇编程序,然后对汇编程序进行手工优化和修改。,第,8,章:,应用系统设计举例,C,语言编程及应用,8.6.2,独立的,C,模块和汇编模块接口,在编写汇编程序和,C,程序时必须遵循有关的调用规则和寄存器规则。如果遵循了这些规则,那么,C,程序既可以调用汇编程序,也可以访问汇编程序中定义的变量。同样,汇编程序也可以调用,C,函数或访问,C,程序中定义的变量。,在编写独立的汇编程序时,必须注意以下几点:,(1),不论是用,C,语言编写的函数还是用汇编语言编写的函数,都必须遵循寄存器使用规则。,(2),必须保护函数要用到的几个特定寄存器。包括,AR1,、,AR6,、,AR7,和,SP,。,(3),中断程序必须保护所有用到的寄存器。,第,8,章:,应用系统设计举例,C,语言编程及应用,在编写独立的汇编程序时,必须注意以下几点,(,续,),(4),从汇编程序调用,C,函数时,第一个参数,(,最左边,),必须放入累加器,A,中,剩下的参数按自右向左的顺序压入堆栈。,(5),调用,C,函数时,注意,C,函数只保护了几个特定的寄存器,而其他寄存器,C,函数是可以自由使用的。,(6),长整型和浮点数在存储器中存放的顺序是低位字在高地址,高位字在低地址。,(7),如果函数有返回值,则返回值存放在累加器,A,中。,(8),汇编语言模块不能改变由,C,模块产生的,.,cinit,段,如果改变其内容将会引起不可预测的后果。,第,8,章:,应用系统设计举例,C,语言编程及应用,在编写独立的汇编程序时,必须注意以下几点,(,续,),(9),编译器在所有标识符,(,函数名、变量名等,),前加下划线“,_”,。,(10),任何在汇编程序中定义的对象或函数,如果需要在,C,程序中访问或调用,则必须用汇编指令,.global,定义。同样,如果在,C,程序中定义的对象或函数需要在汇编程序中访问或调用,在汇编程序中也必须用,.global,指令定义。,(11),编译模式,CPL,指示采用何种指针寻址,如果,CPL=1,,则采用堆栈指针,SP,寻址;如果,CPL=0,,则选择页指针,DP,进行寻址。,第,8,章:,应用系统设计举例,C,语言编程及应用,8.6.3 C,语言编程应用,用,C,语言编程只需将,rtb.Lib,添加到工程中,,CCS5000,会自动完成相关操作。,以下程序为,FFT,算法的实现,,利用,INT2,获得输入信号,,数组,x,是来自,A/D,采样的数据,长度,128,,为,32,位浮点数,,数组,mo,是,FFT,输出。,
展开阅读全文