西电DSP大作业 3.docx

上传人:b****8 文档编号:30486262 上传时间:2023-08-15 格式:DOCX 页数:26 大小:142.32KB
下载 相关 举报
西电DSP大作业 3.docx_第1页
第1页 / 共26页
西电DSP大作业 3.docx_第2页
第2页 / 共26页
西电DSP大作业 3.docx_第3页
第3页 / 共26页
西电DSP大作业 3.docx_第4页
第4页 / 共26页
西电DSP大作业 3.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

西电DSP大作业 3.docx

《西电DSP大作业 3.docx》由会员分享,可在线阅读,更多相关《西电DSP大作业 3.docx(26页珍藏版)》请在冰豆网上搜索。

西电DSP大作业 3.docx

西电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;i

Magnitude[i]=sqrt((float)Outbuf[i].re*(float)Outbuf[i].re+(float)Outbuf[i].im*(float)Outbuf[i].im);

///////////对结果进行对数量化/////////

for(i=0;i

Magnitude[i]=20*log10(Magnitude[i]+1);

MinNum=32767;MaxNum=-32768;//量化为D/A格式

AvgNum=0;

fptr=&Magnitude[0];

for(i=0;i

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1