利用DSP实现信号频谱动态分析文档格式.doc
《利用DSP实现信号频谱动态分析文档格式.doc》由会员分享,可在线阅读,更多相关《利用DSP实现信号频谱动态分析文档格式.doc(18页珍藏版)》请在冰豆网上搜索。
利用DSP实现信号频谱动态分析
一、实验内容
1.使用C语言编写信号实时谱分析程序,从MIC接口输入1KHZ正弦信号,分别利用CCS图形观察工具和虚拟示波器观察信号幅度频谱。
2.输入不同频率的信号和混合频率信号,观察信号的幅度频谱,分析并比较与实际理论幅度频谱的差别。
二、实验目的
1、掌握FFT的算法原理和基本性质
2、掌握利用DSP系统对连续信号进行幅度频谱分析
3、学会设置断点并利用CCS和虚拟仪器观察实时信号的频谱
4、熟练运用C语言进行编程实现实时信号的频谱分析
5、熟练使用CCS5402的操作方法和调试检验方式。
三、实验器材
DSP5402开发板,CCS软件环境,电源,电脑与板接口连线
四、实验原理
1、信号的实时采集与传输
本实验利用DMA通道2与McBSP1通道结合来读取A/D转换的数据,利用DMA通道3与McBSP1道结合来将处理后的数据发送至D/A。
选择McBSP1通道的接受寄存器DRR11(41H)DMA传送数据的首地址,并选择DMA源地址工作在不调整模式,选择McBSP1接收事件为DMA同步事件,以实现DMA和McBSP的结合。
A/D转换的数据按McBSP1设置被送到DSP内部接受寄存器DRR11中,再由DMA通道2将DRR11中的数据读到指定数据存储区&
p-inp中完成数据的采集。
DMA在传输外部来的数据时不会影响CPU的运行,当DMA通道2采集完一组数据后产生一个DMA中断事件中断CPU,来通知CPU对其进行处理,CPU通过对数据进行倒序和序列FFT处理并计算频谱,此时DMA通道2可以按照设定继续采集下一组数据,实现数据与CPU的并行处理。
当一组数据处理完成后,将数据存放在数据存储区&
out_buffer+frame*0x100中,选择&
out_buffer+frame*0x100为DMA通道3传送数据的首地址,并选择源地址工作在不调整模式。
选择McBSP1通道的发送寄存器DRR11(43h)为DMA通道3传送数据的目地地址,并选择DMA源地址工作在不调整模式,选择McBSP1接受事件为DMA同步事件,以实现DMA与McBSP的结合。
待分析的外部模拟信号首先需经A/D转换成数字信号,然后通过DMA实时传输进入DSP系统,由FFT进行信号的频谱分析。
输入信号转换成数字信号后利用DMA通道2进行传输,信号的输出利用DMA通道3进行传输,因此需对DMA的通道2和通道3进行初始化。
2、FFT算法实现
快速傅里叶变换FFT是DFT的快速算法。
直接计算一个N点序列x【k】的DFTX[m]需要N次复数运算,而利用基2-时域抽取算法只需次复数乘法运算,可见FFT算法能有效提高DFT计算速度。
本实验直接调用DSPLIB库中的RFFT函数,其可以实现基2时域抽取FFT算法。
由于输入输出的次序不同,所以计算频谱时需要对信号数据进行倒序。
倒序算法可以调用DSPLIB库中的cbrev函数。
在利用DSPLIB库是,工程中要添加库文件54xdsp.lib,C源程序重要包含头文件dsplib.h。
序列倒序算法函数cbrev()的调用格式是:
voidcbrev(DATA*x,DATA*r,unshortn)
函数rfft()的调用格式是:
voidrfft(DATAy,n,shortscale)
五、实验程序及注释:
1、C语言源程序如下:
主程序:
FFTlab。
C
/*****************************************************************************/
/*FIRlab.CAIC,McBSP,DMAinitializationforFIRlabFilter*/
/**/
/*Goal:
Thiscodeperformsthefollowingfunctions:
*/
/* -togglethethreeLEDsontheDSK */
/* -setupAIC(CODEC)parameters */
/* -initializeDMAChannel(CH2-input) */
/* -turnoninterrupts */
/* -runforever(waitingforDMAinterruptstotransferdata) */
/* */
/*Author:
ScottBlandDate:
03/20/2000 */
/*****************************************************************************/
/*IncludeFiles*/
#include<
type.h>
board.h>
codec.h>
firlab.h>
string.h>
dsplib.h>
/*FunctionPrototypes*/
voiddelay(s16period);
externvoidDMAC2ISR();
/*GlobalVariables*/
HANDLEhHandset;
unsignedintdmsefc,dmmcr,dmctr,src_addr,dst_addr;
unsignedintdmpre,dmsrcp,dmdstp,dmidx0,dmidx1,dmfri0,dmfri1,dmgsa,dmgda,dmgcr,dmgfr;
/*Createspecificdatasectionforbuffer(symbol,section_name)*/
#pragmaDATA_SECTION(inp_buffer,"
audio_buffer"
);
DATAinp_buffer[0x200];
#pragmaDATA_SECTION(out_buffer,"
outt_buffer"
DATAout_buffer[0x200];
/*declareandinitializetwovariablesforDMACISRs*/
intframe=0;
intflag=0;
inttemp;
intcurrbuff=0;
/*delayptrholdstheaddressofthestartofthedelaybuffer*/
interruptvoidDMAC2ISR();
/*MAIN*/
voidmain()
{
s16cnt=2;
/*ThesearetheitemsthatBIOSwillsetwhenweuseit*/
BSCR=0x8806;
XPC=0;
PMST=0xA0;
brd_set_cpu_freq(100);
TIMER_HALT(0);
brd_set_wait_states(7,7,9);
TIMER_RESET(0);
IMR=0;
//禁止所有中断
/*-----------------------------------------------------*/
if(brd_init_bios())
return;
while(cnt--)
{
brd_led_toggle(BRD_LED0);
//切换LED指示灯0的显示状态
delay(1000);
brd_led_toggle(BRD_LED1);
//切换LED指示灯1的显示状态
brd_led_toggle(BRD_LED2);
//切换LED指示灯2的显示状态
}
/*OpenHandsetCodec*/
hHandset=codec_open(HANDSET_CODEC);
/*Acquireha