DSP课程实验报告——利用DSP实现实时信号谱分析学院:电子信息工程学院指导老师:高海林学生:目录1、设计任务书............................................32、设计内容..............................................33、设计方案..............................................43、1整体思路.........................................43.2信号的实时采集与传输.............................43.3FFT算法........................................53.4“ping-pong”存储方式...........................84、实验步骤............................................95、实验结果及分析.......................................106、实验中遇到的问题及解决方法.........................137、实验感想.............................................131、设计任务书在信息处理中,可以对信号进行时域分析,也可以对信号进行变换域分析,在频域对信号进行频谱分析是最常见的分析之一。利用DSP可以实时地对信号进行频谱分析—快速傅立叶变换(FFT)。本设计要求利用DSP的DMA方式进行信号采集和信号输出,同时对外部输入的信号进行频谱分析。基本部分:(1)设计谱分析算法,或调用DSPLIB中FFT函数,实现对信号的频谱分析。(2)在DMA中断服务程序中,实现信号的实时谱分析(3)利用CCS信号分析工具分析信号的频谱成分,对FFT算法结果进行验证。发挥部分:(1)信号频谱数据实时输出到Headphone输出接口,并在示波器上进行显示;(2)在实验板的Linein输入端接入正弦信号,分左右声道分别采集,并分别进行频谱分析;(3)利用CCS的Profiler工具计算FFT算法所需要的时间,并根据实时性要求进行必要的算法优化。2、设计内容(1)掌握CCS的安装、设置,工程的建立、工程设置、编译运行和调试方法(2)编写C语言程序实现设计要求,并在CCS集成开发环境下调试通过,实现设计所要求的各项功能。(3)按要求撰写课程设计报告。3、设计方案3、1整体思路首先利用DSP的DMA方式对外部信号进行实时采集,外部模拟信号先进行A/D转换,利用MCBSP的接收寄存器接收数据,并将数据存放到DSP存储区中。设计FFT算法或调用DSPLIB中的rfft或cfft频谱分析函数,对信号进行快速傅立叶变换。频谱数据利用DMA方式送到D/A转换器转换为模拟信号在示波器上显示。3.2信号的实时采集与传输DMA控制器可以在不影响CPU的情况下完成数据的传输,因此数据传输速度快,在要求信号实时采集和处理的系统中常采用DMA方式进行信号传输。本设计中输入信号经过A/D转换成数字信号后,将DMA通道4的源地址设为串口的接收寄存器,利用DMA通道4进行传输;而将DMA通道5的目的地址设置为串口的发送寄存器,将信号频谱利用DMA5通道进行传输,此步骤需要对AIC23、McBSP、DMA通道4和DMA通道5进行初始化配置。处理流图如图3.2.1所示。上电复位A/D和D/A初始化DMA2通道初始化DMA方式接收A/D数据等待DMA2接收中断DMA3通道初始化序列倒序序列FFT信号经D/A输出主程序中断服务程序图3.2.1信号实时采集和频谱分析流程图3.3FFT算法FFT(FastFourierTransformation),即为快速傅氏变换,是离散傅氏变换(DFT)的快速算法,它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。(1)离散傅里叶变换DFTN点DFT的正变换公式为:式中,WN=e-j*2π/N,称为旋转因子或蝶形因子。从DFT的定义可以看出,在x(n)为复数序列的情况下,对某个k值,直接按(1)式计算X(k)只需要N次复数乘法和(N-1)次复数加法。因此,对所有N个k值,共需要N2次复数乘法和N(N-1)次复数加法。对于一些相当大有N值(如1024点)来说,直接计算它的DFT所需要的计算量是很大的,因此DFT运算的应用受到了很大的限制。(2)快速傅里叶变换FFT旋转因子WN有如下的特性:对称性:WNk+N/2=-WNk周期性:WNn(N-k)=WNk(N-n)=WN-nk利用这些特性,既可以使DFT中有些项合并,减少了乘法积项,又可以将长序列的DFT分解成几个短序列的DFT。FFT就是利用了旋转因子的对称性和周期性来减少运算量的。一般而言,FFT算法分为按时间抽取的FFT(DITFFT)和按频率抽取的FFT(DIFFFT)两大类。DIFFFT算法是在时域内将每一级输入序列依次按奇/偶分成2个短序列进行计算。而DIFFFT算法是在频域内将每一级输入序列依次奇/偶分成2个短序列进行计算。两者的区别是旋转因子出现的位置不同,得算法是一样的。在DIFFFT算法中,旋转因子出现在输入端,而在DIFFFT算法中它出现在输入端。假定序列x(n)的点数N是2的幂,按照DIFFFT算法可将其分为偶序列和奇序列。偶序列:x(2r)=x1(r)奇序列:x(2r+1)=x2(r)其中:r=0,1,2,„,N/2-1则x(n)的DFT表示为:式中,x1(k)和x2(k)分别为x1(r)和x2(r)的N/2的DFT。由于对称性,WNk+N/2=-WNk。因此,N点DFT可分为两部分:前半部分:x(k)=x1(k)+WkNx2(k)(1)后半部分:x(N/2+k)=x1(k)-WkNx2(k)k=0,„,N/2-1(2)从式(1)和式(2)可以看出,只要求出0~N/2-1区间x1(k)和x2(k)的值,就可求出0~N-1区间x(k)的N点值。以同样的方式进行抽取,可以求得N/4点的DFT,重复抽取过程,就可以使N点的DFT用上组2点的DFT来计算,这样就可以大减少运算量。基2DIFFFT的蝶形运算如图3.3.1所示。设蝶形输入为X1(k)和X2((K),输出为x(k)和x(N/2+K),则有x(k)=x1(k)+WkNx2(k)(6)x(N/2+k)=x1(k)-WkNx2(k)(7)在基数为2的FFT中,设N=2M,共有M级运算,每级有N/2个2点FFT蝶形运算,因此,N点FFT总共有MN/2个蝶形运算。图3.3.1基2DIFFFT的蝶形运算例如:基数为2的FFT,当N=8时,共需要3级,12个基2DITFFT的蝶形运算。其信号流程如图3.3.2所示。图3.3.2从图可以看出,输入是经过比特反转的倒位序列,称为位码倒置,其排列顺序为x(0),x(4),x(2),x(6),x(1),x(5),x(3),x(7),输出是按自然顺序排列,其顺序为x(0),x(1),x(2),x(3),x(4),x(5),x(6),x(7).在本设计中,信号的频谱通过FFT算法得出,FFT算法可以自己编写,也可以调用55xdsp.lib库rfft或cfft函数。调用库函数的需要在工程中添加库文件55xdsp.lib,并且在程序中包含头文件dsplib.h。调用的时候入口参数是时域信号地址,返回处理后的FFT信号,注意返回值不包含求模过程,而是交替返回实部和虚部。本实验采用自己编写的基2频率抽取法计算FFT。3.4“ping-pong”存储方式Ping-pong存储方式在内存开辟四块存储区,分别是gBufferRcvPing、gBufferRcvPong、gBufferXmtPing、gBufferXmtPong,其中前两块用于DMA接收,后两块用于DMA发送。目的是将正在接收或发送的区域与正在处理的区域分离开。这个过程通过变量“pingpong”控制,以进入中断时pingpong=0为例,进入终端后将其值改为1,将DMA接收目的区改为gBufferRcvPong,处理gBufferRcvPing的数据,并将处理的数据发往gBufferXmtPing,而同时DMA发送源是gBufferXmtPong,这样发送和接收都不冲突。本实验中gBufferRcvPing/gBufferRcvPong接收到的数据是左右声道交替的,因此要将接收回来的数据根据左右两声道分成两个数组存放,再将每一个声道的实部和虚部存到DDataBuffer[i].real/DDataBuffer[i].imag当中,做256点FFT变换后求模值得到幅度谱,再将经过防溢出处理的数据存入gBufferRcvPing/gBufferRcvPong中。重复循环上述过程即可实现实时信号谱的分析。4、实验步骤(1)新建工程,正确设置工程选项(buildoption),设置工程的存储器模式、头文件路径及库文件路径等,注意工程存放路径不能有中文名;(2)编写工程所需的所有实验源程序,实验程序包括c文件、h文件、cmd文件、GEL文件、中断向量s55文件等,并添加进工程;(3)将仿真器等硬件正确连接上,注意音频输入输出方向是否正确。将音频立体声输入J5接电脑耳机输出口,将J7接电脑语音录入口;(4)按F7键编译连接生成obj文件(无错误时),若程序有错误则查看错误信息,双击错误处光标自动跳转到错误处,直到排除所有错误;(5)点击file菜单下loadprogram载入程序,将程序下载在DSP芯片中,点击“run”或按键F5全速运行;(6)使用变量观察图形观察窗等工具观察分析输入输出信号是否与预期效果相同;(7)系统调试、代码优化等;(8)确定最终方案,撰写设计报告。5、实验结果及分析图1为左右声道分别输入频率为2kHz和5kHz的正弦信号,示波器输出图像:图1图2为信号源输入情况显示:图2图3和图4分别是ccs工具得出的结果,左声道输入为2kHz,右声道输入为5kHz,采样频率为32kHz,左右声道分别采256个点:32k/2k=1632k/5k=6.4图3图4图5显示的是ccs同时对捕获到的左右两声道信号进行FFT处理,图中显示的两个峰值分别代表左右声道的频率,坐标轴0-255表示左声道,256-512表示右声道,由图可知左声道的频率大概为2kHz,右声道的频率大概为5kHz,基本和输入频率相吻合。图5图7和图8分别为左右声道输入对应频域波形图:图7图8从实验结果来看还有一些失真,但总体实现了预期效果。6、实验中遇到的问题及解决方法(1)实验运行程序的过程中,改变输入信号的频率,示波器时而有图像时而无显示,只显示杂波。只有重新加载程序才可以输出波形。此实验的进行与硬件密切相关,要保证硬件状态完好。(2)在创建工程时遇到困难,总是在步骤完成后不能运行程序。最后只能先在老师原有的工程文件下进行代码粘贴并改错,才可以运行成功。(3)对于DMA的理解不够透彻,对中断的设置不够熟练,导致实验初始阶段出现了一系列的理解问题,经查阅相关资料即组内讨论后解决了问题。(4)开始运行代码时发现示波器和GRAPH中的显示总有一个是倒过来的,后来修改代码,发现溢出部分的写法有问题,修改后一切正常。7、实验感想祖健文:首先,我觉得DSP是一门比较难的课程,可是这门课程的理论学时却只有短短的8学时,而且老师上课讲课速度比较快,我也没有认真做什么笔记,所以,理论课上基本只学到了CCS一些非常基本的使用方法,DSP的原理掌握的又是皮毛中的皮毛,这都导致后来的课程设计中理论知识的储备严重不足。这次的课程设计,基本就是实践中去验证一些老师课上或课件中的一些知识,比如我们所选的题目是“利用DSP实现信号的实时谱分析”,其实这算是一个比较简单的题目,理论上就是将例程中的DMA实时信号采集程序和FFT谱分析程序结合在一起就可以。虽然说起来简单,但实际操作中确