利用dsp实现实时信号谱分析.docx
《利用dsp实现实时信号谱分析.docx》由会员分享,可在线阅读,更多相关《利用dsp实现实时信号谱分析.docx(36页珍藏版)》请在冰点文库上搜索。
利用dsp实现实时信号谱分析
国家电工电子实验教学中心
DSP课程设计
设计报告
设计题目:
利用DSP实现实时信号频谱分析
学院:
电子信息工程学院
专业:
通信工程
成员:
指导老师:
侯亚丽
1设计环境简介
1.1DSP芯片主要特性
C55x是TI的C5000系列的DSP的子系列,是目前能耗效率很高的DSP处理器,其功耗可低至0.05mW/MIPS.是54系列发展起来的,和C54x代码兼容,但是速度更快,功耗明显降低,如300MHz的C55x与120MHz的C54x相比,处理速度提高了5倍,功耗只有C54x的1/6.
TMS320VC5502的程序/数据存储空间采用统一编址,整个寻址空间大小为16M字节(bytes),其中片内DARAM占64K字节,ROM占32K字节,其余存储空间被映射到片外4个片选的子空间。
BJTU-DSP5502板支持TMS320VC5502DSP,工作频率可以高达300MHz,工作的核电压为1.26V,I/O电压为3.3V。
1.2BJTU-DSP5502实验板板上资源主要包括:
DSP芯片1枚(U1):
TMS320VC5502@300MHz
SDRAM1枚(U5):
2M×32bit(8Mbytes)HY57V643220CT
FLASH1枚(U4):
256K×16bit(512Kbytes)SST39VF400A-70
CPLD1枚(U2):
CY37064VP100
通信接口3个:
仿真器JTAG接口(J1)、连接到PC机USB接口(J4)和UART接口(J2)
信号采集和输出端口:
立体音输入接口line-in(J5,直接接电脑的语音输出端口)/麦克风输入接口(J7)/耳机音频输出接口(J6)
扩展板接口(J9,J10)
1.3TMS320VC5502片上外设
64bitTimer:
4个,TIMER0/TIMER1/WatchDogTIMER/TIMER3(DSP/BIOStimer)
McBSP:
3通道,McBSP0/McBSP1/McBSP2
DMA:
6通道,DMA0/DMA1/DMA2/DMA3/DMA4/DMA5/DMA6
IIC:
1通道
UART:
1通道
8/16bitHPI:
1通道
2指标及设计要求
(1)设计谱分析算法,或调用DSPLIB中FFT函数,实现对信号的频谱分析。
(2)利用C语言对A/D、D/A进行初始化
(3)利用C语言对DMA进行初始化
(4)编写DMA中断服务程序,实现信号的实时谱分析
(5)利用CCS信号分析工具分析信号的频谱成分,对FFT算法结果进行验证。
(6)信号频谱数据实时输出到Headphone输出接口,并在示波器上进行显示;
(7)在实验板的Linein输入端接入正弦信号,分左右声道分别采集,并分别进行频谱分析;
(8)利用CCS的Profiler工具计算FFT算法所需要的时间,并根据实时性要求进行必要的算法优化
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所示。
图3.2.1
3.3FFT算法
FFT(FastFourierTransformation),即为快速傅氏变换,是离散傅氏变换(DFT)的快速算法,它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。
(1)离散傅里叶变换DFT
N点DFT的正变换公式为:
X(k)=
N-nk
式中,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(DIT FFT)和按频率抽取的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,1,…,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,这样发送和接收都不冲突。
程序有序的运行。
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实验结果及分析
图5.1和图5.2显示的是左右声道同时输入相同频率的正弦信号的实验结果,图5.1是实际输出的示波器显示,图5.2是用ccs工具计算的结果显示,用于验证实验结果。
图5.3、图5.4和图5.5显示的是双声道不同输入的结果,左右声道分别输入2kHz正弦和1kHz方波。
三个图分别是ccs工具得出的结果、本实验FFT算出的结果和输出的示波器显示的结果,根据实验设置,信号的采样率是32kHz,做256点FFT。
由数字信号处理原理知频谱的分辨率是32k/256=125Hz.,从图中看,波峰的主要频频率分别是5*8=1000Hz和125*16=2000Hz。
当然除此之外还有其他的谐波成分,谐波主要是由于输入方波造成的。
实际示波器再进行一定的处理就可以精确计算出输入信号的频谱成分,因此本实验的效果达到预期效果。
图5.1
图5.2
图5.3
图5.4
图5.5
6实验中遇到的问题及解决方法
1.编译时提示找不到库文件或头文件,找不到库文件是工程设置的问题,也可以收到添加,找不到头文件可以把include语句的尖括号改成引号试试。
2.编译正确但是载入后不能正常运行,这种情况可以让CPU复位一下,或者重启软件环境等。
3.左右声道分别采集并分别做FFT,原理是采集的时候是“左-右-左-右-左-右”采集的,按此规律分别提取两个声道的数据即可。
4.各寄存器的初始化配置,刚开始时候没什么头绪,完全不知道怎么配置那些寄存器,后来找到一些例程和TI官方文档,按照例程框架模仿编程,逐步完善。
7实验感想
虽然已经学习了信号系统和数字信号处理等先修课程,但是两门课程的学习都仅限于理论知识,并没有实际的用到信号处理中来,而这次的课程设计才是真正的实际应用。
可以说我们在dsp的实际应用上还是一片空白,通过这次课程设计,我们开始了解了dsp处理的过程及dsp芯片的应用方法和过程。
我想这是很重要的,因为dsp的芯片是很多的我们不可能在短时间内全部学习到,但是可以通过学习一个芯片而触类旁通,在以后接触到类似的芯片的时候能很快上手。
我们的设计题目是利用dsp实现实时信号谱分析,简单的实现功能并不是很难,但在课程设计中我们也遇到了很多的困难,包括基础一些的C语言的组织语法问题以及专业相关的数字信号处理原理上的问题等。
但是最终都通过查阅资料或者请教老师解决了,结果并不是最重要的,重要的是通过这次课程设计,我们更过的了解了在设计一个系统的时候遇到问题的解决思路以及接触一个自己不熟悉的设计时怎样才能尽快上手去哪里怎样获取资料等技能。
另外在实验中特别是编程的时候遇到了很多问题都是细节的问题,这也再次提醒我们,细节很重要,在很大程度上决定最终的成败。
总之这次课程设计收获还是不小的。
这次DSP系统课程设计给我最大的感受便是它将理论知识与实际编程相结合。
通过之前学习的数字信号处理,我们对DSP已经有了基本的认识,但仅仅是理论课程的学习并不能对知识有十分深入的理解,没有一个直观的认识。
本次课程设计在理论知识的基础之上,加入了软件编程与硬件连接,是理论与实践的结合。
通过这次课设,我对DSP的原理有了更深入直观的理解,同时提升了自己的编程能力,逐渐掌握如何将思想通过代码表达出来,这是本专业极其重要的一种能力。
此外,面对一个相对陌生的问题时,我们学会了如何查阅资料,如何学习相关知识,如何与大家共同学习探讨。
这些都是十分宝贵的学习经历,对我们今后的学习工作有很大的帮助。
8参考文献
[1]TMS320VC5501/5502DSPDirectMemoryAccessControllerReferenceGuide.pdf
[2]TMS320C55xDSPLibraryProgrammer’sReference.pdf
[3]TMS320C55xDSPLibraryProgrammer’sReference,SPRU422J.pdf
[4]TMS320VC5502Fixed-PointDigitalSignalProcessorDataManual,SPRS166K.pdf
[5]TMS320C55xChipSupportLibraryAPIReferenceGuide,SPRU433I.pdf
9程序清单及源代码
1.C文件
AIC23.c:
A/D和D/A初始化
I2C.c:
总线初始化
Mcbsp.c:
串口初始化
FFTfunction.c:
基2频谱抽取FFT函数
main_dma4.c:
主函数
2.s55文件存中断向量表
3.h文件
CODEC.h
dsplib.h
E2PROM_Function.h
i_cmplx.h
tms320.h
twiddle1024.h
附:
主程序源代码
/*
*Copyright(C)2003TexasInstrumentsIncorporated
*AllRightsReserved
*/
/*
*---------main_dma4.c---------
*ThisisaDMAapplicationexampleforCodecAIC23Banaloginput/output,
*TheexampleplacestheMCBSPinDMAtransmitdatamodeand
*syncsMCBSPreceivewithDMAchannel4andMCBSPtransmit
*withDMAchannel5.
*TheexampleusespredefinedCSLmacrosandsymbolic
*constantstocreatetheinitializationvaluesneededfor
*theMCBSPandDMAcontrolregisterstoeffectthetransfer
*Createdbyhailingao,BJTU,2012/06/25
*/
#include
#include
#include
#include
#include
#include
#include
#include"E2PROM_Function.h"
#include"CODEC.h"
#include"i_cmplx.h"
#include
#include
#include
#include
#include
//#include"dsplib.h"
shortDataBuffer[1024]={0};
COMPLEXDDataBuffer[512*2]={0};
Uint32mod[512*2];
inti;
unsignedintm=0;
longn;
shortp,q;
//---------Globaldatadefinition---------
/*Constantsforthebufferedping-pongtransfer*/
#defineBUFFSIZE512
#definePING0
#definePONG1
#defineSCALE1
/*
*Databufferdeclarations-theprogramusesfourlogicalbuffersofsize
*BUFFSIZE,onepingandonepongbufferonbothreceiveandtransmitsides.
*/
#pragmaDATA_SECTION(gBufferXmtPing,"buffer_sect");
Uint32gBufferXmtPing[BUFFSIZE/2];//TransmitPINGbuffer
#pragmaDATA_SECTION(gBufferXmtPong,"buffer_sect");
Uint32gBufferXmtPong[BUFFSIZE/2];//TransmitPONGbuffer
#pragmaDATA_SECTION(gBufferRcvPing,"buffer_sect");
Int16gBufferRcvPing[BUFFSIZE];//ReceivePINGbuffer
#pragmaDATA_SECTION(gBufferRcvPong,"buffer_sect");
Int16gBufferRcvPong[BUFFSIZE];//ReceivePONGbuffer
#pragmaDATA_SECTION(gBufferRcvPingleft,"buffer_sect");
Int16gBufferRcvPingleft[BUFFSIZE/2];//ReceivePINGbuffer
#pragmaDATA_SECTION(gBufferRcvPongleft,"buffer_sect");
Int16gBufferRcvPongleft[BUFFSIZE/2];//ReceivePONGbuffer
#pragmaDATA_SECTION(gBufferRcvPingright,"buffer_sect");
Int16gBufferRcvPingright[BUFFSIZE/2];//ReceivePINGbuffer
#pragmaDATA_SECTION(gBufferRcvPongright,"buffer_sect");
Int16gBufferRcvPongright[BUFFSIZE/2];//ReceivePONGbuffer
/*------------------------------------------------------------------------------------*/
//
//ConfigMcBSP:
UseMcBSPtosendandreceivethedatabetweenDSPandAIC23B
//
/*------------------------------------------------------------------------------------*/
MCBSP_ConfigMcbsp1Config={
MCBSP_SPCR1_RMK(
MCBSP_SPCR1_DLB_OFF,//DLB=0
MCBSP_SPCR1_RJUST_LZF,//RJUST=0,rightjustifythedataandzerofilltheMSBs
MCBSP_SPCR1_CLKSTP_DISABLE,//CLKSTP=0
MCBSP_SPCR1_DXENA_ON,//DXENA=1,DXdelayenableron
0,//Reserved=0
MCBSP_SPCR1_RINTM_RRDY,//RINTM=0
MCBSP_SPCR1_RSYNCERR_NO,//RSYNCER=0
//MCBSP_SPCR1_RFULL_NO,//RFULL=0
//MCBSP_SPCR1_RRDY_NO,//RRDY=0
MCBSP_SPCR1_RRST_DISABLE//RRST=0;Disablereceiver
),
MCBSP_SPCR2_RMK(
MCBSP_SPCR2_FREE_NO,//FREE=0
MCBSP_SPCR2_SOFT_NO,//SOFT=0
MCBSP_SPCR2_FRST_FSG,//FRST=1;Enabletheframe-synclogic
MCBSP_SPCR2_GRST_CLKG,//GRST=1;Thesamplerategeneratoristakeoutofitsresetstate
MCBSP_SPCR2_XINTM_XRDY,//XINTM=0
MCBSP_SPCR2_XSYNCERR_NO,//XSYNCER=0
//MCBSP_SPCR2_XEMPTY_NO,//XEMPTY=0
//MCBSP_SPCR2_XRDY_NO,//XRDY=0
MCBSP_SPCR2_XRST_DISABLE//XRST=0Disabletransimitter
),
//单数据相,接受数据长度为16位,每相2个数据
MCBSP_RCR1_RMK(
MCBSP_RCR1_R