DSP实习报告

更新时间:2024-01-17 08:17:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

DSP实习报告

——离散余弦变换(DCT)算法设计

姓名:张慧

班级:信息10-1

学号:201016050136

指导老师:刘柏生 董胜 刘岩

1

引言

在信息世界快速发展的今天,人们对计算机实时处理图像信息的要求越来

越高。如何在保证图像质量的前提下,同时兼顾实时性和高效性成了一个值得关注的问题。于是对图像信息进行一定的压缩处理成了一个不可或缺的环节。图像压缩是关于用最少的数据量来表示尽可能多的原图像的信息的一个过程。 在有关图像压缩的众多正交变换中,离散余弦变换(DCT)是十分有效的一种,其性能极为接近最佳的K-L变换。通过采用行列分解方法,人们只需使用少量的乘法就能完成二维离散余弦变换。正因为如此,DCT就被众多标准广泛使用。

离散余弦变换(Discrete Cosine Transform,简称DCT)常被认为是对语音和图像信号进行变换的最佳方法。为了工程上实现的需要,国内外许多学者花费了很大精力去寻找或改进DCT的快速算法。由于近年来DSP的发展,加上专用集成电路设计上的优势,这就牢固地确立DCT在目前图像编码中的重要地位,成为H.261、JPEG、MPEG等国际上公用的编码标准的重要环节。MATLAB是由美国Math-Works公司推出的用于数值计算和图形处理的科学计算软件,它集数值分析、矩阵计算、信号处理和图形显示多种功能于一体,构成了一个方便的界面友好的用户环境。MATLAB中的图像处理工具箱是许多基于MATLAB技术计算环境的函数包的集合,图形功能完备。

本文主要讨论了DCT变换方法,并讨论了应用MATLAB中的图像处理工具箱中的相关函数和命令来实现离散余弦变换的图像压缩算法的仿真。

2

目录

一、 实习题目。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。4 二、 实习目的。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。4 三、 实习任务与要求。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。4 四、 软件介绍。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。4

4.1、CCS软件介绍。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。4 4.2、TMS320VC5509A开发板介绍:。。。。。。。。。。。。。。。。。。。。。。。。4 五、DCT算法原理及设计思路。。。。。。。。。。。。。。。。。。。。。。。。。。。。。4 5.1、DCT算法原理。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。4 5.2、设计思路:。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。5 六、离散余弦变换的具体步骤和实现。。。。。。。。。。。。。。。。。。。。。。5 七、源程序代码。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。11 八、硬件电路设计。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 35 九、实习心得。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。37 十、参考文献。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。38

3

一、实验题目:离散余弦变换(DCT)算法设计 二、实验目的:

1、熟练掌握数字信号处理的典型设计方法与技术手段; 2、熟悉电子CAD制图与PCB板的制作方法; 3、掌握常用电子仪器设备的使用方法;

4、亲自动手完成一个DSP系统的设计与实现。 5、学习DCT算法的实现方法。

三、实习任务与要求:

(1) 利用C语言或汇编语言编写一个实现DCT的DSP程序 (2) 在CCS上仿真运行

(3) 查看分析结果,记录必要参数

四、软件介绍: 4.1、CCS软件介绍:

Code Composer Studio(CCS或CCStudio)是一种针对TI的DSP、微控制器和应用处理器的集成开发环境。CCS包括一套用于开发和调试嵌入式应用程序CCS包括套用于开发和调试嵌入式应用程序的工具。它包括用于各种TI设备系列的编译器、源代码编辑器项目生成环境调试程序探源代码编辑器、项目生成环境、调试程序、探查器、模拟器和其他许多功能。CCS提供一个单一用户界面,指导用户完成应用程序开发流程的每一步骤。CCS提供了基本的代码生成工具,它们具有一系列的调试、分析能力。 CCS集成的软件工具:

(1)代码生成工具(包括C6000的C编译器、汇编优化编和连接化器、汇编器和连接器)(2)软件模拟器(Simulator)。(3)实时基础软件DSP/BIOS。(4)主机与目标机之间的实时数据交换软件RTDX机与目标机间的实时数据交换软件?Real‐Time Data Exchange提供了实时的和连续的途径,以观察目标应用程序的真实运行情况。它允许系统开发者在主机和目标设备间传输数据而不对目标应开发者在主机和目标设备间传输数据而不对目标应用造成影响。实时分析与数据可视化

4.2、TMS320VC5509A开发板介绍:

DSP5509开发板是一套功能齐全的基于TMS320VC5509A DSP的学习开发平台,DSP5509开发板既可作为开发板供用户学习使用,也可作为系统板嵌入到用户的产品供用户进行二次开发以便缩短产品开发周期。能进行声音的处理。图像的压缩等。是迄今为止市面上性价比最高的5509开发板。

五、DCT算法原理及设计思路: 5.1、DCT算法原理

离散余弦变换(Discrete Cosine Transform,简称DCT变换)是一种与傅立叶变换紧密相关的数学运算,属于正弦类正交变换,由于其优良的去冗余性能及高效快速算法的可实现性,被广泛用于语音及图象的有损和无损压缩。在傅立叶级数展开式中,如果被展开的函数是实偶函数,那么其傅立叶级数中只包含余弦项,再将其离散化可导出余弦变换,因此称之为离散余弦变换。对于给定的实际数据序列x(0),X(1) ,x(2).... X( N-1 )的DCT(FDCT)算法如下:

正变换:

4

z(k)?其中:

N?12??(2n?1)k??(k)?x(n)cos??N2N??n?0

1?(k)? for k=02

?(k)?1 for k?0二维离散余弦变换(FDCT):

N?1N?12????(2m?1)k???(2n?1)l?z(k,l)????(k)?(l)??x(m,n)cos?cos????N?2N???2N?n?0m?0

其逆运算是:

N?1N?1?2???(2m?1)k???(2n?1)l?x(m,n)????(k)?(l)??z(k,l)cos?cos????N?2N???2N?k?0l?0

本实习中,我们只进行一维变换。

5.2、设计思路:

对于这个题目,首先得弄明白三个问题:1、什么是离散余弦变换?离散余弦变换

(Discrete Cosine Transform,简称DCT变换)是一种与傅立叶变换紧密相关的数学运算,属于正弦类正交变换。2、要进行离散余弦变换,途径是什么?离散余弦变换可通过公式来进行算法实现。3、怎么去实现?通过程序的编写,进行软件和硬件的结合来实现离散余弦变换的仿真的观察。

弄清楚这三个问题,就可以去具体实现的设计了,余弦变换的前提是得有信号输入,所以,首先通过5509硬件的搭接,通过5509的音频输入从外界输入一个音频信号,通过5509键盘选择好通道,将音频信号进行A/D转换,然后将所编写的程序下载到5509开发板上,最后将A/D转换后的输入信号进行DCT变换,仿真出波形。而在程序的编写上,关键是DCT变换公式的编写,首先定义好长度,要进行正变换和逆变换需要设置三个变量,一个用于信号的输入,一个用于表示对输入信号的正变换,一个用于对变换后的信号进行重构,也就是DCT逆变换,然后对输入的语音信号进行采集,将采集的语音信号进行累加求和、取平均值等一系列处理,最后通过对公式进行程序编写,让其实现离散余弦的正变换和逆变换。

六、离散余弦变换的具体步骤和实现: 1、CCS的设置

打开CCS软件,选择C55XX系列,选择C5509 TDS510USB 2.0 Emulate,右键单击CPU_1,value栏选择C5509.gel——打开——ok——save&quite——是

5

2、新建工程

新建一个文件夹,名为DCT,新建一个项目project——New——example,所建项目保存到新建文件夹下

3、建立源程序

File——New——source file,然后进行程序编写,并且保存在工程文件夹下

4、导入源程序:

Project——Add File to Project将程序导入到当前工程下,在example的source下能看到程序

6

5、编译构建:

Project工具栏下的Rebuild All,将在构建窗口显示结果

7

6、链接5509

Debug——connecte

7、加载:File——Load Program——工程下的Debug——example.out

8、设

置断点:在m=0处设置断点

8

9、回

到主函数

Debug——Go main

10、观察仿真波形

用View / Graph / Time/Frequency打开两个图形观察窗口;采用双踪观察在启始地址分别为x和y,长度为128的单元中数值的变化,数值类型为32位浮点型,这两个数组分别存放的是经A/D转换的输入信号和对该信号进行DCT变换的结果

9

再打开一个图形观察窗口,设置观察变量为y和z;变量z为输入信号的DCT变换及逆DCT变换的结果,长度128,32位浮点型,即输入信号的重构信号

单击“Animate”运行程序,调整各图形观察窗口,动态观察变换结果;改变输入信号的波形、频率、幅值,动态观察变换结果 正变换波形

10

逆变换波形

七、源程序代码

1主程序

//********************************************************* #include \#include

//********************************************************* #define pi 3.1415927 #define Len 128

//----------------------------------------------------------- void dct1c2 (double x[Len], double y[Len]); void idct1c2 (double y[Len], double z[Len]);

11

//-----------------------------------------------------------

double x[Len],y[Len],z[Len],temp[Len]; int in_x[Len]; int m = 0;

int intnum = 0; double xmean=0; int i=0; int flag = 0;

/**********************************************************/ void main() { unsigned int ii;

//----------------------------------- initial_sys(); mcbsp2_close(); asm(\

initial_aic23(); delayMs_SYS(1); mcbsp2_init();

mcbsp2_open();

//------------------------------------ while(1) { for(ii=0;ii!=Len;ii++) { mcbsp2_read_rdy(); //read_data2 = DRR2_2; in_x[ii] = DRR1_2; } { xmean = 0.0; for (i=0; i

12

{ x[i] = (double)(in_x[i] - xmean); } dct1c2 (x,y); idct1c2 (y,z); } m=0; //设置断点 m=0; } }

//---------------------------------------------------------- void dct1c2 (double x[Len], double y[Len]) { double s,t; int i,j; s=0.0;

for (i=0; i

for (i=1; i

y[0]=s/(sqrt(Len/1.0)); }

void idct1c2(double y[Len], double z[Len]) { double t; int i,j; for (i=0; i

13

for (j=0; j

/***************** end *************************************/

/***************** end *************************************/ 2、aic_23芯片程序

//-------------------------------------------------------- #include \#include \

unsigned int cpld_ctrl_back = 0xe7;

//-------------------------------------------------------- #define AIC23_ADDR 0x34

extern void delayMs_SYS(unsigned int msecond); extern void delayUs_SYS(unsigned int usecond);

extern void mcbsp2_init(void);

extern void mcbsp2_write_rdy(unsigned int out_data1,unsigned int out_data2);//MCBSP1发送一个数据32位

extern void mcbsp2_read_rdy(void); extern void mcbsp2_open(void); extern void mcbsp2_close(void);

extern void Delay(int numbers);

/****************************************************************/ //------------------------------------------------------------- void mcbsp2_init(void) {

SPCR1_2 = 0; SPCR2_2 = 0; delayUs_SYS(10); RCR1_2 = 0x00A0; RCR2_2 = 0x00A0; XCR1_2 = 0x00A0; XCR2_2 = 0x00A0; PCR2 = 0x000D;

14

}

void mcbsp2_write_rdy(unsigned int out_data1,unsigned int out_data2) {

while ((SPCR2_2 & 0x0002) == 0); DXR2_2 = out_data2; DXR1_2 = out_data1; }

void mcbsp2_read_rdy(void) {

while((SPCR1_2 & 0x0002) == 0); }

void mcbsp2_open() {

SPCR1_2 = SPCR1_2 | 0x0001; SPCR2_2 = SPCR2_2 | 0x0001; }

void mcbsp2_close() {

SPCR1_2 = SPCR1_2 & 0xFFFE; SPCR2_2 = SPCR2_2 & 0xFFFE; }

//----------------------------------------------------------------

void AIC23_CLK(unsigned int flag) { if(flag ==0) cpld_ctrl_back &= ~B5_MSK; else cpld_ctrl_back |= B5_MSK; CPLD_CTRL_REG = cpld_ctrl_back; }

void AIC23_DIN(unsigned int flag) { if(flag ==0) cpld_ctrl_back &= ~B6_MSK; else cpld_ctrl_back |= B6_MSK; CPLD_CTRL_REG = cpld_ctrl_back; }

void AIC23_DIN_EN(unsigned int flag) {

15

if(flag ==0) cpld_ctrl_back &= ~B7_MSK; else cpld_ctrl_back |= B7_MSK; CPLD_CTRL_REG = cpld_ctrl_back; }

//----------------------------------------------------------------

void SCLK_DIN23(unsigned int flag_clk,unsigned int flag_din,unsigned int flag_din_en) { if(flag_clk==0) cpld_ctrl_back &= ~B5_MSK; else cpld_ctrl_back |= B5_MSK; if(flag_din==0) cpld_ctrl_back &= ~B6_MSK; else cpld_ctrl_back |= B6_MSK; if(flag_din_en == 0) cpld_ctrl_back &= ~B7_MSK; else cpld_ctrl_back |= B7_MSK; CPLD_CTRL_REG = cpld_ctrl_back; }

//---------------------------------------------------------------- void set_aic23_sci_mode() {

// AIC23_CS(0); AIC23_DIN_EN(1); AIC23_DIN(1); AIC23_CLK(1); delayMs_SYS(3); AIC23_DIN_EN(1); AIC23_DIN(1); delayMs_SYS(10); }

//---------------------------------------------------------------- void send_aic23_bit(unsigned int dat) { delayMs_SYS(2); SCLK_DIN23(0,dat,1); delayMs_SYS(2); AIC23_CLK(1);

16

}

//----------------------------------------------------------------

void send_aic23_ctrl_reg(unsigned int dat) { unsigned int temp_dat; unsigned int flag; AIC23_CLK(1); delayMs_SYS(3); AIC23_DIN_EN(1); AIC23_DIN(1); delayMs_SYS(10); AIC23_DIN(0); //start delayMs_SYS(3); AIC23_CLK(0); delayMs_SYS(3); //SEND ADDRESS temp_dat = (AIC23_ADDR | 0x00); //write only { flag = 0x80; AIC23_DIN((flag & temp_dat)); delayMs_SYS(2); AIC23_CLK(1); for(flag = 0x40;flag != 0;flag >>=1) { send_aic23_bit(flag & temp_dat); } } SCLK_DIN23(0,0,0); delayMs_SYS(2); AIC23_CLK(1); delayMs_SYS(2); //ack AIC23_CLK(0); //是否需要同时输出 SDIN //SEND HIGNT BYTE temp_dat = (dat >> 8); { flag = 0x80; SCLK_DIN23(0,(flag & temp_dat),1);

17

}

delayMs_SYS(2); AIC23_CLK(1); for(flag = 0x40;flag != 0;flag >>=1) { send_aic23_bit(flag & temp_dat); } }

SCLK_DIN23(0,0,0); delayMs_SYS(2); AIC23_CLK(1); delayMs_SYS(2); //ack AIC23_CLK(0); //是否需要同时输出 SDIN

//SEND LOW BYTE temp_dat = dat; { flag = 0x80; SCLK_DIN23(0,(flag & temp_dat),1); delayMs_SYS(2); AIC23_CLK(1); for(flag = 0x40;flag != 0;flag >>=1) { send_aic23_bit(flag & temp_dat); } }

SCLK_DIN23(0,0,0); delayMs_SYS(2); AIC23_CLK(1); delayMs_SYS(2); //ack AIC23_CLK(0); //是否需要同时输出 SDIN

AIC23_DIN(0); AIC23_DIN_EN(1); delayMs_SYS(2);

AIC23_CLK(1); delayMs_SYS(1); AIC23_DIN(1);

18

void reset_aic23() {

send_aic23_ctrl_reg(0x1e00); //REG10 RESET AIC23 delayUs_SYS(100); }

void initial_aic23(void) { set_aic23_sci_mode(); reset_aic23();

send_aic23_ctrl_reg(0x0117); //REG0 Left line input channel volume control //send_aic23_ctrl_reg(0x0110); //REG0 Left line input channel volume control asm(\ //Address (bits 15-9) 0000000

//LRS (bits 8) 1 Left/right line simultaneous volume/mute update Enabled

//LIM (bits 7) 0 Left line input mute 0 = Normal

//XX (bits 6-5) 00 Reserved //LIV[4:0] (bits 4-0) 10111 Left line input volume control (10111 = 0 dB default)

//-----0000 0001 0001 0111

send_aic23_ctrl_reg(0x0317); //REG1 Right Line Input Channel Volume Controlxxxxxxxx

//send_aic23_ctrl_reg(0x0310); //REG1 Right Line Input Channel Volume Controlxxxxxxxx

asm(\ //Address (bits 15-9) 0000001

//RRS (bits 8) 1 Left/right line simultaneous volume/mute update Enabled

//RIM (bits 7) 0 Left line input mute 0 = Normal

//XX (bits 6-5) 00 Reserved

//RIV[4:0] (bits 4-0) 10111 Left line input volume control (10111 = 0 dB default)

//-----0000 0011 0001 0111

//send_aic23_ctrl_reg(0x05f9); //REG2 Left Channel Headphone Volume Control send_aic23_ctrl_reg(0x043f);

asm(\ //Address (bits 15-9) 0000010

//LRS (bits 8) 1 Left/right headphone channel simultaneous volume/mute update 1 = Enabled

19

//LZC (bits 7) 1 Left-channel zero-cross detect 0 = Off

//LHV[6:0] (bits 6-0) 1111001 Left Headphone volume control (1111001 = 0 dB default)

//-----0000 0101 1111 1001

//send_aic23_ctrl_reg(0x07f9); //REG3 Right Channel Headphone Volume Control send_aic23_ctrl_reg(0x0670); //REG3 Right Channel Headphone Volume Control asm(\ //Address (bits 15-9) 0000011

//RLS (bits 8) 1 Left/right headphone channel simultaneous volume/mute update 1 = Enabled

//RZC (bits 7) 1 Left-channel zero-cross detect 0 = Off

//RHV[6:0] (bits 6-0) 1111001 Left Headphone volume control (1111001 = 0 dB default)

//-----0000 0111 1111 1001

// mcbsp2_write_rdy(0x0810); //选择线性输入

//send_aic23_ctrl_reg(0x0814); //选择麦克风输入 send_aic23_ctrl_reg(0x0815); //选择麦克风输入

asm(\ //REG4 Analog Audio Path Control //Address (bits 15-9) 0000100

//X (bits 8) 0 Reserved

//STA[1:0] (bits 7-6) 00 Sidetone attenuation 00 = –6 dB

//STE (bits 5) 0 Sidetone enable 0 = Disabled

//DAC (bits 4) 1 DAC select 1 = DAC selected

//BYP (bits 3) 0 Bypass 0 = Disabled 1=Enabled,ONLY FOR TEST

//INSEL (bits 2) 0 Input select for ADC 0 = Line

//MICM (bits 1) 0 Microphone mute 0 = Normal

//MICB (bits 0) 0 Microphone boost 0=OdB

//-----0000 1000 0001 0000

send_aic23_ctrl_reg(0x0A01); //REG5 Digital Audio Path Control //send_aic23_ctrl_reg(0x0A05); //REG5 Digital Audio Path Control asm(\ //Address (bits 15-9) 0000101

//X (bits 8-4) 00000 Reserved

20

//DACM (bits 3) 0 DAC soft mute 0 = Disabled

//DEEMP[1:0] (bits 2-1) 00 De-emphasis control 00 = Disabled

//ADCHP (bits 0) 1 ADC high-pass filter 1 = Enabled

//----- 0000 1010 0000 0001

send_aic23_ctrl_reg(0x0C00); //REG6 Power Down Control //send_aic23_ctrl_reg(0x0C01); //REG6 Power Down Control asm(\ //Address (bits 15-9) 0000110

//X (bits 8) 0 Reserved

//OFF (bits 7) 0 Device power 0 = On

//CLK (bits 6) 0 Clock 0 = On //OSC (bits 5) 0 Oscillator 0 = On

//OUT (bits 4) 0 Outputs 0 = On

//DAC (bits 3) 0 DAC 0 = On //ADC (bits 2) 0 ADC 0 = On //MIC (bits 1) 0 Microphone input 0 = On

//LINE (bits 0) 0 Line input 0 = On

//----- 0000 1100 0000 0000

send_aic23_ctrl_reg(0x0E73); //REG7 Digital Audio Interface Format asm(\ //Address (bits 15-9) 0000111

//X (bits 8-7) 00 Reserved

//MS (bits 6) 1 Master/slave mode 1 = Master

//LRSWAP (bits 5) 1 DAC left/right swap 1 = Enabled

//LRP (bits 4) 1 DAC left/right phase,1 = Right channel on, LRCIN low; \mode\1 = MSB is available on 2nd BCLK rising edge after LRCIN rising edge

//IWL[1:0] (bits 3-2) 00 Input bit length 00 = 16 bit

//FOR[1:0] (bits 1-0) 11 Data format 11 = DSP format, frame sync followed by two data words //----- 0000 1110 0111 0011

//send_aic23_ctrl_reg(0x108C); //8KHZ采样频率

21

send_aic23_ctrl_reg(0x101C); //96KHZ采样频率

//REG8 Sample Rate Control asm(\ //Address (bits 15-9) 0001000

//X (bits 8) 0 Reserved //CLKOUT (bits 7) 0 Clock input divider 0 = MCLK

//CLKIN (bits 6) 0 Clock output divider 0 = MCLK

//SR[3:0] (bits 5-2) 0011 MCLK = 12.288 MHz, sampling rates=8KHZ

//BOSR (bits 1) 0 Base oversampling rate Normal mode: 0 = 256 fs

//USB/Normal(bits 0) 0 Clock mode select: 0 = Normal

//----- 0001 0000 0000 1100

send_aic23_ctrl_reg(0x1201); //REG9 Digital Interface Activation asm(\ //Address (bits 15-9) 0001001

//X (bits 8-1) 00000000 Reserved //ACT (bits 0) 1 Activate interface 1 = Active }

//--------------------结束---------------------------------------- 3、初始化程序 .asg #6c00h, EBSR .asg #07fdh, SYSR .asg #0800h,EGCR .asg #0801h,EMIRST .asg #0802h,EMIBE .asg #0803h,CE01 .asg #0804h,CE02 .asg #0805h,CE03 .asg #0806h,CE11 .asg #0807h,CE12 .asg #0808h,CE13 .asg #0809h,CE21 .asg #080ah,CE22 .asg #080bh,CE23 .asg #080ch,CE31 .asg #080dh,CE32 .asg #080eh,CE33

22

.asg #080fh,SDC1 .asg #0810h,SDPER .asg #0811h,SDCNT .asg #0812h,INIT .asg #0813h,SDC2 .asg #0814h,SDC3

.asg #3400h, IODIR .asg #3401h, IODATA .asg #0001h, ICR .asg #0002h, ISTR

.text

.cpl_off_ke .macro .cpl_off bit(st1,#14)= 0 .endm

.cpl_on_ke .macro .cpl_on bit(st1, #14) = 1 .endm .def _initial_sys _initial_sys:

************ initial the state register ********************************* *port(IODATA)= #1fh *port(IODIR) = #70h *port(IODATA)= #1fh bit(st1, #13) = #1 xar0=#0h nop ar0=#02h *ar0=#3800h ar0+=#1 *ar0=#6100h xdp=#0 ar0=*abs16(#01h) ar0=*abs16(#46h)

23

bit(st1,#11)=#1 bit(st1,#10)=#0 bit(st1,#7)=#0 bit(st1,#9)=#0 bit(st1,#8)=#0 xar0=#0 nop *ar0=#0

frequencySet_pll: ar3=#1c00h *port(#1c00h) = #2610h

again_pll_sub: tc1=bit(*ar3,#0) || readport() if(!tc1) goto again_pll_sub *port(#7fdh)=#000b *port(EBSR)=#9a01h *port(ICR) = #002fh *port(SYSR)=#0000h *port(EMIRST)=#0ffffh ar0=*port(EGCR) bit(ar0,@#5)=#0 *port(EGCR)=ar0 ar0=*port(EGCR) bit(ar0, @#9)=#1 bit(ar0, @#10)=#0 bit(ar0, @#11)=#0 *port(EGCR)=ar0 ar0=*port(EGCR) bit(ar0, @#4)=#1 *port(EGCR)=ar0 repeat(#5) nop

24

*port(CE01)=#1313h *port(CE02)=#011bh *port(CE03)=#0000h *port(CE11)=#151fh *port(CE12)=#0f75fh *port(CE13)=#0000h *port(CE21)=#3000h *port(CE23)=#0000h *port(CE31)=#3000h *port(CE33)=#0000h *port(SDC1)=#2111h *port(SDPER)=#03e8h *port(SDC2)=#0222h ar0=*port(SDC3) bit(ar0, @#2)=#0 *port(SDC3)=ar0 ar0=*port(EGCR) bit(ar0, @#5)=#1 *port(EGCR)=ar0 repeat(#20) nop_16 *port(INIT)=#0000h repeat(#20) nop_16

*************************************************************** ar0=#49h *ar0=#0002h ar0+=#1 *ar0=#0002h xar0=#0 nop nop *ar0=#0 ar1=*ar0 bit(ar1,@#9)=#0

25

bit(ar1,@#4)=#0 *ar0=ar1 ar0=#45h ar1=*ar0 bit(ar1,@#3)=#0 bit(ar1,@#2)=#0 bit(ar1,@#4)=#0 bit(ar1,@#8)=#0 *ar0=ar1 .cpl_on_ke return

4、中断程序

/****************************************************************/ /*------------------------ 中断服务函数 ------------------------*/

/****************************************************************/ #include \

//---------------------------------------------------------

void interrupt Nmi_isr() //不可屏蔽中断 { ; }

//--------------------------------------------------------- //----------controled by IER0---------- //IV2 -- IV15:

//--------------------------------------------------------- //----------------------------------------------------10---

void interrupt ExtInt0_isr() //中断0中断子程序 { //key int ; }

//----------------------------------------------------18---

void interrupt ExtInt2_isr() //External interrupt #2 {

;

}

//----------------------------------------------------20---

void interrupt Timer0_isr() //Timer #0 interrupt { ; }

//----------------------------------------------------28---

26

void interrupt McbspRint0_isr() //McBSP #0 receive interrupt { ; }

//----------------------------------------------------30---

void interrupt McbspRint1_isr() //McBSP #1 receive interrupt { ;

}

//----------------------------------------------------38---

void interrupt McbspTint1_isr() //McBSP #1 transmit interrupt(MMC/SD1) { ; }

//----------------------------------------------------40---

/************************************************************/ /* USB Interrupt Handler */ /* */ /************************************************************/

void interrupt Usb_isr() //USB interrupt { ; }

//----------------------------------------------------48---

void interrupt Dmac1_isr() //DMA Channel #1 interrupt { ;

}

//----------------------------------------------------50---

void interrupt Dspint_isr() //Interrupt from host { ; }

//----------------------------------------------------58---

void interrupt ExtInt3_isr() //External interrupt #3(WDG) { ; }

//----------------------------------------------------60---

void interrupt McbspRint2_isr() //McBSP #2 receive interrupt { ;

}

27

//----------------------------------------------------68---

void interrupt McbspTint2_isr() //McBSP #2 transmit interrupt(MMC/SD2) { ; }

//----------------------------------------------------70---

void interrupt Dmac4_isr() //DMA Channel #4 interrupt { ; }

//----------------------------------------------------78---

void interrupt Dmac5_isr() //DMA Channel #5 interrupt { ; }

//--------------------------------------------------------- //-------- controled by IER1 -------- //IV16 -- IV23;

//IV24:Berr_INT; IV25:Dlog_INT; IV26:Rtos_INT //--------------------------------------------------------- //----------------------------------------------------80---

void interrupt ExtInt1_isr() //External interrupt #1 { ; }

//----------------------------------------------------88---

void interrupt McbspTint0_isr() //McBSP #0 transmit interrupt { ; }

//----------------------------------------------------90---

void interrupt Dmac0_isr() //DMA Channel #0 interrupt { ; }

//----------------------------------------------------98---

void interrupt ExtInt4_isr() //External interrupt #4(RTC) { ;

} //----------------------------------------------------A0---

void interrupt Dmac2_isr() //DMA Channel #2 interrupt { ;

28

}

//----------------------------------------------------A8---

void interrupt Dmac3_isr() //DMA Channel #3 interrupt { ;

}

//----------------------------------------------------B0---

void interrupt Timer1_isr() //Timer #1 interrupt { ; }

//----------------------------------------------------B8--- void interrupt IIc_isr() //IIC interrupt { ; }

//----------------------------------------------------C0--- void interrupt Berr_isr() //Bus Error interrupt { ;

}

//----------------------------------------------------C8---

void interrupt Dlog_isr() //Data Log interrupt { ; }

//----------------------------------------------------D0---

void interrupt Rtos_isr() //Real-time Operating System interrupt { ; }

//--------------------------------------------------------- //IV27 -- IV31:soft interrupt

//--------------------------------------------------------- //----------------------------------------------------D8---

void interrupt Sint27_isr() //Software interrupt #27 { ; }

//----------------------------------------------------E0---

void interrupt Sint28_isr() //Software interrupt #28 { ;

}

29

//----------------------------------------------------E8---

void interrupt Sint29_isr() //Software interrupt #29 { ;

}

//----------------------------------------------------F0---

void interrupt Sint30_isr() //Software interrupt #30 { ;

}

//----------------------------------------------------F8---

void interrupt Sint31_isr() //Software interrupt #31 { ; }

//---------------------------------------------------------- 5、延时程序 .text .global _delayMs_SYS,_delayUs_SYS ;************************** _delayMs_SYS: .if 0 pshboth(xar0) push(ar1) nop xar0 = _PWM_clockGene push(@BRC0_L) || mmap() push(@BRC1_L) || mmap() ar1 = *ar0(PWM_clockGene_ms) ar1 -= #1 delayMs_loop: brc0 = ar1 brc1 = 99 blockrepeat{ localrepeat{ ; 10 nops. nop nop nop nop nop nop nop

30

nop nop nop } } t0 -= #1 if(t0 != 0) goto delayMs_loop @BRC1_L = pop() || mmap() @BRC0_L = pop() || mmap() ar1 = pop() xar0 = popboth() nop nop .else pshboth(ac0)

_circle2_ForCdelay_sub: ;inner circle ac0=#3fffh

_circle_ForCdelay_sub: ac0-=#1 nop if (ac0!=#0) goto _circle_ForCdelay_sub ;outer circle t0-=#1 ;decrement the ar5 if(t0!=#0) goto _circle2_ForCdelay_sub ;ac2=pop() ac0=popboth() .endif return

_delayUs_SYS: .if 0 pshboth(xar0) push(@CSR_L) || mmap() xar0 = _PWM_clockGene nop nop

delayUs_loop: csr = *ar0(PWM_clockGene_us) repeat(csr) nop nop t0 -= #1

31

if(t0 != 0) goto delayUs_loop @CSR_L = pop() || mmap() xar0 = popboth() nop nop .else pshboth(ac0)

_circle2_ForCdelay_us_sub: ;inner circle ac0=#0fh

_circle_ForCdelay_us_sub: ac0-=#1 nop if (ac0!=#0) goto _circle_ForCdelay_us_sub ;outer circle t0-=#1 ;decrement the ar5 if(t0!=#0) goto _circle2_ForCdelay_us_sub nop ac0=popboth() .endif return 6、中断向量表

.sect \

.ref _c_int00 .ref _Nmi_isr ;Nonmaskable interrupt .ref _Berr_isr ;Bus Error interrupt .ref _ExtInt0_isr,_ExtInt1_isr,_ExtInt2_isr .ref _ExtInt3_isr,_ExtInt4_isr;External interrupt .ref _Timer0_isr,_Timer1_isr;Timer .ref _McbspRint0_isr,_McbspTint0_isr;Mcbsp0 .ref _McbspRint1_isr,_McbspTint1_isr;Mcbsp1 .ref _McbspRint2_isr,_McbspTint2_isr;Mcbsp2 .ref _Usb_isr ;USB .ref _Dmac0_isr,_Dmac1_isr,_Dmac2_isr,_Dmac3_isr,_Dmac4_isr,_Dmac5_isr;DMA .ref _IIc_isr ;IIC .ref _Dlog_isr ;Data Log interrupt .ref _Rtos_isr ;Real-time Operating System interrupt .ref _Sint27_isr,_Sint28_isr,_Sint29_isr,_Sint30_isr,_Sint31_isr ;Software interrupt .ref _Dspint_isr

32

.def _RESET_VEC

;----------------------------------------------- ;-----------中断向量开始

;-----------------------------------------------

;----------------------------------------------------0--- ;sint0

_RESET_VEC .ivec _c_int00 ;,USE_RETA ;硬件或软件复位入口 nop ;可以省略这个语句因为\自动对齐8 BYTE的边界,以下同

;----------------------------------------------------8---

sint1 .ivec _Nmi_isr ;不可屏蔽中断 nop

;----------------------------------------------------10---

sint2 .ivec _ExtInt0_isr ;External interrupt #0 nop

;----------------------------------------------------18---

sint3 .ivec _ExtInt2_isr ;External interrupt #2 nop

;----------------------------------------------------20---

sint4 .ivec _Timer0_isr ;Timer #0 interrupt nop

;----------------------------------------------------28---

sint5 .ivec _McbspRint0_isr ;McBSP #0 receive interrupt nop

;----------------------------------------------------30---

sint6 .ivec _McbspRint1_isr ;McBSP #1 receive interrupt nop

;----------------------------------------------------38---

sint7 .ivec _McbspTint1_isr ;McBSP #1 transmit interrupt(MMC/SD1) nop

;----------------------------------------------------40---

sint8 .ivec _Usb_isr ;USB interrupt nop

;----------------------------------------------------48---

sint9 .ivec _Dmac1_isr ;DMA Channel #1 interrupt nop

;----------------------------------------------------50---

sint10 .ivec _Dspint_isr ;Interrupt from host nop

;----------------------------------------------------58---

sint11 .ivec _ExtInt3_isr ;External interrupt #3(WDG) nop

33

;----------------------------------------------------60---

sint12 .ivec _McbspRint2_isr ;McBSP #2 receive interrupt nop

;----------------------------------------------------68---

sint13 .ivec _McbspTint2_isr ;McBSP #2 transmit interrupt(MMC/SD2) nop

;----------------------------------------------------70---

sint14 .ivec _Dmac4_isr ;DMA Channel #4 interrupt nop

;----------------------------------------------------78---

sint15 .ivec _Dmac5_isr ;DMA Channel #5 interrupt nop

;----------------------------------------------------80---

sint16 .ivec _ExtInt1_isr ;External interrupt #1 nop

;----------------------------------------------------88---

sint17 .ivec _McbspTint0_isr ;McBSP #0 transmit interrupt nop

;----------------------------------------------------90---

sint18 .ivec _Dmac0_isr ;DMA Channel #0 interrupt nop

;----------------------------------------------------98---

sint19 .ivec _ExtInt4_isr ;External interrupt #4(RTC) nop ;----------------------------------------------------A0---

sint20 .ivec _Dmac2_isr ;DMA Channel #2 interrupt nop

;----------------------------------------------------A8---

sint21 .ivec _Dmac3_isr ;DMA Channel #3 interrupt nop

;----------------------------------------------------B0---

sint22 .ivec _Timer1_isr ;Timer #1 interrupt nop

;----------------------------------------------------B8--- sint23 .ivec _IIc_isr ;IIC interrupt nop

;----------------------------------------------------C0--- sint24 .ivec _Berr_isr ;Bus Error interrupt nop

;----------------------------------------------------C8---

sint25 .ivec _Dlog_isr ;Data Log interrupt nop

;----------------------------------------------------D0---

sint26 .ivec _Rtos_isr ;Real-time Operating System interrupt

34

nop

;----------------------------------------------------D8---

sint27 .ivec _Sint27_isr ;Software interrupt #27 nop

;----------------------------------------------------E0---

sint28 .ivec _Sint28_isr ;Software interrupt #28 nop

;----------------------------------------------------E8---

sint29 .ivec _Sint29_isr ;Software interrupt #29 nop

;----------------------------------------------------F0---

sint30 .ivec _Sint30_isr ;Software interrupt #30 nop

;----------------------------------------------------F8---

sint31 .ivec _Sint31_isr ;Software interrupt #31 nop

;---------------------------------------------------- ;-------------END

;----------------------------------------------------

八、硬件电路设计

8.1 、Audio

把输入的模拟信号经过TLV320AIC23芯片转化成数字信号输出,把输出的信号再传送给DSP内部的多通道缓冲串口。

8.2、CPLD:

是复杂可编程逻辑器件,是一种用户根据各自需要而自行构造逻辑功能的数字集成电路,主要用于数据逻辑处理,任何数字器件的功能,它都能完成。

35

8.3、DSP:

信号进入Mcbsp多通道缓冲串口,然后利用U律算法实现编解码,再有另一个Mcbsp将数据传入到Flash存储器。

8.4、KEY:

控制LCD液晶显示和通道功能的选择

36

8.5、LCD:

显示运行中的音频信号的波形变化情况

8.6 POWER:

提供内部DSP的电源。

九、实习心得

这两个星期的DSP实习,我们组实习的是离散余弦变换(DCT)算法设计这个题目,刚开始实习时,根本不知道什么是DCT,后面通过查阅书籍和一些资料,才慢慢明白离散余弦变换是一种与傅立叶变换紧密相关的数学运算,属于正弦类正交变换。通过这次实习,让我对一个全新的事物有了一定的认识和了解。

虽然我们所做的DCT结果出来了,但是还是不太懂其中的原理,在考核时很多东西都不会,但是老师还是很耐心地跟我们讲解。这使我们意识到一定要学好这门

37

课,不仅为了自己能找到一个好的工作,而且也是不辜负老师的教诲。

通过这两周的实习,使我更加了解和认识DSP在实践当中的应用,意识到了它的重要性和可实用性。并且同过这次的实习我们还复习了C语言和汇编语言相结合的应用技术。实习当中老师耐心的讲解和同学们的互相帮助使我明白了团队协作的重要性,我相信这次实习一定会给我的将来的生活和学习带来很大的帮助。

十、参考文献

1、《TMS320C55X DSP原理及应用》汪春梅 孙洪波 编著 2、《TechV-5509使用说明书》

3、算法设计与系统方案. 国防工业出版社. 李枫 潘娜 编著 2004.7 4、DSP实用技术. 西安电子科技大学出版社. 苏涛.卢光跃等编著 2002.6 5、TMS320C54X DSP实验指导书 刘柏生 董胜等编著 2006.8

38

本文来源:https://www.bwwdw.com/article/gv2o.html

Top