Dsp硬件实验报告 - 图文

更新时间:2024-04-10 13:43:01 阅读量: 综合文库 文档下载

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

Dsp硬件实验报告

姓名: 专业: 班级: 班内序号:

1

第一部分.常规实验指导

-----------------------------------------------------------------------------

第一题.常用指令实验

一.实验目的

1.熟悉DSP开发系统的连接

2.了解DSP开发系统的组成和结构和应用系统构成

3.熟悉常用C54X系列指令的用法(程序寻址,寄存器,I/O口,定时器,中断控制)。

二.实验设备

计算机,CCS 2.0版软件,DSP仿真器,实验箱。

三.实验步骤与内容

1、 系统连接

进行DSP实验之前,先必须连接好仿真器、实验箱及计算机,连接方法如下所示:

计 算 机 PCI/USB/EPP 接口 JTAG接口 仿 真 器 用户 开发板 在硬件安装完成后,接通仿真器电源或启动计算机,此时,仿真盒上的“红色小灯”应点亮,否则DSP开发系统与计算机连接有问题。 2、 运行CCS程序

先实验箱上电,然后启动CCS,此时仿真器上的“绿色小灯”应点亮,并且CCS正常启动,表明系统连接正常;否则仿真器的连接、JTAG接口或CCS相关设置存在问题,掉电,检查仿真器的连接、JTAG接口连接,或检查CCS相关设置是否正确。

四.实验结果:

试验箱的“CPLD单元”的指示灯D3以一定频率闪烁,单击“halt”暂停程序运行,则指示灯D3停止闪烁,如再点击“halt”,指示灯D3又开始闪烁

五.实验流程图:

上点复位 加载程序 运行程序 观察现象 六.实验代码:

;************************************************************** ;* 北京达盛科技有限公司 ;* 研 发 部 ;*

;* http://www.techshine.com

;*************************************************************/ ;*

;* 文件名称 : xf.asm

;* 适用平台 : EXPIII+实验系统 ;* CPU类型 : DSP TMS320VC54X

2

;* 软件环境 : CCS3.1 (5000系列)

;* 试验接线 : 1、实验箱的拨码开关SW2.4置OFF(54x的译码有效);54x CPU板的跳线J2的1、2短接

;* (HPI 8位模式);SW1的2、6置ON,其余置OFF(HPI使能;DSP工作微处理器方式;

;* CPU_CS=0);SW2全部置ON(FLASH工作在数据空间,LED灯D5的工作状态处于灭状态);

;* 试验现象 : 可以观察到实验箱CPLD右上方的D3按一定频率闪烁。 ;************************************************************* .mmregs .global _main _main: stm #3000h,sp ;采用立即寻址方式,将立即数3000h存入堆栈指针sp ssbx xf ;xf是由软件控制的外部引脚,用来发送信号给外部设备。将XF置1 call delay ;调用延时子程序,延时 rsbx xf ;将XF置0 call delay ;调用延时子程序, b _main ;程序跳转到\ nop nop

;延时子程序 delay: stm 270fh,ar3 ;将地址270fh存入辅助寄存器ar3 loop1: stm 0f9h,ar4 ;将地址0f9h存入ar4 loop2: banz loop2,*ar4- ;只要ar4中的地址不为0则一直在loop2中循环 banz loop1,*ar3- ;当loop2结束,只要ar3中的地址不为0则一直在loop1处循环 ret ;返回main函数中调用delay函数的地方 nop nop .end

第二题.数据存储实验

一.实验使用资源

本实验指导书是以TMS32OVC5410为例,介绍相关的内部和外部内存资源。对于其它类型的CPU请参考查阅相关的资料手册。下面给出TMS32OVC5410的内存分配表:

3

对于存储空间而言,映像表相对固定。值得注意的是内部寄存器与存储空间的映像关系。因此在编程应用时这些特定的空间不能作其它用途。对于程序存储空间而言,其映像表和CPU的工作模式有关。当MP/MC引脚为高电平时,CPU工作在微处理器模式;当MP/MC引脚低电平时,CPU工作在为计算机模式。具体的内存映像关系如上如所示。

内存实验主要了解内存的操作和DSP的内部双总线结构。并熟悉相关的指令代码和执行过程等。

二.实验过程

连接好DSP开发系统,运行CCS软件;

a) 在CCS的Memory窗口中查找C5410各个区段的数据存储器地址,在可以改

变的存储器内容的地方,选定地址随意改变其中内容并观察结果;

b) 在CCS中装载实验示范程序,单步执行程序,程序中写入和读出的数据存储

地址的变化;

c) 改变其它寻址方式,进行观察数据存储器地址与写入和读出数据的的变化。

三.实验结果:

对0x1000开始的8个地址空间,填入0xaaaa的熟知,然后读出并存储到0x1008

开始的8个地址空间。

四.实验代码:

.mmregs .global _main _main:

4

;store data stm 1000h,ar1 ;将地址1000h存入ar1辅助寄存器 rpt #07h ;循环执行下一条指令,循环次数为立即数#07h,即为8次 st 0aaaah,*ar1+ ;将0xaaaah中的数据存放到以地址1000H~1007H的八个存储单元中. stm 7h,ar3 ;将地址7h放入ar3中 stm 1000h,ar1 ;将地址1000h放入ar1中 stm 1008h,ar2 ;将地址1008h放入ar2中

loop:

;循环的将1000H~1007H的八个单元中的数据COPY到1008H~100F的八个存储单元中. ld *ar1+,t ;取出1000h开始的数据空间中的数据存入t中 st t,*ar2+ ;将t中的数据取出存入由1008H开始的数据空间 banz loop,*ar3- ;循环8次,直到ar3中的地址为0 here: ;死循环. b here .end

五.实验流程图:

上点复位 加载程序 运行程序 观察现象

将数据存入

1000h开始的8

个空间

六.实验截图:

取出1000h开始的8个空间的数据 存入1008h开始的8个地址空间 5

第三题.I/0实验

一.实验使用资源

数字量输入信号全部拓展出来,数字量输入接口主要由两个,D_Exp与扳东开关连接,PX4和PX5与电平转换芯片(74LVC245)连接,其功能分别为:

D_Exp—数字量输入扩展接口 1 2 3 4 5 6 7 8 I0 I1 I2

电平转换扩展接口

1 2 6

9 I3 I4 I5 I6 I7 VCC 3 4 PX4—5V PX5—3.3V IN0 OUT3 IN1 OUT2 IN2 OUT1 IN3 OUT0

二.实验说明:

实验中采用简单的一一映像关系来对I/O口进行验证,目的是使实验者能够对I/O 有一目了然的认识。在本实验系统中,提供的IO空间分配如下:

CPU1:

0x0000 switch input (X) 8 0x0001 LED output(X) 8 CPU2:

0x0001 DAC 0x0004 Read_Key 0x0006 Write_Key 0x000F Write_LCD 0x8000

HPIC0

0x8001 HPIC1 0x8002 HPID0(AUTO) 0x8003 HPID1(AUTO) 0x8004 HPIA0 0x8005 HPIA1

0x8006 HPID0(NO AUTO) 0x8007 HPID1(NO AUTO)

三.实验流程图

四.实验结果:

7

开始 初始化 读入I/O 00h地址的内容 输出到I/O 01h 任意调整k1~k8开关,可以观察到对应led灯“亮”或“灭”

五.实验代码:

.mmregs .global _main .text _main: stm 3100h,sp ;将3100h存入sp,sp为堆栈指针 stm 1000h,ar1 ;将1000h存入ar1 portr 8000h,*ar1 ;读入I/O 端口8000H数据,将其存储地址为1000H的数据空间中 nop ;NOP为空操作,起延时作用. nop portw *ar1,8001h ;将地址为1000H的数据单元的数据,写出到I/O 8001H nop nop b _main ;程序跳转到\执行. nop nop

.end

第四题.定时器实验

一.实验使用资源:

定时器实验时要用到C54芯片的定时器控制寄存器,定时器时间常数寄存器,定时器中断响应,寄存器定义详见C54芯片资料。C54的定时器是一个20位的减法计数器,可以被特定的状态位实现停止、重新启动、重设置或禁止,可以使用该定时器产生周期性的CPU中断,控制定时器中断频率的两个寄存器是定时周期寄存器PRD和定时减法寄存器TDDR

定时器实验通过 LED= 0x4e1f,这样得到每1/1000秒中断一次,通过累计1000次,就能定时1秒钟。

二.实验结果:

(LP1~LP7)来显示。在本系统中,时钟频率为20MHZ,令PRD LED1~LED8每秒交替闪烁一次

三.实验流程:

上点复位 加载程序 运行程序 观察现象 定时中断 计数器计数 每隔1s亮灭一次 四.实验代码:

Exp4.c

8

/************************文件预处理***************************/ #include \

/*************************************************************/

/********************全局变量定义与初始化*********************/ ioport unsigned port8001; //定义io端口为8001h unsigned int show=0x00aa; //show赋初值 unsigned int num=0x0000; //num初值为0

/*************************************************************/

/*******************函数、子程序声明与定义********************/ void sys_ini() //系// tss=1,停止定时器0,TCR是定时器状态统初始化子程序 控制寄存器

{ PRD=0x2710; asm(\ssbx INTM\ ////PRD=10000(D) ,0x2710就是十进制全局禁止所有可屏蔽中断 10000,所以定时周期为10000

PMST&=0x00FF; TCR|=0x000A; //(DRAM映射到程序空间和数据空间)向量//TDDR=10(D),定时器内计数器模值为10,表映射到0x0080空间 所以定时器时钟=(1/20M)*10*10000=5ms

SWWSR=0x7000; IMR=0x0008; //io空间7个等待周期,程序与数据空间0//使能定时器0中断,tint=1

IFR=0xFFFF; 个等待周期

CLKMD=0x17FA; //清除所有中断标志位

asm(\rsbx INTM\ ////CLKOUT= (1+1)*10M=20M,内部时钟频率

} 全局使能可屏蔽中断 TCR&=0xFFEF; void timer0_ini() //定//开始定时器0,TSS=0

TCR|=0x0020; 时器0初始化子程序

{ //复位定时器,TRB=1 TCR|=0x0010;y }

/*************************************************************/

/*****************中断服务子程序声明与定义********************/ interrupt void timer0() //定时器0中断子程序 {

if(num==200) //记200次定时器中断,每次中断间隔5ms,经历时间=200*5ms=1s时show取反

{

show=~show; //取反,现象为每经过1秒led灯交替闪烁一次 num=0; } else

num++; return;

9

}

/*************************************************************/

/**************************主程序*****************************/ void main(void) {

sys_ini(); ;系统初始化 timer0_ini(); ;定时器初始化

for(;;) {

port8001=show; ;将show的值输出给端口8001h } }

/***************************结束******************************/ Vector.asm

.global _c_int00,_timer0 int0: .sect \rete ;EXTERNAL INT0 reset: b nop ;_c_int00 ;RESET VECTORS 直接返回,没有操作 nop nop nop nop nmi: int1: rete ;NMI rete ;EXTERNAL INT1 nop nop nop nop nop nop ; software interrupts int2: sin17: .space 4*16 rete ;EXTERNAL INT2 sin18: .space 4*16 nop sin19: .space 4*16 nop sin20: .space 4*16 nop sin21: .space 4*16 tint0: b _timer0 ;中sin22: .space 4*16 断程序的入口,每过一个定时器周期,就触sin23: .space 4*16 发tint中断,并跳转到c文件中的timer0 sin24: .space 4*16 nop sin25: .space 4*16 nop sin26: .space 4*16 brint0: sin27: .space 4*16 rete ;BcBSP0 RECEIVE sin28: .space 4*16 INTERRUPT sin29: .space 4*16 nop sin30: .space 4*16 nop nop

10

bxint0: brint1_dmac2: rete ;BcBSP0 rete ;McBSP1 TRANSMIT INTERRUPT RECEIVE INTERRUPT OR DMA nop CHANNEL 2 INTERRUPT nop nop nop nop dmac0: nop rete ;RESERVED OR bxint1_dmac3: DMA CHANNEL0 INTERRUPT rete ;McBSP1 nop TRANSMIT INTERRUPT OR DMA nop CHANNEL 3 INTERRUPT nop nop tint1_dmac1: nop rete ;TIMER1 nop INTERRUPT OR DMA CHANNEL1 dmac4: INTERRUPT rete ;DMA CHANNEL nop 4 INTERRUPT nop nop nop nop int3: nop rete ;EXTERNAL INT3 dmac5: nop rete ;DMA CHANNEL nop 5 INTERRUPT nop nop hpint: nop rete ;HPI INTERRUPT nop nop nop nop

; ****************************结束*****************************

第五题.INT2中断实验

一.实验使用资源

本实验是进行C54芯片的INT2中断练习, C54芯片中断INT2是低电平单脉冲触发;实验采用导线一端连接D_Exp—数字量输入扩展接口I0,经PX4的IN3,到PX5的OUT0电平转换,再与另一端连接INT2插孔;拨动开关K0一次,就产生一个低电平单脉冲;运行示范程序,观察LP1~LP7 LED灯的输出变化;可观察到每拨动开关K0一次LP1~LP7灯亮灭变化一次; 二.实验结果:

按键s5产生一个脉冲中断,使LED灯亮灭变化一次

三.实验流程图:

上点复位 加载程序 运行程序 观察现象 11

外部中断 选择不同的存数据写出到端口 LED灯亮灭变化

四.实验代码:

Vector.asm

.sect \

.ref _c_int00 ; C entry point

.ref _int2c

.align 0x80 ; must be aligned on page boundary

RESET: ; reset vector

BD

_c_int00 ; 使RESET中断能指向C程 序的入口c_int00 STM

#200,SP ; 将200存入堆栈指针sp nmi:

RETE ; nmi是非屏蔽外部中断的输入引脚 NOP NOP

NOP ;NMI~

; software interrupts sint17 .space 4*16 sint18 .space 4*16 sint19 .space 4*16 sint20 .space 4*16 sint21 .space 4*16 sint22 .space 4*16 sint23 .space 4*16 sint24 .space 4*16 sint25 .space 4*16

12

sint26 .space 4*16 sint27 .space 4*16 sint28 .space 4*16 sint29 .space 4*16 sint30 .space 4*16

int0: RETE NOP NOP NOP int1: RETE NOP NOP NOP int2: b _int2c ;程序跳转的中断子程序,int2为低电平触发的外部中断 NOP NOP tint: RETE NOP NOP NOP rint0: RETE NOP NOP NOP xint0: RETE NOP NOP NOP

rint1: RETE NOP NOP NOP xint1: RETE NOP Int2.

interrupt void int2c(); //声明中断子程序int2c()

extern void initial(); //初始化系统initial()

extern void porta(); //声明闪烁状态1的函数

extern void portb(); //声明闪烁状态1的函数 int flag=0,i=0; //给变量赋初值 main() { initial();//初始化 while(1) //死循环 { ; //空语句 }

}

interrupt void int2c() //中断子程序 {

i=i+1; if(i==1) { if(flag==0) { flag=1; porta(); //执行函数porta() i=0; } else { flag=0; portb(); //执行函数portb() i=0;

13

NOP

NOP int3: RETE NOP NOP NOP

} } else { i=0; } return; }

Initial.asm .mmregs .global _initial .text _initial: NOP LD #0, DP ; 将9bit数据0装入DP STM #0, CLKMD ; 将#0放入时钟模式寄存器 TstStatu1:

LDM CLKMD, A ;将寄存器clkmd中的值放入累加器A中

AND #01b, A ;将立即数01b放入累加器A中

BC TstStatu1, ANEQ ;条件转移,如果ANEQ中的值不为0,则跳转到teststatu1 STM #0xF7FF, CLKMD ; set C5402 DSP clock to 10MHz STM 0x3FA0, PMST ; vectors at 3F80h,PMST是处理器方式状态寄存器初始化储存器配置情况 ssbx 1,11 ; set st1.intm=1 stop all interrupt,置位 stm #00h,imr ;禁止所有中断 stm #0ffffh,ifr ;清除所有中断

stm #04h,imr ;允许int2中断 rsbx 1,11 ;允许所有可屏蔽中断,状态寄存器复位 ret .end

;处理器的初始化的参量设置。 Port.asm .mmregs .global _porta .global _portb

_porta: stm 304h,ar1 ;将地址304h存入ar1 st 5555h,*ar1 ;将

5555h里的数存入304h指向的地址空间

portw *ar1,8001h ;将5555h里的数据写到端口 ret ;返回调用入口 _portb: stm 304h,ar1 ;将地址304h存入ar1 st 0aaaah,*ar1 ;将 0aaaah里的数存入304h指向的地址空间 portw *ar1,8001h ;将5555h里的数据写到端口 ret ;返回调用入口

第六题.A/D转换实验

一.实验目的

1. 掌握利用TLV320AD50实现A/D转换的技术基本原理和常用方法。 2. 学会DSP的多信道缓冲串口的应用方法。

3. 掌握并熟练使用DSP和AD50的接口及其操作。 4. 通过实验加深对DSP系统频谱混叠认识。

二.实验设备:

计算机,CCS 2.0软件,DSP仿真器,实验箱,示波器,连接导线。

三.实验步骤和内容:

1.实验连线

? 用短接块短接SS1的1,2脚,设置输出低频信号;短接S2 的Sin脚,设置输出

正弦波信号,这时模拟信号产生单元SP1输出为低频正弦波。

? JD跳线断开,设置语音处理单元输入信号为交流;并用导线连接SP1脚和JAD3的1

脚,将模拟低频正弦波信号接入语音处理单元。

? 用导线连接JAD1的INP和INPF,以及JAD2的INM和INMF,将语音处理单元输出的

差动模拟信号接入AD50输入端。

2.运行 CCS 2.0软件, 装入“exp06.pjt”工程文件,双击“exp06.pjt”及“Source”

3.加载“exp06.out”示范程序,在“exp06.c”中“READAD50()”处,

设置断点,运行程序,通过用下拉菜单中的View / Graph的

“Time/Frequency”打开一个图形观察窗口,调节输入信号的频率或幅值, 观察图形情况(幅值和频率),设置该图形观察窗口的参数,观察起始地址为0x1000H,长度为256的内存单元内的数据,该资料为输入信号经A/D转换之后的数据,数据类型为16位整型,击“Animate”运行程序,在图形观察窗口观察A/D转换后的采样波形。

14

四.实验结果:

通过模拟信号源1产生的正弦波信号通过采样量化变成数字信号,再通过图形工具可以绘制图形

五.实验流程图:

上点复位 加载程序 运行程序 观察现象 模拟信号源产生正选波 采样数据定时存入data_buff数组中 画图 六.实验代码:

Exp06.c

/************************文件预处理***************************/ #include \

/*************************************************************/

/********************全局变量定义与初始化*********************/ //ad7822的地址

ioport unsigned port8008; unsigned int data_buff[256]; unsigned int j=0;

/*************************************************************/

/*******************函数、子程序声明与定义********************/

CLKMD=0x37FA; void sys_ini() //系统初

始化子程序 //CLKOUT=(3+1)*CLKIN=40M,自动延时最{ 长时间

} //全局禁止所有可屏蔽中断

asm(\

void int1_ini() //(DRAM映射到程序空间和数据空间)

{ 向量表映射到0x0080空间

PMST&=0x00FF; IMR=0x0002; //io空间7个等待周期,程序与数据空 //使能外部中断1

间0个等待周期,cpu控制寄存器 IFR=0xFFFF; SWWSR=0x7000; //清除所有中断标志位,清除先前的状态

asm(\ //设置pll为div模式,swwsr软件等待

寄存器 //全局使能可屏蔽中断 CLKMD=0x0000; }

//等待设置完成

while(CLKMD==0x0001); interrupt void int1() { //int1中断子程序 } {

15

data_buff[j]=port8008&0x00FF; }

void main(void) //读取ad7822转换数据,取后8位写入数

{ 组data_buff

j++; sys_ini(); if(j==255) int1_ini(); { for(;;) j=0; { } } return; }

/***************************结束******************************/ ; ************************************************************* ; *Copyright (c) 2005,北京精仪达盛科技有限公司研发部 ; *All rights reserved ; *

; *文件名称:vectors.asm

; *备 注:详细请参阅TI文档SPRS096B

; ************************************************************* Vector.asm

.global _main,_int1 sin30: .space 4*16 .sect \ reset: b int0: _main ;RESET VECTORS rete ;EXTERNAL INT0 nop nop nop nop nmi: nop rete ;NMI int1: b _int1 ; nop int1也是低电平触发的外部中断,由 nop ADINT1控制。中断子程序的入口是int1 nop nop ; software interrupts nop sin17: .space 4*16 int2: sin18: .space 4*16 rete ;EXTERNAL INT2 sin19: .space 4*16 nop sin20: .space 4*16 nop sin21: .space 4*16 nop sin22: .space 4*16 tint0: sin23: .space 4*16 rete ;TIMER0 sin24: .space 4*16 INTERRUPT sin25: .space 4*16 nop sin26: .space 4*16 nop sin27: .space 4*16 nop sin28: .space 4*16 brint0: sin29: .space 4*16 rete ;BcBSP0 RECEIVE

16

INTERRUPT nop nop nop nop nop nop brint1_dmac2: bxint0: rete ;McBSP1 rete ;BcBSP0 RECEIVE INTERRUPT OR DMA TRANSMIT INTERRUPT CHANNEL 2 INTERRUPT nop nop nop nop nop nop dmac0: bxint1_dmac3: rete ;RESERVED OR rete ;McBSP1 DMA CHANNEL0 INTERRUPT TRANSMIT INTERRUPT OR DMA nop CHANNEL 3 INTERRUPT nop nop nop nop tint1_dmac1: nop rete ;TIMER1 dmac4: INTERRUPT OR DMA CHANNEL1 rete ;DMA CHANNEL INTERRUPT 4 INTERRUPT nop nop nop nop nop nop int3: rete ;EXTERNAL dmac5: INT3 rete ;DMA CHANNEL nop 5 INTERRUPT nop nop nop nop hpint: nop rete ;HPI INTERRUPT .end

; ****************************结束*****************************

六.实验截图:

产生的正弦波图像

改变频率,提高频率

17

降低频率

改变幅度

观察data_buff地址空间里的数据变化

18

实验七.D/A转换实验

一.实验现象:

通过DSP产生正弦波,再将正弦波的数据以一定的周期通过D/A接口发送出去。示波器可以观察到正弦波 二.实验流程图

上点复位 加载程序 运行程序 观察现象

示波器显示 产生正弦波数用函数转换后

据 通过数据存储

寄存器输出到

示波器

三.实验代码:

四.实验截图:

第二部分.数字滤波器

19

实验一.FFT算法实验

一.实验目的:

加深对DFT算法原理和基本性质的理解;熟悉FFT算法原理和FFT子程序的应用;

学习用FFT对连续信号和时域信号进行谱分析的方法,了解可能出现的分析误差及其原因,以使在实际中正确应用FFT。

二.实验设备:

计算机,CCS3.1版软件,EXPIII+实验箱,DSP仿真器

三.实验代码: Fft.c

/************************文件预处理***************************/ #include \ #include

/*************************************************************/

/********************全局变量定义与初始化*********************/ //ad7822的地址

ioport unsigned port8008; int px[128]; int pz[128];

unsigned int i,j=0,n=128,k=0;

double x[128],pr[128],pi[128],fr[128],fi[128],mo[128]; int xm,zm; int flag = 0;

/*************************************************************/

/*******************函数、子程序声明与定义********************/ void sys_ini() //系统初始化子程序 {

//全局禁止所有可屏蔽中断 asm(\ IMR=0x0000; IFR=0xFFFF;

//(DRAM映射到程序空间和数据空间)向量表映射到0x0080空间 PMST&=0x3FF2;

//io空间7个等待周期,程序与数据空间0个等待周期 SWWSR=0x7FFF;

//设置pll为div模式

CLKMD=0x0000; //等待设置完成

while(CLKMD==0x0001); { }

20

CLKMD=0x37FA; }

void int1_ini() {

IMR=0x0002; //使能外部中断1

IFR=0xFFFF; //清除所有中断标志位 asm(\ //全局使能可屏蔽中断 }

/*************************************************************/ void kfft(pr,pi,n,k,fr,fi,l,il) int n,k,l,il;

double pr[],pi[],fr[],fi[]; { int it,m,is,i,j,nv,l0;

double p,q,s,vr,vi,poddr,poddi; for (it=0; it<=n-1; it++) { m=it; is=0;

for (i=0; i<=k-1; i++)

{ j=m/2; is=2*is+(m-2*j); m=j;} fr[it]=pr[is]; fi[it]=pi[is]; }

pr[0]=1.0; pi[0]=0.0; p=6.283185306/(1.0*n); pr[1]=cos(p); pi[1]=-sin(p); if (l!=0) pi[1]=-pi[1]; for (i=2; i<=n-1; i++)

{ p=pr[i-1]*pr[1]; q=pi[i-1]*pi[1]; s=(pr[i-1]+pi[i-1])*(pr[1]+pi[1]); pr[i]=p-q; pi[i]=s-p-q; }

for (it=0; it<=n-2; it=it+2) { vr=fr[it]; vi=fi[it];

fr[it]=vr+fr[it+1]; fi[it]=vi+fi[it+1]; fr[it+1]=vr-fr[it+1]; fi[it+1]=vi-fi[it+1]; }

m=n/2; nv=2;

for (l0=k-2; l0>=0; l0--) { m=m/2; nv=2*nv;

for (it=0; it<=(m-1)*nv; it=it+nv) for (j=0; j<=(nv/2)-1; j++) { p=pr[m*j]*fr[it+j+nv/2]; q=pi[m*j]*fi[it+j+nv/2]; s=pr[m*j]+pi[m*j];

s=s*(fr[it+j+nv/2]+fi[it+j+nv/2]);

21

poddr=p-q; poddi=s-p-q; fr[it+j+nv/2]=fr[it+j]-poddr; fi[it+j+nv/2]=fi[it+j]-poddi; fr[it+j]=fr[it+j]+poddr; fi[it+j]=fi[it+j]+poddi; } } if (l!=0)

for (i=0; i<=n-1; i++) { fr[i]=fr[i]/(1.0*n); fi[i]=fi[i]/(1.0*n); } if (il!=0)

for (i=0; i<=n-1; i++)

{ pr[i]=sqrt(fr[i]*fr[i]+fi[i]*fi[i]); if (fabs(fr[i])<0.000001*fabs(fi[i])) { if ((fi[i]*fr[i])>0) pi[i]=90.0; else pi[i]=-90.0; } else

pi[i]=atan(fi[i]/fr[i])*360.0/6.283185306; } return; }

/*****************中断服务子程序声明与定义********************/ interrupt void int1() //int1中断子程序 {

px[j]=port8008&0x00FF; //读取ad7822转换数据 j++;

if(j==128) {

for (i=0; i<=n-1; i++) { xm=px[i]; x[i]=xm/1023.0; pr[i]=x[i]; pi[i]=0; } kfft(pr,pi,128,7,fr,fi,0,1); for (i=0;i<=n-1;i++) { mo[i] = sqrt(fr[i]*fr[i]+fi[i]*fi[i]);

22

zm = (int)(mo[i]*1000.0); pz[i] = zm; } pz[0]=0; flag = 1; IMR=0x0000; j=0; }

return; }

/**************************主程序*****************************/ void main(void) {

sys_ini(); int1_ini(); for(;;) {

if (flag == 1) { flag = 0; /* set breakpoint here */ IMR=0x0002; } } }

/***************************结束******************************/ Vector.asm

.global _main,_int1 .sect \

reset: b _main ;RESET VECTORS nop nop

nmi: rete ;NMI nop nop nop ; software interrupts

sin17: .space 4*16 sin18: .space 4*16 sin19: .space 4*16 sin20: .space 4*16 sin21: .space 4*16 sin22: .space 4*16 sin23: .space 4*16 sin24: .space 4*16

23

sin25: .space 4*16 sin26: .space 4*16 sin27: .space 4*16 sin28: .space 4*16 sin29: .space 4*16 sin30: .space 4*16

int0: rete ;EXTERNAL INT0 nop int1: int2: tint0: brint0: bxint0: dmac0: tint1_dmac1: INTERRUPT

int3: hpint: nop nop

b _int1 ;EXTERNAL INT1 nop nop

rete ;EXTERNAL INT2 nop nop nop

rete ;TIMER0 INTERRUPT nop nop

nop

rete ;BcBSP0 RECEIVE INTERRUPT nop nop nop

rete ;BcBSP0 TRANSMIT INTERRUPT nop nop nop

rete ;RESERVED OR DMA CHANNEL0 INTERRUPT nop nop nop

rete ;TIMER1 INTERRUPT OR DMA CHANNEL1 nop nop nop

rete ;EXTERNAL INT3 nop nop nop

rete ;HPI INTERRUPT

24

nop nop nop

brint1_dmac2: rete ;McBSP1 RECEIVE INTERRUPT OR DMA CHANNEL 2 INTERRUPT nop nop nop

bxint1_dmac3: rete ;McBSP1 TRANSMIT INTERRUPT OR DMA CHANNEL 3 INTERRUPT nop nop nop

dmac4: rete ;DMA CHANNEL 4 INTERRUPT nop nop nop

dmac5: rete ;DMA CHANNEL 5 INTERRUPT nop nop nop .end

; ****************************结束*****************************

四.实验截图:

图4 FFT算法

五.实验分析:

(1) 对于不同的N,观察到的幅频特性曲线不同,只有取合适的N值,才会观察到清晰地

25

幅频特性曲线。

(2) 用定点DSP芯片实现FFT程序时,一个比较重要的问题就是防止中间结果溢出。为了避免溢出,可在FFT的每一级用因子2进行归一化处理。运用DSP芯片的移位特性,用2归一化不增加任何运算量。与定点DSP芯片相比,用浮点DSP芯片实现FFT算法可以不考虑数据的溢出。

实验二.FIR算法实验

一.实验目的

1.掌握用窗函数法设计FIR数字滤波器的原理和方法; 2.熟悉线性相位FIR数字滤波器特性; 3.了解各种窗函数对滤波特性的影响。

二.实验设备

计算机,CCS 2.0 版软件,实验箱,DSP仿真器,短接块,导线。

三.实验原理

1.有限冲击响应数字滤波器的基础理论;

2.模拟滤波器原理(巴特沃斯滤波器、切比雪夫滤波器、贝塞尔滤波器); 3.数字滤波器系数的确定方法。

四.实验步骤

1.复习如何设计FIR数字滤波。阅读本实验原理,掌握设计步骤; 2.阅读本实验所提供的样例子程序;

3.运行CCS软件,对样例程序进行跟踪,分析结果; 4.填写实验报告。

5.样例程序实验操作说明

五.实验代码:

#pragma CODE_SECTION(vect,\#include \#include \#define pi 3.1415927

#define IMR *(pmem+0x0000) #define IFR *(pmem+0x0001) #define PMST *(pmem+0x001D) #define SWCR *(pmem+0x002B) #define SWWSR *(pmem+0x0028) #define AL *(pmem+0x0008)

#define CLKMD 0x0058 /* clock mode reg*/

#define Len 256 #define FLen 51

double npass,h[FLen], x[Len], y[Len], xmid[FLen];

void firdes (double npass);

unsigned int *pmem=0;

ioport unsigned char port8008; int in_x[Len]; int m = 0;

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

int flag = 0;

double fs,fstop,r,rm; int i,j,p,k=0;

void cpu_init() {

*(unsigned int*)CLKMD=0x0; //switch to DIV mode clkout= 1/2 clkin while(((*(unsigned

26

int*)CLKMD)&01)!=0); *(unsigned int*)CLKMD=0x27ff; xmid[0] = x[i]; //switch to PLL X 10 mode r = 0; PMST=0x3FA0; rm= 0; SWWSR=0x7fff; for (j=0; j

27 fstop = 20000; npass = fstop/fs;

for (i=0; i

xmid[i]=0; }

firdes(npass); asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\

set_int();

for(;;) {

if (flag == 1) {

flag = 0; /* set breakpoint here */

IMR=0x0002; } } }

void vect() {

asm(\.ref _c_int00\/*pseudoinstruction*/ asm(\

asm(\ asm(\ asm(\

asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\28 asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\

asm(\ asm(\ asm(\ asm(\

asm(\ asm(\ asm(\ asm(\ asm(\

asm(\ asm(\ asm(\ asm(\

asm(\ asm(\

asm(\

asm(\ asm(\

asm(\ asm(\ asm(\ asm(\

asm(\ asm(\ asm(\ asm(\

asm(\ asm(\ asm(\ asm(\

asm(\ asm(\ asm(\ asm(\

asm(\ asm(\ asm(\ asm(\

asm(\ asm(\

六.实验截图:

asm(\ asm(\ asm(\

asm(\ asm(\ asm(\ asm(\

asm(\ asm(\ asm(\ asm(\

asm(\ asm(\ asm(\ asm(\

asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\}

29

实验三.IIR算法实验

一.实验目的

1.熟悉设计IIR数字滤波器的原理与方法; 2.掌握数字滤波器的计算机仿真方法;

3.通过观察对实际信号的滤波作用,获得对数字滤波的感性认识。

二.实验设备

计算机,CCS 2.0 版软件,实验箱,DSP仿真器,短接块,导线。

三.实验原理

1.无限冲击响数字滤波器的基础理论;

2.模拟滤波器原理(巴特沃斯滤波器、切比雪夫滤波器、贝塞尔滤波器); 3.双线性变换的设计原理。

四.实验步骤

1.复习有关巴特沃斯滤波器设计和用双线性变换法设计IIR数字滤波器的知识; 2.阅读本实验所提供的样例子程序;

3.运行CCS软件,对样例程序进行跟踪,分析结果; 4.填写实验报告。

5.样例程序实验操作说明

五.实验代码:

#pragma CODE_SECTION(vect,\

#include \#include \#define pi 3.1415927

#define IMR *(pmem+0x0000) #define IFR *(pmem+0x0001) #define PMST *(pmem+0x001D) #define SWCR *(pmem+0x002B)

#define SWWSR *(pmem+0x0028) #define AL *(pmem+0x0008)

#define CLKMD 0x0058 /* clock mode reg*/

#define Len 256

double

30

fs,nlpass,nlstop,nhpass,nhstop,a[3],b [3],x[Len],y[Len]; xmean = 0.0; void biir2lpdes(double fs, double for (i=0; i

31

u=i%2; v=i-1;

a[i]=gsa*pow(2,u)-sqrt(2)*omp*v+pow(-2,u); }

for (i=0; i<=2; i++) { u=i%2;

IMR=0x0002; } } }

void vect() {

asm(\.ref _c_int00\ b[i]=gsa*pow(2,u); asm(\ }

t=a[0];

asm(\ for (i=0; i<=2; i++) asm(\ { a[i]=a[i]/t; asm(\

b[i]=b[i]/t; asm(\ } asm(\ } asm(\

asm(\void set_int() asm(\{

asm(\ asm(\ asm(\ IMR=IMR|0x0002; asm(\ asm(\ asm(\} asm(\

asm(\void main(void) asm(\{

asm(\ w2=w1=w0=0.0; asm(\ cpu_init(); asm(\

asm(\ fs = 250000; asm(\ nlpass = 0.10; asm(\ nlstop = 0.20; asm(\

asm(\ biir2lpdes(fs,nlpass,nlstop,a,b); asm(\

asm(\ set_int(); asm(\

asm(\ for(;;) asm(\ {

asm(\ if (flag == 1) asm(\ {

asm(\ flag = 0; /* set asm(\breakpoint here */ asm(\

32

asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\

asm(\ asm(\ asm(\ asm(\

asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\

asm(\ asm(\ asm(\ asm(\

asm(\

asm(\ asm(\

// asm(\ asm(\ asm(\ asm(\ asm(\ // asm(\

asm(\ /* int1 */ 33

asm(\ asm(\

asm(\ asm(\ asm(\ asm(\

asm(\ asm(\ asm(\ asm(\

asm(\ asm(\ asm(\ asm(\

asm(\ asm(\ asm(\ asm(\

asm(\ asm(\ asm(\ asm(\

asm(\ asm(\ asm(\ asm(\

asm(\ asm(\ asm(\ asm(\

asm(\ asm(\ asm(\ asm(\ asm(\

asm(\ asm(\ asm(\ asm(\

asm(\ asm(\}

六.实验截图:

实验四.IIR一.实验代码

#pragma CODE_SECTION(vect,\

#include \#include \#define pi 3.1415927

#define IMR *(pmem+0x0000) #define IFR *(pmem+0x0001) #define PMST *(pmem+0x001D) #define SWCR *(pmem+0x002B) #define SWWSR *(pmem+0x0028) #define AL *(pmem+0x0008)

#define CLKMD 0x0058 /* clock mode reg*/

#define Len 256

double

fs,nlpass,nlstop,nhpass,nhstop,a[3],b[3],x[Len],y[Len];

34

高通滤波器

void biir2lpdes(double fs, double nlpass, double nlstop, double a[], double b[]);

unsigned int *pmem=0; ioport unsigned char port8008; int in_x[Len]; int m = 0;

int intnum = 0; double xmean=0; int n=0; int flag = 0; int i,j,p,k=0;

double w2,w1,w0;

void cpu_init() {

*(unsigned int*)CLKMD=0x0; //switch to DIV mode clkout= 1/2 clkin while(((*(unsigned

int*)CLKMD)&01)!=0); *(unsigned int*)CLKMD=0x27ff; m=0; //switch to PLL flag = 1; IMR=0x0000; PMST=0x3FA0; } SWWSR=0x7fff; } SWCR=0x0000; IMR=0; void biir2lpdes(double fs, double nlpass, IFR=IFR; double nlstop, double a[], double b[]) } { interrupt void int1() int i,u,v; { double wp,omp,gsa,t; in_x[m] = port8008; wp=nlpass*2*pi; in_x[m] &= 0x00FF; omp=tan(wp/2.0); m++; gsa=omp*omp; intnum = m; for (i=0; i<=2; i++) { if (intnum == Len) u=i%2; { v=i-1; intnum = 0; b[i]=gsa*pow(2,u)-sqrt(2)*omp*v+po xmean = 0.0; w(-2,u); } for (i=0; i

35

{ w2=w1=w0=0.0; cpu_init();

fs = 250000; nlpass = 0.08; nlstop = 0.28; biir2lpdes(fs,nlpass,nlstop,a,b); asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ set_int(); for(;;) { if (flag == 1) { flag = 0; /* set breakpoint here */

IMR=0x0002; } } }

void vect() {

asm(\.ref _c_int00\oinstruction*/ asm(\

asm(\ asm(\ asm(\

asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\

36

asm(\asm(\asm(\asm(\asm(\asm(\asm(\asm(\asm(\asm(\asm(\asm(\asm(\asm(\asm(\asm(\asm(\asm(\asm(\asm(\asm(\asm(\asm(\asm(\asm(\asm(\asm(\asm(\asm(\asm(\asm(\asm(\asm(\asm(\asm(\

asm(\ asm(\ asm(\ asm(\

asm(\ /* int0 */ asm(\ asm(\ asm(\

asm(\ asm(\ asm(\

asm(\ /* int3 */ asm(\ asm(\ asm(\

asm(\ /* hpint */ asm(\ asm(\ asm(\ asm(\

// asm(\ asm(\ asm(\ asm(\ asm(\ // asm(\

asm(\ asm(\ asm(\ asm(\

asm(\ asm(\ asm(\ asm(\

asm(\ asm(\ asm(\ asm(\

asm(\ asm(\ asm(\ asm(\

asm(\ asm(\

二.实验截图:

/* int1 */ /* int2 */ /* tint0 */ /* brint0 */ /* bxint0 */ /* dmac0 */ /* tint1 */ asm(\

asm(\ asm(\ asm(\ asm(\

asm(\ asm(\ asm(\ asm(\

asm(\ asm(\ asm(\ asm(\

asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\ asm(\}

37

/* brint1 */ /* bxint1 */ /* dmac4 */ /* dmac5 */

第三部分.实验总结

这次的DSP硬件实验让我第一次接触了汇编语言。由于没有系统地学习过这一知识,所以仅靠课上的短暂时间并不能真正学会。于是在课下,我又花费了不少时间自学汇编语言,了解了常用指令,但还是有些比较抽象的地方难以全部读懂。这时候我就采用一边查询资料,一边搜索网页知识的方法,终于把汇编程序这块硬骨头啃了下来。这一过程加深了我对数字信号处理这门课程的深刻理解和认识。

通过这次硬件实验,巩固了我的DSP理论知识。例如,对A/D转换技术的基本原理和SP系统频谱混叠有了更深的了解。

所以我认为开展这一实验很有必要,不仅强化了我们的动手能力,也让我们能更好地和理论知识融会贯通。

38

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

Top