利用DSP实现自适应滤波_第1页
利用DSP实现自适应滤波_第2页
利用DSP实现自适应滤波_第3页
利用DSP实现自适应滤波_第4页
利用DSP实现自适应滤波_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

DSP课程设计设计报告设计题目:利用DSP实现自适应滤波2013年7月12日目录设计任务要求………1理论分析…………TMS320C55x概况………自适应滤波器原理……………………自适应滤波器结构……………………LMS算法与RLS算法…………………自适应滤波器的应用…………………设计思路……………程序分析……………左右分声道滤波………LMS自适应算法………调试过程与实现效果………………调试过程………………实现效果………………总结…………………完成情况………遇到的困难……………………体会与感悟……………………参考文献……………附:原始程序清单 设计任务要求本课程设计的目的是通过利用DSP实现信号自适应滤波这一过程,是自己更加透彻的理解信号的采集方法和滤波方法,学会调用DSPLIB库中的LMS函数,进行自适应滤波。同时通过对DSP信号处理器及A/D、D/A转换器以及DMA的编程,提高自身的C语言编程能力和使用DSP硬件平台实现数字信号处理算法的能力。本设计分为基本部分和发挥部分。基本部分:(1)设计数字滤波算法或调用DSPLIB中函数,实现对信号的滤波;(2) 利用C语言对A/D、D/A进行初始化;(3) 利用C语言对DMA进行初始化;(4) 编写DMA终端服务程序,实现对信号的实时滤波;(5) 利用CCS信号分析工具分析信号的频谱成分,确定滤波器的参数。发挥部分:(1)比较不同自适应滤波器的滤波效果;(2)在实验板的Linein输入端接入正弦信号,分左右声道分别采集并滤波。理论分析TMS320C55x概况C55xDSP芯片是C5000系列的新一代产品,与C54x的源代码兼容。与C54x相比,C55x处理速度明显提高,功耗明显降低。如300MHz的C55x与120MHz的C54x相比,C55x的处理速度比C54x提高了5倍,功耗只有C54x的1/6。与C54x相比,C55x的结构上复杂得多,采用了近似'双CPU结构'C55x具有2个MAC单元、4个40为累加器,能够在单周期内作2个17位X17位的乘法运算。C55x具有12组独立总线,即1组程序读总线,1组程序地址总线,3组数据读总线,2组数据写总线,5组数据地址总线,其指令单位每次可从存储器中读取32为程序代码(C54x只能读取16位)。C55x含有指令高速存储器(Cache),以减少对外部存贮器的访问,改善了数据吞吐量并降低了功耗。C55x采用了1~6字节的可改变字节宽度指令(C54x的指令长度为固定的16位),从而提高了代码的密度。自适应滤波器原理常规滤波器具有固定的滤波特性,对于输入信号滤波器根据这个特性产生相应的输出。但是在实际应用往往不是这样,即对滤波器输出的要求是明确的,而滤波器特性是无法预先知道的。例如电话系统,回波相消器的理想输出是无回波信号,这个要求是明确的,而系统本身却不能一开始就确定下来,因为它取决于电话系统话路传输条件的变化,像这样的应用需求就需要通过自适应滤波技术来解决。下图是自适应滤波器的结构框图。其中想x(n)为滤波器的输入信号,wi(n)为滤波

器的权值系数,d(n)为滤波器的期望信号,e(n)为滤波器的估计误差信号。1=0,1…,L-1,L为滤波器的阶数。d(n)e(n)d(n).I>x(n)W(z)y(n)自适应

算法x(n)W(z)y(n)自适应

算法自适应滤波器的目的是,以迭代方式逐步调整滤波器系数W1(n),使误差信号e(n)的能量(或幅度)不断减少。定义滤波器的输入信号向量为:x(n)=[x(n),x(n—l),x(n)=[x(n),x(n—l),…,x(n—L+1)]T滤波器系数矢量为:w(n)=[w0w(n)=[w0(n),W(n),…wL—1(n)]T其中上标T表示矩阵转置运算符,则滤波器输出为:y(n)=l=0或 y(n)=wT(n)x(n)=xT(n)w(n)误差信号为:e(n)=d(n)—y(n)=d(n)—wT(n)x(n)定义性能函数为:g=e2(n)可以得到滤波器系数更新公式:w(n+l)=w(n)+pe(n)x(n)其中,M为收敛因子。自适应滤波器结构自适应滤波器的结构可以是IIR型结构,也可以是FIR型结构。但在实际用中,一般都是采用FIR型,其主要原因是FIR结构的自适应技术实现更容易,其权系数的修正就调节了滤波器的性能。同时还可以保证其稳定性,对于IIR滤波器,当自适应处理过程中,极点移出单位圆之外时,就会使滤波器产生不稳定。用FIR型结构作为自适应滤波器的结构,并不会影响它的应用范围,因为从以前的知识可知道,一个稳定的IIR滤波器总是可以用足够多阶的FIR滤波器来近似代替。一个自适应的FIR滤波器的结构,可以是横向结构,对称横向结构以及格形结构。横向型结构横向型结构是在大多数应用情况下所采用的最主要的自适应滤波器结构,如下图所示滤波器的输出y(n)表示为:y(n)=wt(n)X(n)=£w(n)x(n一i)ii=0其中X(n)=[x(n),x(n-l),•••x(n-x+l)]T为输入矢量,w(n)=[wo(n),wl(n),…,wn一1(n)]T是权系数矢量,T为转置符,N为时间序列,N为滤波器的阶数。由表达式可见,y(n)实际是两矢量的内积 既把x(n)与w(n)相卷的结果。对称横向型结构如果N阶FIR滤波器的单位脉冲响应h(n)为实数,且满足对称性的条件,即:h(n)=h(N-1-n)则称为对称横向性结构,如下图所示。在具有严格的线性特性的语音处理、波形传输系统、图象处理等方面得到广泛应用。这种关于中心点对称的FIR滤波器的输出y(n)可由下面的表达式给出y(n)=吩w(n)[x(n一i)+x(n一N+i+1)]it=0其中N为阶数,它一定是偶数。注意,对于定点处理器,上式的相加运算可能产生溢出。为此有时需要对归一化的输入数据在右移一位。2.3.3格形结构的自适应滤波器另一种迭代FIR滤波器结构是格形结构。格形结构的引出是用Durbin算法求解自适应滤波器的最佳权系数所导出来的。在使用LMS算法求解自适应滤波器最佳权系数时,可以发现,最佳权系数满足一个线性方程组,该方程组的系数矩阵具有toeplitz性质,即该矩阵为对称矩阵,且方阵的任一子方阵的对角线上的元是相等的。具有Toeplitz性质的线性方程可以按下列思路求解:先假设导出了只有N-1元的方程组的解,并由此推出N元方程组的解。这是一种递推算法,应用于最佳权系数估值,就形成了Durbin算法。这里不做详细推倒了,直接给出格式结构,下图所示:它是基于一系列预测误差滤波器的去相关传输结构。格形结构的误差预测器的递推公式如下:f(n)=f(n)-k(n)b(n-1)(me(0,M])m m-1 m m-1b(n)=b(n-1)-k(n)f(n)(me(0,M])m m-1 m m-1其中,fm(n)是前向预测误差,bm(n)是后向预测误差,km(是反射系数,m是阶数序列值,M是串联的总级数。格式结构的优点是按阶递归,故增加或减少级数不会影响存在的阶数设计。要用格形滤波器进行实际数据处理,首先要知道km(n),这些系数可以使用Durbin算法,由自相关系数的估值来算出,运算量很大。可以使用下列反射系数的递推方程来递推估计。k(n+1)=k(n)+u[f(n)b(n一1)b(n)f(n)]m m m m-1 m m-1

在诸如噪声消除器、信道均衡器、在线信号增强器等自适应滤波器的应用中,可以采用格形结构。这种格形抽头结构完成两类最佳估计:一类是格形误差预测器,输出分别为前向预测误差fm(n)和后向预测误差bm(n);另一类是多路回归滤波器,其特性用下列方程表示:e(n)=d(n)-b(n)g(n)000e(n)=e(n)-b(n)g(n)m m-1 m-1 m-1y(n)仝g(n)b(n)mm=0m从上面算法可以看出,格形抽头自适应滤波器的计算要复杂得多,但计算量的增加却带来很多好处。首先是收敛速度比横向结构来得快,同时稳定性更好。其次,系数量化精度的影响很小,对于的低位数要求也使舍入误差很小。另外,格式结构自适应滤波器还提供了误庆差预测值和反射系数最佳值,后者在作其他分析时有明显物理意义。正是这些优点,使格式结构得到广泛应用。2.4LMS算法与RLS算法LMS算法LMS算法是上世纪50到60年代通用电子公司在研制天线的过程中为抑制旁瓣而提出的。随后又发展出了归一化算法和加遗忘因子LMS算法。1977年,Makjoul提出了格型滤波器,法并由此发展出了LMS自适应格型滤波器算法。Herzberg等人提出了延时LMS(DLMS器,法2002年尚勇等人提出了并行延时LMS算法;此外还有附属LMS算法、数据块LMS算法LMS算法具有低计算复杂度、在平稳环境中收敛性好、均值无偏的收敛到维纳解等优点,使LMS算法成为应用最广的自适应算法。由于LMS算法广泛的应用,所以为了解决实际问题,基于基本LMS算法的新的LMS算法不断地被提出。本设计就是使用LMS算法来实现对信号的自适应滤波的。RLS算法尽管LMS算法的应用广泛,但是它也有缺点。当环境噪声不是平稳随机信号时,LMS算法很难自适应的跟踪统计特性变化的外部噪声干扰,因而其收敛效果一般。而基于RLS的自适应滤波算法克服了上述缺点,能在非平稳环境下取得较满意的滤波效果。RLS算法是在LMS算法的基础上而来的,所不同的是在求均方误差时观测数据的长度是变化的。且随着观测数据的时间先后顺序分别乘了加权因子。即RLS算法的均方误差变为:g(k)=丈p(k,n)(n)n=1式中:P(k,n)是加权因子,满足0<P(k,n)W1,n=1,2,…,k,也称作遗忘因子。这样会使多次迭代之前的信号被遗弃掉,当滤波器工作于非平稳环境时,观测数据仍可能服从统计变化的一些特性两种算法对比LMS算法只是用以前各时刻的抽头参量等作该时刻数据块评估时的平均误差均方最小的准则,而未用现时刻的抽头参量等来对以往各时刻的数据块作重新评估后的累计平方误差最小的准则,所以LMS算法对非平稳信号的适应性差。RLS算法的基本思想是力图使在每个时刻对所有已输入信号而言重估的平方误差的加权和最小,这使得RLS算法对非平稳信号的适应性要好。与LMS算法相比,RLS算法采取时间平均,因此,所得出的最优滤波器依赖于用于计算平均值的样本数,而LMS算法是基于集平均而设计的,因此稳定环境下LMS算法在不同计算条件下的结果是一致的。而无论从运算复杂度上还是从存储量方面,LMS算法都是非常高效的自适应算法。以算法复杂度为例,LMS算法只需要2L次乘法和加法运算,其复杂度比RLS算法小得多。而且LMS算法的另一个优点是它没有计算稳定性问题,而这是RLS算法无法回避的。因此综上LMS算法是目前使用最广泛的自适应算法,这一点在与定点DSP相关的工程实例中体现的十分突出。自适应滤波器的应用自适应预测下图中给出了自适应预测的系统结构。原始信号d(n)的延时x(n)是自适应滤波器的输入信号,y(n)为预测信号输出,e(n)为预测误差。自适应预测的最主要应用例子是语音信号的波形编码。为了提高信道容量,压缩编码技术是很重要的手段。自适应滤波器利用语音信号相邻采样值的相关性,可使预测的误差信号e(n)平均来讲比输入信号小得多,因而把误差信号量化并传输给接收端所需要的位数要少得多。这种波形编码就是自适应差分脉冲编码(ADPCM),它保证以32kbps的速率完成语音无失真传输。自适应均衡器下图中给出另一类应用系统一一自适应均衡器的框图。x(n)为接收信号加上信道噪声,它是所接收的信号通过信道滤波的结果。d(n)为检测码(传输模式)或伪随机码(训练模式).y(n)为均衡输出码,e(n)为码简串扰剩余,再加上噪声。自适应滤波器是自适应技术在电讯中很重要的应用,其目的是减小信道产生的幅度和相位失真。因为在数字传输系统中,每个数码的传送会因信道的影响,产生时域上展宽——即会造成接收信号中数码的交叠,形成码间干扰。自适应滤波器用来分离各个数码,减少码间串扰。在很多情况下,信道是时变的,或预先根本不可知的,此时使用自适应技术就尤为重要。自适应回波消除器在电话系统中,用户设备都是双向走线,从用户到中心局间的电话网采用双线分别携带进来的语音信号和出去的语音信号。这样做,可以使导线对与中心局终端混频线圈形成桥式平衡。但在实际应用中,桥式平衡很难完全满足,就使远距离谈话者的语音信号中的一部分以回波的形式返回到原端,影响话音信号的质量。尤其是在卫星通信这样的大型线路中,回波返回的延迟时间长达几百毫秒,对话音的影响和损害就非常严重。为此,可以在网络的两端安装自适应回波消除器,如图④所示。其中,X(n)为远端回波信号加上近端信号,y(n)为远端回波信号的估计,e(n)为近端信号和回波估计剩余。自适应回波消除器在长距离话音通讯、高性能电话会议系统以及卫星通信系统中已经成了必不可少的组成部分,并不断有新的应用出现。自适应噪声消除器自适应噪声消除器还可以用来构成自适应的噪声消除器,其结构如图⑤所示原始输入信号d(n)中的噪声估计,并把估计值y(n)与原始信道信号相减以达到噪声消除的结果。噪声消除器的应用十分广泛,例如心电图记录仪的干扰消除,语音信号的镇噪,飞机、汽车、船舱内大量噪声的抑制,天线旁瓣干扰的消除以及消除50HZ纹波等等。自适应滤波器的应用远远不止上面所讲的几种。这些只是在通信中几个最常见的应用。实际上,自适应技术的应用要广阔的多。像瞬间频率跟踪、外来干扰检测、声音多普勒提取在线系统识别、图象信号处理、生物医学信号处理、波束整形以及自适应控制等等。设计思路首先对DMA、A/D和D/A进行初始化。然后编写DMA通道传输程序,实现对外部信号的实时采集,外部模拟信号先进行A/D转换,利用MCBSP的接收寄存器接收数据。之后编写自适应滤波算法程序,或调用DSPLIB中的自适应函数,对信号进行自适应滤波。滤波后信号存放数据区满发出中断,请求信号输出。利用DMA方式传输输出数据,经D/A转换后输出。程序分析4.1左右分声道滤波下面是源程序中关于左右分声道滤波的代码段:left[i]=gBufferRcvPing[2*i];right[i]=gBufferRcvPing[2*i+1];gBufferXmtPing[2*i]=leftout[i];gBufferXmtPing[2*i+1]=right[i];其中gBufferRcvPing是存放所读入数据的数组,gBufferXmtPing是存放要输出数据的数组,left是左声道读入的数据,right是右声道读入的数据,leftout是左声道输出的数据,right是右声道输出的数据。通过咨询老师我们知道左/右声道的数据分别存放在gBufferRcvPing数组的双/单数地址。因此我们用前两句代码将左右声道的数据区分到两个数组,并在下面对两组数据分别进行处理。在处理完成后再将左右声道的输出数据按照同样的规律传输给gBufferXmtPing数组进行输出。这样就可以完成设计任务书中的‘分左右声道分别采集,并进行滤波'的要求。4.3LMS自适应算法下面是源程序中关于LMS自适应滤波算法的代码段:dlms(left,h1,leftout,des,delaybuff,step,16,128);dlms(right,h2,rightout,des,delaybuff1,step,16,128);这是对信号进行LMS算法自适应滤波的代码段,调用了DSPLIB库函数。函数格式为:dlms(DATA*x,DATA*h,DATA*r,DATA*des,DATA*dbuffer,DATAstep,ushortnh,ushortx)其中,x是长度为nx的输入向量,h是长度为nh的系数向量,r是长度为nx的输出数据向量,des是期望输出数组,dbuffer指向延时缓冲。函数是自适应延时LMSFIR滤波,步长step=2Xu,输入数据存储在dbuffer中,滤波输出结果存储在r中,该函数使用LMS指令完成滤波和修改系数。调试过程与实现效果本次调试过程大致可分为两部分,即对叠加了高频信号的正弦信号进行滤波和对叠加了高斯白噪声的信号进行滤波。下面将分别叙述调试过程和实现的效果。5.1对叠加了高频信号的正弦信号进行滤波首先利用Matlab生成一个750Hz的正弦信号,其中叠加了5000Hz的正弦信号。将计算机的音频输出端口连接到DSP系统的信号输入端口,计算机的音频输入端口连接到DSP系统的信号输出端口。然后用CCS打开编写好的工程,进行编译后开始运行工程。在计算机上播放叠加了5000Hz信号的750Hz正弦信号,并打开虚拟仪器,利用虚拟仪器和CCS的信号分析工具共同来观察波形。观察到波形如下:

本次滤波的步长step设置为150。1117--1117-727-364-0 7.11 14.2 21.3 28.4 35.6 42.7 49.8 56.9 64.0 71.1 78.2 85.3 92.4 99.6 107 114 121 1271818:1454-1091-本次滤波的步长step设置为150。1117--1117-727-364-0 7.11 14.2 21.3 28.4 35.6 42.7 49.8 56.9 64.0 71.1 78.2 85.3 92.4 99.6 107 114 121 1271818:1454-1091--364--1091--1454--1818.18621490-745--745--1490--1862.图(1)•第一次滤波前后信号时域波形(step=150)I图(2)•第一次滤波前后信号频域波形(step=150)图(1)中是由CCS观察到的经过滤波前后信号的时域波形。其中上方为滤波前信号,下方为经过滤波的信号。可见滤波前的信号中叠加了明显的高频分量,而滤波后信号高频分量大幅度较少,信号也比较平滑,较为接近原始信号。图(2)是通过虚拟仪器观察到滤波前后信号的频域波形,下方是滤波前信号的频域波形,下方是滤波后信号的频域波形。通过此图可以更加明显的看出滤波的效果。滤波前信号频谱有明显的两个谱峰,而经过滤波后高频的谱峰几乎全部被滤除,滤波效果明显。第二次将滤波的步长step调整为70,观察滤波效果并与step=150时作对比。

图(3)是第二次滤波前后信号的时域波形。可以看出滤波效果也比较明显,但是波形并不如第一次滤波平滑。这点在频域波形中体现的更明显,如图(4)所示。上方为经过滤波后信号的频谱,可见高频分量被明显的衰减,但是仍有较大的参与,这点也与时域图中观察到的结果相吻合。除了这两次滤波外,我还将step设置过从几十到几百的很多个数值,通过观察效果可以简单地下一个结论:step增大会使滤波的效果变好,但是step增大会影响滤波的稳定性,即step偏大时输出信号会产生震荡,滤波效果时好时坏;此外,当step过大或过小时,会出现无法收敛的可能,即毫无滤波效果。

5.2对叠加了高斯白噪声的信号进行滤波对叠加了高斯白噪声的信号进行滤波的过程与上一节类似。首先利用Matlab生成一个750Hz的正弦信号,其中叠加了高斯白噪声信号,信噪比为7dB。将计算机的音频输出端口连接到DSP系统的信号输入端口,计算机的音频输入端口连接到DSP系统的信号输出端口。然后用CCS打开编写好的工程,进行编译后开始运行工程。在计算机上播放叠加了噪声信号的750Hz正弦信号,并打开虚拟仪器,利用虚拟仪器和CCS的信号分析工具共同来观察波形。观察到波形如下:本次滤波的步长step设置为150。0 7.11 14.2 21.3 28.4 35.6 42.7 49.8 56.9 64.0 71.1 78.2 85.3 92.4 99.6 107 114 121 127图(6).第一次滤波前后信号频域波形(step=150)

图(5)中是对叠加了噪音的信号进行第一次滤波前后的信号时域波形。上方是叠加了噪声的输入信号,下方是滤波后的信号。可见通过滤波后,信号明显变得平滑和完整,十分接近原始750Hz的单正弦信号。图(6)是滤波前后信号的频域波形。可见下方的输入信号有较多的噪声分量,而上方滤波后信号带外噪声明显减少,这也与时域的波形相一致。第二次将滤波的步长step调整为70,观察滤波效果并与step=150时作对比。图(7).第二次滤波前后信号时域波形(step=70)图(8).第二次滤波前后信号频域波形(step=70)由以上两图可知,当step调整为70后,对滤波的效果并无太大的影响。但是此后我又将step设置为相差更大的值。这是得到的结论与对叠加了高频信号的正弦信号进行滤波时相类似,即step较大时滤波效果较好,step较小时滤波稳定性较好,但是当step过大或过小时会出现无法滤波的情况。说明一点,为了能在虚拟仪器上同时观察滤波前后的波形,做以上测试时我们只对左声道进行了滤波处理,而右声道是直接输出。将左右声道都进行滤波处理时,得到的效果与单一声道处理时完全一致。这也验证了设计任务书中‘左右声道分别采集信号,并进行滤波的附加设计要求的可行性。通过以上测试,可以初步认为这一自适应滤波系统可以满足设计要求。7参考文献赵洪亮.TMS320C55xDSP应用系统设计(第二版)•北京:北京航空航天大学出版社,2010.李利.DSP原理及应用(第二版).北京:中国水利水电出版社,2012.刘艳萍.DSP技术原理及应用教程(第三版).北京:北京航空航天大学出版社,2012.张卫宁.DSP原理与应用教程.北京:科学出版社,2008.王丽芳,陈益平.基于DSP的自适应滤波器的实现.北京:计算机仿真,2009(9).281-284.附:原始程序#include<stdio.h>#include<csl_mcbsp.h>#include<csl_dma.h>#include<csl_irq.h>// Globaldatadefinition/*Constantsforthebufferedping-pongtransfer*/#defineBUFFSIZE256#definePING0#definePONG1#definestep300#pragmaDATA_SECTION(gBufferXmtPing,"buffer_sect")Int16gBufferXmtPing[BUFFSIZE];//TransmitPINGbuffer#pragmaDATA_SECTION(gBufferXmtPong,"buffer_sect");Int16gBufferXmtPong[BUFFSIZE];//TransmitPONGbuffer#pragmaDATA_SECTION(gBufferRcvPing,"buffer_sect");Int16gBufferRcvPing[BUFFSIZE];//ReceivePINGbuffer#pragmaDATA_SECTION(gBufferRcvPong,"buffer_sect");Int16gBufferRcvPong[BUFFSIZE];//ReceivePONGbuffer#pragmaDATA_SECTION(left,"buffer_sect");Int16left[128];//#pragmaDATA_SECTION(right,"buffer_sect");Int16right[128];//#pragmaDATA_SECTION(h1,"buffer_sect");Int16h1[16];#pragmaDATA_SECTION(h2,"buffer_sect");Int16h2[16];#pragmaDATA_SECTION(des,"buffer_sect");Int16des[128]={0,3196,6270,9102,11585,13623,15137,16069,16384,16069,15137,13623,11585,9102,6270,3196,0,-3196,-6270,-9102,-11585,-13623,-15137,-16069,-16384,-16069,-15137,-13623,-11585,-9102,-6270,-3196,0,3196,6270,9102,11585,13623,15137,16069,16384,16069,15137,13623,11585,9102,6270,3196,0,-3196,-6270,-9102,-11585,-13623,-15137,-16069,-16384,-16069,-15137,-13623,-11585,-9102,-6270,-3196,0,3196,6270,9102,11585,13623,15137,16069,16384,16069,15137,13623,11585,9102,6270,3196,0,-3196,-6270,-9102,-11585,-13623,-15137,-16069,-16384,-16069,-15137,-13623,-11585,-9102,-6270,-3196,0,3196,6270,9102,11585,13623,15137,16069,16384,16069,15137,13623,11585,9102,6270,3196,0,-3196,-6270,-9102,-11585,-13623,-15137,-16069,-16384,-16069,-15137,-13623,-11585,-9102,-6270,-3196,};#pragmaDATA_SECTION(leftout,"buffer_sect");Int16leftout[128];

#pragmaDATA_SECTION(rightout,"buffer_sect");Int16rightout[128];#pragmaDATA_SECTION(delaybuff,"buffer_sect");Int16delaybuff[18];#pragmaDATA_SECTION(delaybuff,"buffer_sect");Int16delaybuff[18];#pragmaDATA_SECTION(flag,"buffer_sect");shortflag[14];#pragmaDATA_SECTION(delaybuff1,"buffer_sect");Int16delaybuff1[18];/* MCBSP_ConfigMcbsp1Config={//DLB//DLB=0//RJUST=0,rightjustifythedataandzerofill////FREE =0//SOFT =0//FRST=1;Enabletheframe-synclogic//GRST=1;Thesamplerategeneratoristake//XINTM=0//XSYNCER=0//XEMPTY=0//XRDY=0//XRST=0DisabletransimitterMCBSP_SPCR1_CLKSTP_DISABLE,MCBSP_SPCR1_DXENA_ON,0,MCBSP_SPCR1_RINTM_RRDY,MCBSP_SPCR1_RSYNCERR_NO,//MCBSP_SPCR1_RFULL_NO,//MCBSP_SPCR1_RRDY_NO,MCBSP_SPCR1_RRST_DISABLE),MCBSP_SPCR2_RMK(MCBSP_SPCR2_FREE_NO,MCBSP_SPCR2_SOFT_NO,MCBSP_SPCR2_FRST_FSG,MCBSP_SPCR2_GRST_CLKG,outofitsresetstateMCBSP_SPCR2_XINTM_XRDY,MCBSP_SPCR2_XSYNCERR_NO,//MCBSP_SPCR2_XEMPTY_NO,//MCBSP_SPCR2_XRDY_NO,MCBSP_SPCR2_XRST_DISABLE//CLKSTP=0//DXENA=1,DXdelayenableron//Reserved=0//RINTM=0//RSYNCER=0//RFULL=0//RRDY=0//RRST=0;DisablereceiverMCBSP_RCR1_RFRLEN1_OF(1),MCBSP_RCR1_RFRLEN1_OF(1),MCBSP_RCR1_RWDLEN1_16BIT),MCBSP_RCR2_RMK(MCBSP_RCR2_RPHASE_SINGLE,MCBSP_RCR2_RFRLEN2_OF(0),MCBSP_RCR2_RWDLEN2_8BIT,MCBSP_RCR2_RCOMPAND_MSB,receivedfirstMCBSP_RCR2_RFIG_YES,MCBSP_RCR2_RDATDLY_1BIT),MCBSP_XCR1_RMK(MCBSP_XCR1_XFRLEN1_OF(1),),//单数据相,接受数据长度为16位,每相2个数据MCBSP_RCR1_RMK(//RFRLEN1=1//RWDLEN1=2//RPHASE=0//RFRLEN2=0//RWDLEN2=0//RCOMPAND=0Nocompanding,anysizedata,MSB//RFIG=1Frame-syncignore//RDATDLY=11-bitdatadelay//XFRLEN1=1XWDLEN1//IDLEEN//XIOEN//RIOEN//FSXM//XPHASE

XFRLEN2//XWDLEN2XWDLEN1//IDLEEN//XIOEN//RIOEN//FSXM//XPHASE

XFRLEN2//XWDLEN2//XCOMPAND//XFIG=//XDATDLY=//////FSRM//CLKRis//CLKXisinput//SCLKME=0CLKGistakenfromtheMcBSPinternalinput//ThesignalontheCLKSpinislow//DrivethesignalontheDXpinlow//Thesignal//FSXPontheDRpinislow1BecauseafallingedgeonLRCIN//FSRP//CLKXP=1=1//CLKRPMCBSP_XCR1_XWDLEN1_16BIT),MCBSP_XCR2_RMK(MCBSP_XCR2_XPHASE_SINGLE,MCBSP_XCR2_XFRLEN2_OF(0),MCBSP_XCR2_XWDLEN2_8BIT,MCBSP_XCR2_XCOMPAND_MSB,MCBSP_XCR2_XFIG_YES,MCBSP_XCR2_XDATDLY_1BIT),MCBSP_SRGR1_DEFAULT,MCBSP_SRGR2_DEFAULT,MCBSP_MCR1_DEFAULT,MCBSP_MCR2_DEFAULT,MCBSP_PCR_RMK(//MCBSP_PCR_IDLEEN_RESET,MCBSP_PCR_XIOEN_SP,MCBSP_PCR_RIOEN_SP,MCBSP_PCR_FSXM_EXTERNAL,AIC23BMCBSP_PCR_FSRM_EXTERNAL,AIC23BMCBSP_PCR_CLKXM_INPUT,MCBSP_PCR_CLKRM_INPUT,MCBSP_PCR_SCLKME_NO,inputclock//MCBSP_PCR_CLKSSTAT_0,MCBSP_PCR_DXSTAT_0,//MCBSP_PCR_DRSTAT_0,MCBSP_PCR_FSXP_ACTIVEHIGH,orLRCOUTstartsdatatransferMCBSP_PCR_FSRP_ACTIVELOW,MCBSP_PCR_CLKXP_FALLING,datatransferMCBSP_PCR_CLKRP_RISING),MCBSP_RCERA_DEFAULT,MCBSP_RCERB_DEFAULT,MCBSP_RCERC_DEFAULT,MCBSP_RCERD_DEFAULT,MCBSP_RCERE_DEFAULT,MCBSP_RCERF_DEFAULT,MCBSP_RCERG_DEFAULT,MCBSP_RCERH_DEFAULT,MCBSP_XCERA_DEFAULT,MCBSP_XCERB_DEFAULT,MCBSP_XCERC_DEFAULT,MCBSP_XCERD_DEFAULT,MCBSP_XCERE_DEFAULT,MCBSP_XCERF_DEFAULT,MCBSP_XCERG_DEFAULT,MCBSP_XCERH_DEFAULT};00=0=01UnexpectedFrame-syncignore11-bitdatadelay=0=0=00Tranmitframe-synisprovidedby=0Receiveframe-synisprovidedbyThefallingedgeofBCLKstartsDMA_ConfigdmaRcvConfig={DMA_DMACSDP_RMK(DMA_DMACSDP_DSTBEN_NOBURST,DMA_DMACSDP_DSTPACK_OFF,DMA_DMACSDP_DST_DARAMPORT1,DMA_DMACSDP_SRCBEN_NOBURST,DMA_DMACSDP_SRCPACK_OFF,DMA_DMACSDP_SRC_PERIPH,DMA_DMACSDP_DATATYPE_16BIT),DMA_DMACCR_RMK(DMA_DMACCR_DSTAMODE_POSTINC,DMA_DMACCR_SRCAMODE_CONST,DMA_DMACCR_ENDPROG_OFF,DMA_DMACCR_WP_DEFAULT,DMA_DMACCR_REPEAT_OFF,DMA_DMACCR_AUTOINIT_ON,DMA_DMACCR_EN_STOP,DMA_DMACCR_PRIO_LOW,DMA_DMACCR_FS_DISABLE,DMA_DMACCR_SYNC_REVT1),DMA_DMACICR_RMK(DMA_DMACICR_AERRIE_ON,DMA_DMACICR_BLOCKIE_OFF,DMA_DMACICR_LASTIE_OFF,DMA_DMACICR_FRAMEIE_ON,DMA_DMACICR_FIRSTHALFIE_OFF,DMA_DMACICR_DROPIE_OFF,DMA_DMACICR_TIMEOUTIE_OFF),(DMA_AdrPtr)(MCBSP_ADDR(DRR11)),0,NULL,0,BUFFSIZE,1,0,0};DMA_ConfigdmaXmtConfig={DMA_DMACSDP_RMK(DMA_DMACSDP_DSTBEN_NOBURST,DMA_DMACSDP_DSTPACK_OFF,DMA_DMACSDP_DST_PERIPH,DMA_DMACSDP_SRCBEN_NOBURST,DMA_DMACSDP_SRCPACK_OFF,DMA_DMACSDP_SRC_DARAMPORT0,DMA_DMACSDP_DATATYPE_16BIT),DMA_DMACCR_RMK(DMA_DMACCR_DSTAMODE_CONST,/*DMACSDP*//*ENDPROGOFF*//*AUTOINITON*//*DMACCR*//*DMACICR*//*DMACSSAL*//*DMACSSAU*//*DMACDSAL,tobeloadedbysubmit*//*DMACDSAU*//*DMACEN*//*DMACFN*//*DMACFI*//*DMACEI*//*DMACSDP*/DMA_DMACCR_SRCAMODE_POSTINC,DMA_DMACCR_ENDPROG_ON,DMA_DMACCR_WP_DEFAULT,DMA_DMACCR_REPEAT_OFF,DMA_DMACCR_AUTOINIT_OFF,DMA_DMACCR_EN_STOP,DMA_DMACCR_PRIO_LOW,DMA_DMACCR_FS_DISABLE,DMA_DMACCR_SYNC_XEVT1),/*DMACCR*/DMA_DMACICR_RMK(DMA_DMACICR_AERRIE_ON,DMA_DMACICR_BLOCKIE_OFF,DMA_DMACICR_LASTIE_OFF,DMA_DMACICR_FRAMEIE_ON,DMA_DMACICR_FIRSTHALFIE_OFF,DMA_DMACICR_DROPIE_OFF,DMA_DMACICR_TIMEOUTIE_OFF),/*DMACICR*/NULL,/*DMACDSAL,tobeloadedbysubmit*/0,/*DMACSSAU*/(DMA_AdrPtr)(MCBSP_ADDR(DXR11)),/*DMACDSAL*/0,/*DMACDSAU*/BUFFSIZE,/*DMACEN*/1,/*DMACFN*/0,/*DMACFI*/0};/*DMACEI*/};/*DefineaDMA_HandleobjecttobeusedwithDMA_openfunction*/DMA_HandlehDmaRcv,hDmaXmt;/*DefineaMCBSP_HandleobjecttobeusedwithMCBSP_openfunction*/MCBSP_HandlehMcbsp;volatileUint16transferComplete=FALSE;Uint16err=0;Uint16old_intm;Uint16xmtEventId,rcvEventId;// Functionprototypes externvoidVECSTART(void);interruptvoiddmaXmtIsr(void);interruptvoiddmaRcvIsr(void);voidtaskFxn(void);/*copyData()-Copyonebufferwithlengthelementstoanother.*/voidcopyData(Int16*inbuf,Int16*outbuf,Int16length){Int16i=0;for(i=0;i<length;i++){outbuf[i]=inbuf[i];}}/* Threads */voidprocessBuffer(void){Uint32addr;Int16i=0;staticInt16pingPong=PING;while(DMA_FGETH(hDmaRcv,DMACCR,ENDPROG)){J}//Determinewhichping-pongstatewe'reinif(pingPong==PING){//Configurethereceivechannelforponginputdataaddr=((Uint32)gBufferRcvPong)<<1;DMA_RSETH(hDmaRcv,DMACDSAL,addr&0xffff);DMA_RSETH(hDmaRcv,DMACDSAU,(addr>>16)&0xffff);//SetnewstatetoPONGpingPong=PONG;}else{//Configurethereceivechannelforpinginputdataaddr=((Uint32)gBufferRcvPing)<<1;DMA_RSETH(hDmaRcv,DMACDSAL,addr&0xffff);DMA_RSETH(hDmaRcv,DMACDSAU,(addr>>16)&0xffff);//SetnewstatetoPINGpingPong=PING;}DMA_FSETH(hDmaRcv,DMACCR,ENDPROG,1);//DMA_FSETH(hDmaXmt,DMACCR,ENDPROG,1);if(pingPong==PONG){//Insertyourapplicationprogramhere//copyData(gBufferRcvPing,gBufferXmtPing,BUFFSIZE);for(i=0;i<128;i++){left[i]=gBufferRcvPing[2*i];right[i]=gBufferRcvPing[2*i+1];}dlms(left,h1,leftout,des,delaybuff,step,16,128);dlms(right,h2,rightout,des,delaybuff1,step,16,128);for(i=0;i<128;i++){gBufferXmtPing[2*i]=leftout[i];gBufferXmtPing[2*i+1]=right[i];}//Configurethetransmitchannelforpingoutputdataaddr=((Uint32)gBufferXmtPing)<<1;DMA_RSETH(hDmaXmt,DMACSSAL,addr&0xffff);DMA_RSETH(hDmaXmt,DMACSSAU,(addr>>16)&0xffff);}else{//Insertyourapplicationprogramhere//copyData(gBufferRcvPong,gBufferXmtPong,BUFFSIZE);for(i=0;i<128;i++){left[i]=gBufferRcvPong[2*i];right[i]=gBufferRcvPong[2*i+1];}dlms(left,h1,leftout,des,delaybuff,step,16,128);dlms(right,h2,rightout,des,delaybuff1,step,16,128);for(i=0;i<128;i++){gBufferXmtPong[2*i]=leftout[i];gBufferXmtPong[2*i+1]=right[i];}//Configurethetransmitchannelforpongoutputdataaddr=((Uint32)gBufferXmtPong)<<1;DMA_RSETH(hDmaXmt,DMACSSAL,addr&0xffff);DMA_RSETH(hDmaXmt,DMACSSAU,(addr>>16)&0xffff);}//StarttheDMA//DMA_start(hDmaRcv);//DMA_start(hDmaXmt);}// mainroutine voidmain(void){Uint16i;/*InitializeCSLlibrary-ThisisREQUIRED!!!*/CSL_init();//Themainfrequencyofsystemis240MHz//该频率是为了设置IIC模块的需要设置的,为了使用I2C_setup函数PLL_setFreq(l,0xC,0,1,3,3,0);//EMIF初始化Emif_Config();//OpenMcBSPport1andgetaMcBSPtypehandlehMcbsp=MCBSP_open(MCBSP_PORT1,MCBSP_OPEN_RESET);//ConfigMcBSPport1byusepreviouslydefinedstructureMCBSP_config(hMcbsp,&Mcbsp1Config);//I2C初始化I2C_cofig();//CODEC寄存器初始化inti_AIC();/*SetIVPH/IVPDtostartofinterruptvectortable*/IRQ_setVecs((Uint32)(&VECSTART));for(i=0;i<=BUFFSIZE-1;i++){gBufferXmtPing[i]= 0;gBufferXmtPong[i]=0;}for(i=0;i<16;i++){h1[i]=0;h2[i]=0;}/*Callfunctiontoeffecttransfer*/taskFxn();}voidtaskFxn(void){Uint16srcAddrHi,srcAddrLo;Uint16dstAddrHi,dstAddrLo;/*Bydefault,theTMS320C55xxcompilerassignsalldatasymbolsword*//*addresses.TheDMAhowever,expectsalladdressestobebyte*//*addresses.Therefore,wemustshifttheaddressby2inorderto*//*changethewordaddresstoabyteaddressfortheDMAtransfer.*/srcAddrHi=(Uint16)(((Uint32)(MCBSP_ADDR(DRR11)))>>15)&0xFFFFu;srcAddrLo=(Uint16)(((Uint32)(MCBSP_ADDR(DRR11)))<<1)&0xFFFFu;dstAddrHi=(Uint16)(((Uint32)(&gBufferRcvPing))>>15)&0xFFFFu;dstAddrLo=(Uint16)(((Uint32)(&gBufferRcvPing))<<1)&0xFFFFu;dmaRcvConfig.dmacssal=(DMA_AdrPtr)srcAddrLo;dmaRcvConfig.dmacssau=srcAddrHi;dmaRcvConfig.dmacdsal=(DMA_AdrPtr)dstAddrLo;dmaRcvConfig.dmacdsau=dstAddrHi;srcAddrHi=(Uint16)(((Uint32)(&gBufferXmtPing))>>15)&0xFFFFu;srcAddrLo=(Uint16)(((Uint32)(&gBufferXmtPing))<<1)&0xFFFFu;dstAddrHi=(Uint16)(((Uint32)(MCBSP_ADDR(DXR11)))>>15)&0xFFFFu;dstAddrLo=(Uint16)(((Uint32)(MCBSP_ADDR(DXR11)))<<1)&0xFFFFu;dmaXmtConf

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论