西电DSP大作业 3.docx
《西电DSP大作业 3.docx》由会员分享,可在线阅读,更多相关《西电DSP大作业 3.docx(26页珍藏版)》请在冰豆网上搜索。
![西电DSP大作业 3.docx](https://file1.bdocx.com/fileroot1/2023-8/15/61d3f4ea-fd6a-4054-a825-34f984d431c4/61d3f4ea-fd6a-4054-a825-34f984d431c41.gif)
西电DSP大作业3
实验三
一、实验题目:
数据采集和谱分析
二、实验目的:
理解离散傅立叶变化的原理,掌握DFT的快速算法,同时了解连续信号的采样后的频谱,加深对数字信号处理理论的理解。
三、实验设备:
信号源、EZ-KIT板、微机、示波器等。
四、实验内容
利用ADSPBF533的评估板的硬件资源,完成对信号的采样与FFT变换输出。
1)利用plot功能,在程序中设置断点,观察各种波形的采样数据、输出数据的的波形;
2)按照实验步骤完成实验,连续运行程序,观察示波器的波形,说明它们的差别。
3)在实验报告中记录方波和三角波的采样数据和FFT结果数据,描绘其波形。
并利用数字信号处理课程所学知识分析结果。
五、实验原理
离散傅里叶变换(DFT),是傅里叶变换在时域和频域上都呈现离散的形式,将时域信号的采样变换为在离散时间傅里叶变换(DTFT)频域的采样。
在实际应用中通常采用快速傅里叶变换以高效计算DFT。
六、实验步骤
1)连接硬件
断开所有电源,参考实验二连接好信号源、EZ-KIT板、微机、示波器等并检查EZ-KIT板上的跳线状态是否正确,按照硬件连接图检查确保正确连接各个硬件设备。
下图为EZ-KIT板上信号的输入,输出通道定义,本次实验均使用的是Channel_1通道。
2)加电和启动程序
检查无误后,分别打开PC机、信号源、评估板和示波器的电源,启动VisualDSP++,新建一个工程,工程名称自定义,正确设置工程的各个选项,将源程序加入到工程中。
3)选择或者建立正确的会话类型
按照要求选择或者建立EZ-KIT类型的会话,详细要求请参阅之前实验的有关内容。
4)编译链接运行程序
编译链接该工程。
在程序中恰当位置设置断点(如main函数中的“optr=OutputBuffer;”程序行前),利用VisualDSP++软件的Plot功能,分别绘制ADC数据数组tempdata和频谱数组数据Magnitude的数值。
4)改变信号再观察
调节信号发生器,利用示波器监视其输出幅度为0.51Vpp,频率为14kHZ。
分别产生正弦波、方波和三角波,观察并记录示波器上的输出结果,或者利用VisualDSP++的Plot功能进行记录。
七、主要源代码
1、程序结构:
程序包括主函数main()、Process_data()、Initialize()和ISR()等4个模块,以及常数和宏定义、全局变量定义部分。
其中main()函数完成程序的控制,Initialize()完成CODEC和BF533个部分的初始化,Process_data()完成数据采集和计算,ISR()实现中断控制。
2、程序工作流程:
main()首先调用init_codec(),将CODEC和BF533进行初始化,然后调用中断函数ISR(),程序进入数据采集,通过CODEC的A/D采集数据,采集完256点数据后,转入数据处理,并且将处理结果送回CODEC,通过它的D/A转换成模拟信号。
连续运行时,程序处于数据采集->数据处理->等待->数据采集(256点)->……的无限循环中,直到被用户干预停止。
3、数据采集和处理模式的切换:
程序设置了全局整形变量Ready2FFT标志当前工作状态。
若Ready2FFT==0时,工作在数据采集模式,此模式下中断程序每触发一次,程序从外部的SPORT_RX送一个数据到BF533内部缓冲区InbufLeft[]和InbufRigh[]t,当采集到256个数据后,子程序Process_data()会自动设置Ready2FFT==1,即进入数据处理阶段。
数据处理结束后,重新进入数据采集阶段开始新的循环。
4、数据处理方法:
当Ready2FFT==1时,程序把采集到的整形数据转化为浮点数据,然后将得到的浮点数据与窗函数进行相乘运算,经过这样预处理后的数据再转换为16位小数型数据,通过调用系统函数rfftrad4_fr16()进行傅里叶变换,再求模值,然后对模值进行适当的处理,最后得到的浮点结果转化为整形数据,输出到示波器。
程序中用到的几个主要数据变量的用途说明如下:
intwindow;//选择窗函数的形式。
0:
矩形窗;1:
汉明窗。
intCounter0;//采集到的数据样本数计数器
intOutputMum;//发送数据到DAC的索引计数器
inttempdata[FFT_NUM];//存放采样数据,可用plot功能描绘
fract16output[FFT_NUM];//存放FFT变换后得到的数据
floatMagnitude[FFT_NUM];//存放FFT变换后得到的频谱幅度
intOutputBuffer[FFT_NUM];//存放输出频谱数据
实验三使用的源程序位于子目录…\test3\FFT目录下,打开工程文件FFT.DPJ,可以看到程序由以下几个模块构成:
1)talkthough.h
#ifndef__Talkthrough_DEFINED
#define__Talkthrough_DEFINED
//--------------------------------------------------------------------------//
//Headerfiles//
//--------------------------------------------------------------------------//
#include
#include
//--------------------------------------------------------------------------//
//Symbolicconstants//
//--------------------------------------------------------------------------//
//addressesforPortBinFlashA
#definepFlashA_PortA_Dir(volatileunsignedchar*)0x20270006
#definepFlashA_PortA_Data(volatileunsignedchar*)0x20270004
//namesforcodecregisters,usedforsCodec1836TxRegs[]
#defineDAC_CONTROL_10x0000
#defineDAC_CONTROL_20x1000
#defineDAC_VOLUME_00x2000
#defineDAC_VOLUME_10x3000
#defineDAC_VOLUME_20x4000
#defineDAC_VOLUME_30x5000
#defineDAC_VOLUME_40x6000
#defineDAC_VOLUME_50x7000
#defineADC_0_PEAK_LEVEL0x8000
#defineADC_1_PEAK_LEVEL0x9000
#defineADC_2_PEAK_LEVEL0xA000
#defineADC_3_PEAK_LEVEL0xB000
#defineADC_CONTROL_10xC000
#defineADC_CONTROL_20xD000
#defineADC_CONTROL_30xE000
//namesforslotsinad1836audioframe
#defineINTERNAL_ADC_L00
#defineINTERNAL_ADC_R02
#defineINTERNAL_DAC_L00
#defineINTERNAL_DAC_R02
#defineINTERNAL_ADC_L11
#defineINTERNAL_ADC_R13
#defineINTERNAL_DAC_L11
#defineINTERNAL_DAC_R13
//sizeofarraysCodec1836TxRegs
#defineCODEC_1836_REGS_LENGTH11
//SPItransfermode
#defineTIMOD_DMA_TX0x0003
//SPORT0wordlength
#defineSLEN_240x0017
//DMAflowmode
#defineFLOW_10x1000
/////////////////
#defineFFT_NUM256
//--------------------------------------------------------------------------//
//Globalvariables//
//--------------------------------------------------------------------------//
externintiChannel0LeftIn;
externintiChannel0RightIn;
externintiChannel0LeftOut;
externintiChannel0RightOut;
externintiChannel1LeftIn;
externintiChannel1RightIn;
externintiChannel1LeftOut;
externintiChannel1RightOut;
externvolatileshortsCodec1836TxRegs[];
externvolatileintiRxBuffer1[];
externvolatileintiTxBuffer1[];
externintCounter;
externintOutputMum;
externintWindow;
externintReadyFFT;
externfloatWin[];
externintInbufLeft[];
externintOutputbuf[];
//--------------------------------------------------------------------------//
//Prototypes//
//--------------------------------------------------------------------------//
//infileInitialize.c
voidInit_EBIU(void);
voidInit_Flash(void);
voidInit1836(void);
voidInit_Sport0(void);
voidInit_DMA(void);
voidInit_Interrupts(void);
voidInit_ProcessData(void);
voidInit_Windows(void);
voidEnable_DMA_Sport(void);
//infileProcess_data.c
voidProcess_Data(void);
//infileISRs.c
EX_INTERRUPT_HANDLER(Sport0_RX_ISR);
#endif//__Talkthrough_DEFINED
2)main.c
//--------------------------------------------------------------------------//
//Name:
TalkthroughfortheADSP-BF533EZ-KITLite
//--------------------------------------------------------------------------//
//(C)Copyright2003-AnalogDevices,Inc.Allrightsreserved.//
//ProjectName:
BF533CTalkthroughI2S
//DateModified:
04/03/03HDRev1.0
//Software:
VisualDSP++3.1
//Hardware:
ADSP-BF533EZ-KITBoard
//Connections:
ConnectRSCLK0toTSCLK0together(TurnSW9pin6on)//
//ConnectRFS0toTFS0together(TurnSW9pin5ON)//
//Connectaninputsource(suchasaradio)totheAudio//
//inputjackandanoutputsource(suchasheadphones)to//
//theAudiooutputjack
//Purpose:
ThisprogramsetsuptheSPIportontheADSP-BF533to//
//configuretheAD1836codec.TheSPIportisdisabled//
//afterinitialization.Thedatato/fromthecodecare//
//transferedoverSPORT0inI2Smode
//--------------------------------------------------------------------------//
#include"Talkthrough.h"
#include"sysreg.h"
#include"ccblkfn.h"
#include
#include
#include
#include
complex_fract16t[FFT_NUM];//tempworking
complex_fract16Outbuf[FFT_NUM];
complex_fract16w[FFT_NUM];//twiddlesequence
fract16Input[FFT_NUM];
intInbufLeft[FFT_NUM];
intWindow;//窗函数状态标志:
0--矩形窗,1--汉明窗
floatMagnitude[FFT_NUM];//输出频谱的幅度
inttempdata[FFT_NUM];
intReadyFFT;
intOutputbuf[FFT_NUM];
//--------------------------------------------------------------------------//
//Variables
//Description:
ThevariablesiChannelxLeftInandiChannelxRightIncontain//
//thedatacomingfromthecodecAD1836.The(processed)//
//playbackdataarewrittenintothevariables//
//iChannelxLeftOutandiChannelxRightOutrespectively,which//
//arethensentbacktothecodecintheSPORT0ISR.//
//ThevaluesinthearrayiCodec1836TxRegscanbemodifiedto//
//setupthecodecindifferentconfigurationsaccordingto//
//theAD1885datasheet.
//--------------------------------------------------------------------------//
//leftinputdatafromad1836
intiChannel0LeftIn,iChannel1LeftIn;
//rightinputdatafromad1836
intiChannel0RightIn,iChannel1RightIn;
//leftouputdataforad1836
intiChannel0LeftOut,iChannel1LeftOut;
//rightouputdataforad1836
intiChannel0RightOut,iChannel1RightOut;
//arrayforregisterstoconfigurethead1836
//namesaredefinedin"Talkthrough.h"
volatileshortsCodec1836TxRegs[CODEC_1836_REGS_LENGTH]=
{
DAC_CONTROL_1|0x000,
DAC_CONTROL_2|0x000,
DAC_VOLUME_0|0x3ff,
DAC_VOLUME_1|0x3ff,
DAC_VOLUME_2|0x3ff,
DAC_VOLUME_3|0x3ff,
DAC_VOLUME_4|0x000,
DAC_VOLUME_5|0x000,
ADC_CONTROL_1|0x000,
ADC_CONTROL_2|0x000,
ADC_CONTROL_3|0x000
};
//SPORT0DMAtransmitbuffer
volatileintiTxBuffer1[4];
//SPORT0DMAreceivebuffer
volatileintiRxBuffer1[4];
//--------------------------------------------------------------------------//
//Function:
main//
//Description:
Aftercallingafewinitalizationroutines,main()just//
//waitsinaloopforever.Thecodetoprocesstheincoming//
//datacanbeplacedinthefunctionProcess_Data()inthe//
//file"Process_Data.c".//--------------------------------------------------------------------------//
voidmain(void)
{
Window=1;
sysreg_write(reg_SYSCFG,0x32);//InitializeSystemConfigurationRegister
Init_EBIU();
Init_Flash();
Init1836();
Init_ProcessData();
Init_Windows();
Init_Sport0();
Init_DMA();
Init_Interrupts();
Enable_DMA_Sport0();
while
(1)
{
if(ReadyFFT==1)
{
inti;/*countervariable*/
intwst=1;
intn=FFT_NUM;
int*optr;
float*fptr;
floatMinNum,MaxNum,AvgNum,NumRange;
intblock_exponent=8;
intscale_method=2;
intoffset;
floatscale_value;
twidfft_fr16(w,FFT_NUM);
for(i=0;i{
tempdata[i]=(int)((float)(InbufLeft[i]>>16)*Win[i]);
Input[i]=tempdata[i];
}
offset=50;
scale_value=25.0;
/*doFFT.*/
rfftrad4_fr16(Input,t,Outbuf,w,wst,n,block_exponent,scale_method);
for(i=0;iMagnitude[i]=sqrt((float)Outbuf[i].re*(float)Outbuf[i].re+(float)Outbuf[i].im*(float)Outbuf[i].im);
///////////对结果进行对数量化/////////
for(i=0;iMagnitude[i]=20*log10(Magnitude[i]+1);
MinNum=32767;MaxNum=-32768;//量化为D/A格式
AvgNum=0;
fptr=&Magnitude[0];
for(i=0;i