1、西电DSP大作业 3实验三一、实验题目:数据采集和谱分析二、实验目的:理解离散傅立叶变化的原理,掌握DFT的快速算法,同时了解连续信号的采样后的频谱,加深对数字信号处理理论的理解。三、实验设备:信号源、EZ-KIT板、微机、示波器等。四、实验内容利用ADSPBF533的评估板的硬件资源,完成对信号的采样与FFT变换输出。1)利用plot功能,在程序中设置断点,观察各种波形的采样数据、输出数据的的波形;2)按照实验步骤完成实验,连续运行程序,观察示波器的波形,说明它们的差别。3)在实验报告中记录方波和三角波的采样数据和FFT结果数据,描绘其波形。并利用数字信号处理课程所学知识分析结果。五、实验原
2、理离散傅里叶变换(DFT),是傅里叶变换在时域和频域上都呈现离散的形式,将时域信号的采样变换为在离散时间傅里叶变换(DTFT)频域的采样。在实际应用中通常采用快速傅里叶变换以高效计算DFT。六、实验步骤1)连接硬件断开所有电源,参考实验二连接好信号源、EZ-KIT板、微机、示波器等并检查EZ-KIT板上的跳线状态是否正确,按照硬件连接图检查确保正确连接各个硬件设备。下图为EZ-KIT板上信号的输入,输出通道定义,本次实验均使用的是Channel_1通道。2)加电和启动程序检查无误后,分别打开PC机、信号源、评估板和示波器的电源,启动VisualDSP+,新建一个工程,工程名称自定义,正确设置工
3、程的各个选项,将源程序加入到工程中。3) 选择或者建立正确的会话类型按照要求选择或者建立EZ-KIT类型的会话,详细要求请参阅之前实验的有关内容。4)编译链接运行程序编译链接该工程。在程序中恰当位置设置断点(如main函数中的“optr = OutputBuffer;”程序行前),利用VisualDSP+软件的Plot功能,分别绘制ADC数据数组tempdata 和 频谱数组数据Magnitude的数值。4) 改变信号再观察调节信号发生器,利用示波器监视其输出幅度为0.51Vpp,频率为14kHZ。分别产生正弦波、方波和三角波,观察并记录示波器上的输出结果,或者利用VisualDSP+的Plo
4、t功能进行记录。七、主要源代码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点数据后,转入数据处理,并且将处理结果送回COD
5、EC,通过它的D/A转换成模拟信号。连续运行时,程序处于数据采集数据处理等待数据采集(256点)的无限循环中,直到被用户干预停止。3、数据采集和处理模式的切换:程序设置了全局整形变量Ready2FFT标志当前工作状态。若Ready2FFT=0时,工作在数据采集模式,此模式下中断程序每触发一次,程序从外部的SPORT_RX送一个数据到BF533内部缓冲区InbufLeft和InbufRight,当采集到256个数据后,子程序Process_data()会自动设置Ready2FFT=1,即进入数据处理阶段。数据处理结束后,重新进入数据采集阶段开始新的循环。4、数据处理方法:当Ready2FFT=1
6、时,程序把采集到的整形数据转化为浮点数据,然后将得到的浮点数据与窗函数进行相乘运算,经过这样预处理后的数据再转换为16位小数型数据,通过调用系统函数rfftrad4_fr16 ()进行傅里叶变换,再求模值,然后对模值进行适当的处理,最后得到的浮点结果转化为整形数据,输出到示波器。程序中用到的几个主要数据变量的用途说明如下: int window ; /选择窗函数的形式。0:矩形窗;1:汉明窗。 int Counter0; / 采集到的数据样本数计数器 int OutputMum; /发送数据到DAC的索引计数器 int tempdataFFT_NUM; / 存放采样数据,可用plot功能描绘
7、fract16 outputFFT_NUM; / 存放FFT变换后得到的数据 float MagnitudeFFT_NUM; /存放FFT变换后得到的频谱幅度 int OutputBufferFFT_NUM; /存放输出频谱数据实验三使用的源程序位于子目录test3FFT目录下,打开工程文件FFT.DPJ,可以看到程序由以下几个模块构成:1)talkthough.h#ifndef _Talkthrough_DEFINED #define _Talkthrough_DEFINED/-/ Header files /-/#include #include /-/ Symbolic constant
8、s /-/ addresses for Port B in Flash A#define pFlashA_PortA_Dir (volatile unsigned char *)0x20270006#define pFlashA_PortA_Data (volatile unsigned char *)0x20270004/ names for codec registers, used for sCodec1836TxRegs#define DAC_CONTROL_1 0x0000#define DAC_CONTROL_2 0x1000#define DAC_VOLUME_0 0x2000#
9、define DAC_VOLUME_1 0x3000#define DAC_VOLUME_2 0x4000#define DAC_VOLUME_3 0x5000#define DAC_VOLUME_4 0x6000#define DAC_VOLUME_5 0x7000#define ADC_0_PEAK_LEVEL 0x8000#define ADC_1_PEAK_LEVEL 0x9000#define ADC_2_PEAK_LEVEL 0xA000#define ADC_3_PEAK_LEVEL 0xB000#define ADC_CONTROL_1 0xC000#define ADC_CO
10、NTROL_2 0xD000#define ADC_CONTROL_3 0xE000/ names for slots in ad1836 audio frame#define INTERNAL_ADC_L0 0#define INTERNAL_ADC_R0 2#define INTERNAL_DAC_L0 0#define INTERNAL_DAC_R0 2#define INTERNAL_ADC_L1 1#define INTERNAL_ADC_R1 3#define INTERNAL_DAC_L1 1#define INTERNAL_DAC_R1 3/ size of array sCo
11、dec1836TxRegs#define CODEC_1836_REGS_LENGTH 11/ SPI transfer mode#define TIMOD_DMA_TX 0x0003/ SPORT0 word length#define SLEN_24 0x0017/ DMA flow mode#define FLOW_1 0x1000/#define FFT_NUM 256/-/ Global variables /-/extern int iChannel0LeftIn;extern int iChannel0RightIn;extern int iChannel0LeftOut;ext
12、ern int iChannel0RightOut;extern int iChannel1LeftIn;extern int iChannel1RightIn;extern int iChannel1LeftOut;extern int iChannel1RightOut;extern volatile short sCodec1836TxRegs;extern volatile int iRxBuffer1;extern volatile int iTxBuffer1;extern int Counter;extern int OutputMum;extern int Window;ext
13、ern int ReadyFFT;extern float Win;extern int InbufLeft;extern int Outputbuf;/-/ Prototypes /-/ in file Initialize.cvoid Init_EBIU(void);void Init_Flash(void);void Init1836(void);void Init_Sport0(void);void Init_DMA(void);void Init_Interrupts(void);void Init_ProcessData(void);void Init_Windows(void);
14、void Enable_DMA_Sport(void);/ in file Process_data.cvoid Process_Data(void);/ in file ISRs.cEX_INTERRUPT_HANDLER(Sport0_RX_ISR);#endif /_Talkthrough_DEFINED2)main.c/-/ Name: Talkthrough for the ADSP-BF533 EZ-KIT Lite /-/ (C) Copyright 2003 - Analog Devices, Inc. All rights reserved. / Project Name:
15、BF533 C Talkthrough I2S / Date Modified: 04/03/03 HD Rev 1.0 / Software: VisualDSP+3.1 / Hardware: ADSP-BF533 EZ-KIT Board / Connections: Connect RSCLK0 to TSCLK0 together (Turn SW9 pin 6 on) / Connect RFS0 to TFS0 together (Turn SW9 pin 5 ON) / / Connect an input source (such as a radio) to the Aud
16、io / input jack and an output source (such as headphones) to / the Audio output jack / Purpose: This program sets up the SPI port on the ADSP-BF533 to / configure the AD1836 codec. The SPI port is disabled / after initialization. The data to/from the codec are / transfered over SPORT0 in I2S mode /-
17、/#include Talkthrough.h#include sysreg.h#include ccblkfn.h#include #include #include #include complex_fract16 tFFT_NUM; /temp workingcomplex_fract16 OutbufFFT_NUM;complex_fract16 wFFT_NUM; /twiddle sequencefract16 InputFFT_NUM;int InbufLeftFFT_NUM;int Window;/窗函数状态标志:0-矩形窗,1-汉明窗float MagnitudeFFT_NU
18、M;/输出频谱的幅度int tempdataFFT_NUM;int ReadyFFT;int OutputbufFFT_NUM;/-/ Variables / Description: The variables iChannelxLeftIn and iChannelxRightIn contain / the data coming from the codec AD1836. The (processed) / playback data are written into the variables / iChannelxLeftOut and iChannelxRightOut res
19、pectively, which / are then sent back to the codec in the SPORT0 ISR. / The values in the array iCodec1836TxRegs can be modified to / set up the codec in different configurations according to / the AD1885 data sheet. /-/ left input data from ad1836int iChannel0LeftIn, iChannel1LeftIn;/ right input d
20、ata from ad1836int iChannel0RightIn, iChannel1RightIn;/ left ouput data for ad1836 int iChannel0LeftOut, iChannel1LeftOut;/ right ouput data for ad1836int iChannel0RightOut, iChannel1RightOut;/ array for registers to configure the ad1836/ names are defined in Talkthrough.hvolatile short sCodec1836Tx
21、RegsCODEC_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 ;/ SPORT0 DMA transmit bu
22、ffervolatile int iTxBuffer14;/ SPORT0 DMA receive buffervolatile int iRxBuffer14;/-/ Function: main / Description: After calling a few initalization routines, main() just / waits in a loop forever. The code to process the incoming / data can be placed in the function Process_Data() in the / file Pro
23、cess_Data.c. /-/void main(void) Window=1; sysreg_write(reg_SYSCFG, 0x32); /Initialize System Configuration Register Init_EBIU(); Init_Flash(); Init1836(); Init_ProcessData(); Init_Windows(); Init_Sport0(); Init_DMA(); Init_Interrupts(); Enable_DMA_Sport0(); while(1) if(ReadyFFT=1) int i; /* counter
24、variable */ int wst = 1; int n = FFT_NUM; int *optr; float *fptr; float MinNum,MaxNum,AvgNum,NumRange; int block_exponent = 8; int scale_method = 2; int offset; float scale_value; twidfft_fr16(w, FFT_NUM); for (i=0;i16)*Wini); Inputi=tempdatai; offset = 50; scale_value = 25.0; /* do FFT.*/ rfftrad4_
25、fr16(Input, t, Outbuf, w, wst, n, block_exponent, scale_method); for(i=0;iFFT_NUM;i+) Magnitudei=sqrt(float)Outbufi.re*(float)Outbufi.re+(float)Outbufi.im*(float)Outbufi.im); /对结果进行对数量化/ for(i=0;iFFT_NUM;i+)/计算频谱的幅度的对数值 Magnitudei=20*log10(Magnitudei+1); MinNum = 32767;MaxNum = -32768;/量化为D/A格式 AvgNum = 0; fptr = &Magnitude0; for( i=0 ; i
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1