配色: 字号:
《DSP技术与实验》实验指导书1-20121102
2012-12-23 | 阅:  转:  |  分享 
  
PAGE

-PAGE53-


2012秋季学期“DSP原理与应用”实验教学资料

实验一CCS集成环境的熟悉---2学时
实验二算术运算与数据操作的汇编语言程序设计---2学时
实验三信号发生器设计---2学时
实验四IIR滤波器的DSP实现---2学时
实验五FIR滤波器的DSP实现---2学时
实验六FFT的DSP实现---2学时
实验七综合实验暨实验考查---4学时
实验报告内容:用每个实验要求的思考题代替实验报告,手写,在实验结束时(估计第15周)一起交。

实验一CCS集成开发环境的熟悉
一、实验内容及步骤
通过编写程序计算y=x1+x2+x3+x4+x5练习CCS2(‘C5000)的使用。
1.在D盘或E盘建立一个自己的文件夹,如e:\05136101,该文件夹用英文或数字命名。后面所有与实验内容有关的工程与程序都在此文件夹下保存或操作。
2.运行CCS2(‘C5000)进入CCS集成开发环境。以下操作如无特殊声明一般都在此环境下操作。
3.新建工程。点击主菜单Project-New,会出现图1-1所示的ProjectCreation对话框。
图1-1

参照图1-1按如下顺序进行设置或操作:
Location:e:\05136101
Project:example2
点击完成按钮即可。
4.新建并保存主程序文件、链接命令文件和中断向量表文件。本次实验三个文件的参考名称为:主程序文件sj1.asm、链接命令文件sj1.cmd、中断向量表文件vectors.asm。点击菜单File-New-SourceFile打开文本编辑窗口Untitled1,如图1-2。用菜单File-Save功能将其保存到e:\05136101\example2中,其中文件名称为example2,保存类型为.asm,如图1-3。用同样的方法新建并保存文件example2.cmd和vectors.asm。
图1-3
图1-2

5.为新建工程添加主程序文件、中断向量表文件和链接命令文件。
在工程管理器中(图1-2中的红色方框处)右键单击example2.pjt,选择AddFilestoProject,在出现的如图1-4所示的AddFilestoProject对话框中查找并选中刚才建立的三个文件example2.asm,example2.cmd,vectors.asm,点击打开按钮将它们一起添加到该工程中去。
图1-4


6.编写主程序文件。单击工程管理器中的工程example2.pjt左边的+号展开example2.pjt工程,再单击文件夹Source左边的+号,如图1-5。找到并双击example2.asm,在界面右边出现的example2.asm文本编辑窗口中输入或复制主程序(注释部分可不输入)。文件内容如下:
图1-5

计算y=x1+x2+x3+x4+x5的程序
.title"example2.asm";伪指令。用于格式化输出清单文件,声明在每页的顶部打印文件标题
.mmregs;伪指令。声明CPU寄存器名称
STACK.usect"STACK",10H ;伪指令。自定义未初始化段STACK及大小(10H个字),最左边的STACK是标号
.bssx,5;伪指令。声明数组x,5个字
.bssy,1;伪指令。声明变量y,1个字
.defstart;伪指令。声明本文件中的标号start能被别的文件(程序)引用
.data;伪指令,指示下面的代码为数据段,通常包含初始化的数据(常数)。
table: .word10,20,3,4,5;伪指令。声明5个16位整数类型的常数。table是标号。
.text;伪指令,指示下面的代码为文本段,通常包含可执行的代码。
start: STM#0,SWWSR ;SWWSR=0,插入0个等待状态。start是标号。
STM#STACK+10H,sp;sp=#STACK+10H,设置堆栈指针指向堆栈段的底部
STM#x,AR1 ;AR1=#x或AR1指向数组x
RPT#4 ;下一条指令重复执行4+1=5次
MVPDtable,AR1+ ;数据传送。程序存储器中的table数据表→AR1+指向的数据存储器
LD#0,A ;累加器A清零
CALLSUM ;调用求和子程序SUM
end: Bend;无条件转移到标号end所在地方执行程序
SUM: ;标号,指示求和子程序SUM从这里开始
STM#x,AR3 ;AR3指向数组x
STM#4,AR2 ;AR2=4
loop: ADDAR3+,A ;AR3+A→A,然后AR3=AR3+1。loop是标号。
BANZloop,AR2- ;如果AR2的值不为0,AR2=AR2-1,跳转到loop处执行;否则执行下一条指令
STLA,(y) ;y=AL
RET;子程序返回
.end;伪指令。指示汇编结束
7)编写链接命令文件。
在工程管理器中双击example2.pjt工程中的example2.cmd,将出现example2.cmd文本编辑窗口。在该文本编辑窗口中输入或复制文件内容。文件内容如下:
vectors.obj /声明要链接的文件---中断向量表文件的目标文件/
example2.obj /声明要链接的文件---主程序文件的目标文件/
-oexample2.out /声明链接产生的可执行文件名称,默认为a.out/
-mexample2.map /声明链接产生的存储器映射文件/
-estart /声明主程序入口/
MEMORY/关键字加一对{},存储器配置/
{
PAGE0: /程序存储区/
EPROM:org=0090Hlen=0F70H /定义EPROM区,起始地址0090H,长度0F70H/
VECS:org=0080Hlen=0010H /定义VECS区,起始地址0080H,长度0010H/
PAGE1: /数据存储区/
SPRAM:org=1000Hlen=1000H /定义SPRAM区,起始地址1000H,长度1000H/
DARAM:org=2000Hlen=2000H /定义DARAM区,起始地址2000H,长度2000H/
}
SECTIONS/关键字加一对{},定位段/
{
.text :>EPROMPAGE0 /将.text段映射或定位到PAGE0的EPROM区/
.data :>EPROMPAGE0 /将.text段映射或定位到PAGE0的EPROM区/
.bss :>SPRAMPAGE1 /将.text段映射或定位到PAGE1的SPRAM区/
STACK:>DARAMPAGE1 /将.text段映射或定位到PAGE1的DARAM区/
.vectors :>VECSPAGE0 /将.vectors段映射或定位到PAGE0的VECS区/
}
8.编写中断向量表文件。
在工程管理器中双击example2.pjt工程中的vectors.asm,将出现vectors.asm文本编辑窗口。在该文本编辑窗口中输入或复制文件内容。文件内容如下:
.title "vectors.asm"
.ref start ;伪指令。声明要引用其他程序中定义的标号start
.sect ".vectors" ;伪指令。定义初始化的段名.vectors,这一种伪指令声明的段与.data和.text功能一致
B start ;无条件转移到标号start所在的地方执行程序
.end
9.对工程中的文件进行编译和链接。点击菜单Project-RebuildAll,对工程中的所有文件进行编译、链接。工程中的文件如果编译链接成功,会生成example2.out文件;如果不成功,会出现出错信息,这时应按照提示的出错信息对文件进行修改,然后再RebuildAll。
10.装载可执行文件。要让程序代码在DSP内部运行必需将生成的.out文件装载到DSP内部。
点击菜单File-LoadPrograme,选择并双击刚才生成的example2.out文件将程序装载到DSP的内部存储器中。
11.运行程序,查看并记录相关结果。点击菜单Debug-Run或按功能键F5运行程序。
①查看数据的保存情况。点击菜单View-Memory,会出现图1-6(a)所示的“MemoryWindowOptions”对话框,按图1-6(a)设置Address=0x1000(为什么要设置成Address=0x1000?),Page=Data。点击OK按钮,观察出现的如图1-6(b)所示的“Memory”对话框,这个对话框显示的是变量在数据存储器中的地址与值。请思考:为什么.bss的地址是0x1000,变量y的地址是0x1005,变量x的地址又是多少呢?

图1-6(a)(b)
②查看程序的保存情况。点击菜单View-Memory,按图1-7(a)设置Address=0x0090(为什么要设置成Address=0x0090?),Page=Program。点击OK按钮,观察出现的如图1-7(b)所示的“Memory”对话框,这个对话框显示的是可执行程序在程序存储器中的地址与指令代码。请思考:为什么.text段的地址是0x0090?标号end的地址是0x009C?标号SUM的地址是0x009E?标号loop的地址是0x00A2?.data段的地址是0x00A8?

图1-7(a)(b)
③查看寄存器的状况。第一步:点击菜单View-Registers-CPURegisters。基本界面如图1-8。

图1-8
第二步:点击菜单File-LoadProgram重新装载可执行程序.out。
第三步:点击菜单Debug-StepInto或按F8,观察程序在单步运行时(单步运行指的是按一次F8程序执行一步,再按一次F8程序再执行一步),CPURegisters的变化。单步运行有助于进一步了解程序运行机理及用于程序调试。
④查看指令代码。再一次装载并运行程序,点击菜单View-Disassembly,查看并记录指令及其对应的指令代码并进行理解。

图1-9
12.改变主程序example2.asm中x1~x5的值(自定),重新执行9~11①。记录x1~x5、y的值并验算。
13.修改example2.cmd(自定义存储器配置及段的定位),重新执行9~11②。记录程序、数据、标号、中断矢量的地址空间。

二、思考题---见实验步骤11、12、13的要求。





实验二算术运算与数据操作的汇编语言程序设计实验
一、实验内容与步骤(2、3、4、5、7选做,6、8必做)
1、运行CCS。
2、编写程序,计算y=x1+x2+…+x10(xi的值自己定义)。
3、编写程序,计算z=x+y-w、y=mx+bx、y=x1×a2-x2×a2(自变量的值自己定义)。
4、编写程序,计算y=a1x1+a2x2+…+a40x40(aixi的值自己定义)。
5、编写程序,用长字运算指令实现Z32=X32+Y32,用并行运算指令实现z=x+y和f=e+d。
6、编制程序,计算y=a1x1+a2x2+…+a10x10,其中数据均为小数(aixi的值自己定义)。
7、分别编写程序,计算(-0.24)÷0.48和1024÷128。
8、编写浮点乘法程序,计算x1×x2×x3=0.2×(-0.4)×0.25。
上述每个实验内容基本操作步骤与要求同实验一的步骤3~11①。
二、实验习题---编写浮点乘法程序,用调用子程序的方法计算x1×x2×x3×x4=0.2×(-0.4)×0.25×0.66。
三、参考程序
1)用单操作数指令计算y=(a1x1+a2x2+···a19x19+a20x20)
.title "sy21.asm"
.mmregs
STACK .usect "STACK",30H
.bss a,20
.bss x,20
.bss y,2
.data
table: .word 1,2,3,4,5,6,7,8,9,10,11
.word 12,13,14,15,16,17,18,19,20
.word 21,22,23,24,25,26,27,28
.word 29,30,1,2,3,4,5,6,7,8,9,10
.def start
.text
start: STM #a,AR1
RPT #39
MVPD table,AR1+
LD #0,B
STM #a,AR2
STM #x,AR3
STM #19,BRC
RPTB done-1
LD AR2+,T ;单操作数指令
MPY AR3+,A ;单操作数指令
ADD A,B
done: STH B,(y)
STL B,(y+1)
end: B end
.end

2) 用"长字运算"实现32位加法运算Z=X+Y
.title "sy22.asm"
.mmregs
STACK .usect "STACK",10H
.bss xhi,2,1,1
.bss yhi,2,1,1
.bss zhi,2,1,1
.def start
.data
table: .long 16782345H,10200345H
.text
start: STM #0,SWWSR
STM #STACK+10H,SP
STM #xhi,AR1
RPT #3
MVPD table,AR1+
DLD (xhi),A
DADD (yhi),A
DST A,(zhi)
end: B end
.end

3)用并行指令计算z=x+y,f=e+d
.title "sy23.asm"
.mmregs
STACK .usect "STACK",10H
.bss x,3
.bss d,3
.def start
.data
table: .word 0123H,1027H,0,1020H,0345H,0
.text
start: STM #0,SWWSR
STM #STACK+10H,SP
STM #x,AR1
RPT #5
MVPD table,AR1+
STM #x,AR5
STM #d,AR2
LD #0,ASM
LD AR5+,16,A
ADD AR5+,16,A
ST A,AR5 ;并行指令
||LD AR2+,B
ADD AR2+,16,B
STH B,AR2
end: B end
.end
4)小数运算。计算y=a1x1+a2x2+a3x3+a4x4
a1=0.1,a2=0.2,a3=-0.3,a4=0.2,x1=0.8,x2=0.6,x3=-0.4,x4=-0.2
.title "sy24.asm"
.mmregs
STACK .usect "STACK",10H
.bss a,4
.bss x,4
.bss y,1
.def start
.data
table: .word 132768/10;0.1
.word 232768/10;0.2
.word -332768/10;-0.3
.word 432768/10;0.4
.word 832768/10;0.8
.word 632768/10;0.6
.word -432768/10;-0.4
.word -232768/10;-0.2
.text
start: SSBX FRCT
STM #a,AR1
RPT #7
MVPD table,AR1+
STM #x,AR2
STM #a,AR3
RPTZ A,#3
MAC AR2+,AR3+,A
STH A,(y)
end: B end
.end

5)除法运算。|被除数|<|除数|,商为小数。计算0.4÷(-0.8)的值。
.title "sy25.asm"
.mmregs
STACK .usect "STACK",10H
.bss num,1 ;分子
.bss den,1 ;分母
.bss quot,1 ;商
.data
table: .word 432768/10 ;-128
.word -832768/10 ;1024
.def start
.text
start: LD #0020H,DP ;设置数据页指针,使DP指向第31页(1000H处)
STM #num,AR1
RPT #1
MVPD table,AR1+ ;传送2个数据至分子、分母
LD @den,16,A ;将分母移到累加器A(31~16)
MPYA @num ;(num)(A(31~16))->B,获取商的符号
;(在累加器B中)
ABS A ;分母取绝对值
STH A,@den ;分母取绝对值存回原处
LD @num,16,A ;将分子移到累加器A(32~16)
ABS A ;分子取绝对值
RPT #14 ;15次减法循环,完成除法
SUBC @den,A
XC 1,BLT ;如果B<0(商为负数),则需要变号
NEG A
STL A,@quot ;保存商
end: B end
.end

6)除法运算。|被除数|>=|除数|,商为整数。计算16384÷512的值。
.title "sy26.asm"
.mmregs
STACK .usect "STACK",10H
.bss num,1 ;分子
.bss den,1 ;分母
.bss quot,1 ;商
.data
table: .word 6632768/100 ;16384
.word -3332768/100 ;512
.def start
.text
start: LD #0020H,DP ;指定数据页指针
STM #num,AR1
RPT #1
MVPD table,AR1+ ;传送2个数据至分子、分母
LD @den,16,A ;将分母移到累加器A(31~16)
MPYA @num ;(num)(A(31~16))->B,获取商的符号
;(在累加器B中)
ABS A ;分母取绝对值
STH A,@den ;分母取绝对值存回原处
LD @num,A ;将分子移到累加器A(32~16)
ABS A ;分子取绝对值
RPT #15 ;16次减法循环,完成除法
SUBC @den,A
XC 1,BLT ;如果B<0(商为负数),则需要变号
NEG A
STL A,@quot ;保存商
end: B end
.end
7)浮点运算。计算x1x2=0.3(-0.8)
x1:被乘数,m2:乘数的尾数,x2:乘数,ep:乘积的指数,e1:被乘数的指数
mp:乘积的尾数,m1:被乘数的尾数, product:乘积,e2:乘数的指数, temp:暂存单元
.title "sy27.asm"
.mmregs
.def start
STACK .usect "STACK",100
.bss x1,1
.bss x2,1
.bss e1,1
.bss m1,1
.bss e2,1
.bss m2,1
.bss ep,1
.bss mp,1
.bss product,1
.bss temp,1
.data
table:.word 332768/10 ;0.3
.word -832768/10 ;-0.8
.text
start: STM #STACK+100,SP ;设置堆栈指针
LD#x1,DP;设置DP指针为x1所在页
MVPDtable,@x1;将x1和x2传送到数据存储器
MVPD table+1,@x2
LD @x1,16,A ;将x1规格化为浮点数
EXP A
ST T,@e1 ;保存x1的指数
NORM A
STH A, @m1 ;保存x1的尾数
LD @x2,16,A ;将x2规格化为浮点数
EXP A
ST T,@e2 ;保存x2的指数
NORM A
STH A,@m2 ;保存x2的尾数
CALL MULT ;调用浮点乘法子程序
end: B end
MULT:SSBX FRCT
SSBX SXM
LD @e1,A ;指数相加
ADD @e2,A
STL A,@ep ;乘积指数->ep
LD @m1,T ;尾数相乘
MPY @m2,A ;乘积尾数在累加器A中
EXP A ;对尾数乘积规格化
ST T,@temp;规格化时产生的指数->temp
NORM A
STH A,@mp ;保存乘积尾数在mp中
LD @temp,A ;修正乘积指数
ADD @ep,A ;(ep)+(temp)->ep
STL A,@ep ;保存乘积指数在ep中
NEG A ;将浮点乘积转换成定点数
STL A,@temp;乘积指数反号,并且加载到T寄存器
LD @temp,T ;再将尾数按T移位
LD @mp,16,A
NORM A
STH A,@product ;保存定点乘积
RET
.end
8)链接配置文件参照实验一中的example2.cmd,但要作简单修改。中断向量表文件参照实验一中的vectors.asm,可不作修改。

实验三信号发生器设计
一、实验原理
采用查找表的方法产生周期信号。在DSP的内部RAM中放上一个周期的正弦波数据表,通过程序按一定时间间隔将表中的数据写到D/A端口,在D/A输出端就可以得到周期性的正弦波信号。更改查找表的数据,就可以在D/A输出端得到不同的周期信号。
二、实验内容与步骤
1、运行CCS。
2、采用查找表的方式产生正弦波、方波、三角波等常见波形。
1)在CCS环境下新建DA工程和五个文件main.asm、c54init.asm、C54.inc、memory.cmd、vectors.asm。
2)分别编辑五个文件并将他们添加到DA工程中。参考程序如下。
①主程序main.asm
.mmregs
.def_c_int00
.includec54.inc
.refc54init
DA_ADDR.set0x0002;定义符号DA_ADDR表示D/A端口地址
.data
sin_table:;在这里放置一个周期的正弦波的64个离散值
.word 255,254,252,249,245,239,233,225
.word 217,207,197,186,174,162,150,137
.word 124,112,99,87,75,64,53,43
.word 34,26,19,13,8,4,1,0
.word 0,1,4,8,13,19,26,34
.word 43,53,64,75,87,99,112,124
.word 137,150,162,174,186,197,207,217
.word 225,233,239,245,249,252,254,255
.bssDA_DATA,1;声明变量DA_DATA作D/A缓冲区
.bssDA_NUM,1;声明变量DA_NUM作D/A计数器

.sect"progsys";自定义初始化段progsys
.align0x10;调整SPC,下面的程序代码放置在存储器中时,起始地址对准16字的边界
_c_int00:STM #0x0f80,SP;设置堆栈指针
CALL c54init;调整DSP初始化程序,硬件仿真时必须的部分
LD #sin_table,DP;设置数据页指针,DP指向sin_table所在的数据存储器页
LOOP:;周期循环标号
ST#0,DA_NUM;计数变量清零
STM#sin_table,AR1;AR1指向查找表首地址
SINLOOP:;一个周期内的D/A循环标号
MVDKAR1+,DA_DATA;读查找表中的值放入到数据缓冲区DA_DATA中,软件仿真时在此处设置断点
PORTW DA_DATA,DA_ADDR;数据缓冲区DA_DATA中的值写到D/A端口,软件仿真时不起作用
RPT #1000;下面的一条指令执行1001次
NOP;空操作,在这里起延时作用
ADDM#1,DA_NUM;DA_NUM循环计数
CMPM DA_NUM,#63 ;DA_NUM与63比较
BC SINLOOP,NTC ;一个周期内的64个点还没D/A完继续
BLOOP;一个周期内的64个点已经D/A完,进入周期循环
.end
②初始化程序c54init.asm
.mmregs
.includec54.inc
.defc54init
.sect"progsys"
c54init:
STM#0x7208,SWWSR ;0111001000001000
STM#0,SWCR;等待周期不变,(STM#1,SWCR等待周期加倍)
STM#0xF800,BSCR;1111100000000000
STM#0,ST0;数据页指针指向第0页
STM#0x2b00,ST1;0010101100000000,INTM=1将全局中断禁止
;SXM=1数据进入ALU之前进行符号位扩展
;OVM=1溢出控制位(参考ST1资料)
STM#0x2fe4,PMST ;0010111111100100,将中断向量表映射到2f80H=0010111110000000B
STM#0xFFFF,IFR;清除挂起的中断
STM#0x0000,IMR ;关闭所有中断,
STM#0,CLKMD;利用软件对CLKMD进行加载
clkcon: LDMCLKMD,A
AND#0x01,A
BCclkcon,ANEQ
STM#0x43ff,CLKMD ;0100001111111111
;PLL=4MUL=5100Mhz;PLL=3MUL=480Mhz
STM#0x0010,TCR1 ;TCR1为定时器1的定时控制寄存器。timer1stop
STM#0x0010,TCR ;TCR为定时器0的定时控制寄存器。TSS=1Timerstop
STM#12800,PRD;PRD为定时器0的周期寄存器
STM#0x0020,TCR;定时中断周期=CLKOUT(TDDR+1)(PRD+1)
RSBXINTM;将全局中断使能
NOP
NOP
RET
.end
③中断向量表程序vectors.asm
.includec54.inc
.sect".vectors"
.ref_c_int00
.align0x80
RESET:;resetvector
B_c_int00
NOP
NOP
nmi:RETE
NOP
NOP
NOP
;softwareinterrupts
sint17.space416
sint18.space416
sint19.space416
sint20.space416
sint21.space416
sint22.space416
sint23.space416
sint24.space416
sint25.space416
sint26.space416
sint27.space416
sint28.space416
sint29.space416
sint30.space416
int0:RETE
NOP
NOP
NOP
int1:RETE
NOP
NOP
NOP
int2:RETE
NOP
NOP
NOP
tint:RETE
NOP
NOP
NOP
rint0:RETE
NOP
NOP
NOP
xint0:RETE
NOP
NOP
NOP
DMAC0: RETE
NOP
NOP
NOP
DMAC1: RETE;tint1
NOP
NOP
NOP
int3:RETE
NOP
NOP
NOP
HPINT: RETE
NOP
NOP
NOP
DMAC2:RETE;rint1
NOP
NOP
NOP
xint1:RETE
NOP
NOP
NOP
DMAC4: RETE
NOP
NOP
NOP
DMAC5: RETE
NOP
NOP
NOP
.end
④链接配置文件memory.cmd
/-e_c_int00
-msensor.map
MEMORY
{
PAGE0:PROG:origin=0x2000,len=0x0f80
VECT:origin=0x2f80,len=0x80 /128word/
PAGE1:DRAM: origin=0x3000,len=0xf80
}
SECTIONS
{
.progsys:load=PROG PAGE0
.vectors:load=VECT PAGE0
.data:load=DRAM PAGE1 align16
.bss:load=DRAM PAGE1
}
⑤外设寄存器名称说明文件c54.inc
c54.inc
SWCR .set0x2B

time1:
TIM1 .set0x30
PRD1 .set0x31
TCR1 .set0x32
McBSP0:
DRR10 .set0x21
DXR10 .set0x23
SPSA0 .set0x38
SPSD0 .set0x39
SPCR10 .set0x00
SPCR20 .set0x01
RCR10 .set0x02
RCR20 .set0x03
XCR10 .set0x04
XCR20 .set0x05
SRGR10 .set0x06
SRGR20 .set0x07
MCR10 .set0x08
MCR20 .set0x09
RCERA0 .set0x0a
RCERB0 .set0x0b
XCERA0 .set0x0c
XCERB0 .set0x0d
PCR0 .set0x0e

McBSP1:
DRR11 .set0x41
DXR11.set0x43
SPSA1 .set0x48
SPSD1 .set0x49
SPCR11 .set0x00
SPCR21 .set0x01
RCR11 .set0x02
RCR21 .set0x03
XCR11 .set0x04
XCR21 .set0x05
SRGR11 .set0x06
SRGR21 .set0x07
MCR11 .set0x08
MCR21 .set0x09
RCERA1 .set0x0a
RCERB1 .set0x0b
XCERA1 .set0x0c
XCERB1 .set0x0d
PCR1 .set0x0e

DMA:
DMPREC .set0x54
DMSA .set0x55
DMSDI .set0x56
DMSDN .set0x57

channe0:
DMSRC0 .set0x00
DMDST0 .set0x01
DMCTR0 .set0x02
DMSFC0 .set0x03
DMMCR0 .set0x04

channel:
DMSRC1 .set0x05
DMDST1 .set0x06
DMCTR1 .set0x07
DMSFC1 .set0x08
DMMCR1 .set0x09

channe2:
DMSRC2 .set0x0a
DMDST2 .set0x0b
DMCTR2 .set0x0c
DMSFC2 .set0x0d
DMMCR2 .set0x0e

channe3:
DMSRC3 .set0x0f
DMDST3 .set0x10
DMCTR3 .set0x11
DMSFC3 .set0x12
DMMCR3 .set0x13

channe4:
DMSRC4 .set0x14
DMDST4 .set0x15
DMCTR4 .set0x16
DMSFC4 .set0x17
DMMCR4 .set0x18

channe5:
DMSRC5 .set0x19
DMDST5 .set0x1a
DMCTR5 .set0x1b
DMSFC5 .set0x1c
DMMCR5 .set0x1d

DMSRCP .set0x1e
DMDSTP .set0x1f
DMIDX0 .set0x20
DMIDX1 .set0x21
DMFRI0 .set0x22
DMFRI1 .set0x23
DMGSA .set0x24
DMGDA .set0x25
DMGCR .set0x26
DMGFR .set0x27

3)编译、链接、装载程序。
4)设置CCS集成环境下的图形查看窗口查看产生的信号波形。
第一步,在指令“MVDKAR1+,DA_DATA”行设置断点;
第二步,点击菜单View-Graph-Time/Frequency...得到GraphPropertyDialog对话框,如图3-1。按图3-2所示进行相关设置;
第三步,按F12以Animate方式运行程序,运行结果如下图3-3。

图3-1图3-2

图3-3
5)读懂并修改程序,重复上3)、4)两步产生方波、三角波等常见信号。

三、思考题
1.设DSP的CPU主时钟频率为100MHz,指令周期为10ns,请说明产生频率为100KHz的周期三角波信号时,应该如何修改主程序。
2.如果在查找表中放置正弦波一个周期内的360个离散值(在MATLAB中产生),请重写产生正弦波的主程序并仿真。

实验四IIR滤波器的DSP实现
一、实验原理:
参考教材IIR的DSP实现方法。
二、实验内容与步骤
1.运行CCS。
2、IIR滤波器的DSP实现(软件仿真)。
1)在CCS环境下新建IIR2工程和三个文件:iir2.asm、iir2.cmd、vectors.asm。
2)分别编辑三个文件并将他们添加到IIR2工程中。参考程序如下。
①IIR2.asm

用双操作数指令实现二阶低通IIR滤波器
反馈通道:x0=w(n)=x(n)+A1x1+A2x2前向通道:y(n)=B0x0+B1x1+B2x2
.title "IIR2.asm"
.mmregs
.def start
x2 .usect "x",1
x1 .usect "x",1
x0 .usect "x",1
COEF .usect "COEF",5
indata .usect "buffer",1
outdata .usect "buffer",1
PA0 .set 10
PA1 .set 1
.data
table.word 0;x(n-1)
.word0;x(n-2)
.word67632768/10000;分子系数B2=0.0676
.word135232768/10000;分子系数B1=0.1352
.word67632768/10000;分子系数B0=0.0676
.word-414232768/10000;分母系数A2=-0.4142
.word70732768/10000;分母系数A1=0.0707
.text
start: SSBX FRCT
STM #x2,AR1
RPT #1
MVPD #table,AR1+
STM #indata,AR5
STM #outdata,AR2
STM #COEF,AR1
RPT #4
MVPD #table+2,AR1+
STM #x2,AR3
STM #COEF+4,AR4 ;AR4-->A1
MVMM AR4,AR1 ;保存地址值在AR1中
STM #3,BK ;设置循环缓冲区长度
STM #-1,AR0 ;设置变址寻址步长
IIR2: ;PORTR PA1,AR3 ;从PA1口输入数据x(n)
MVDD AR5,AR3;在这里设置断点与探针
LD AR3+0%,16,A ;计算反馈通道,A=x(n)
MAC AR3,AR4,A ;A=x(n)+A1x1???
MAC AR3+0%,AR4-,A ;A=x(n)+A1x1+A1x1
MAC AR3+0%,AR4-,A;A=x(n)+2A1x1+A2x2
STH A,AR3 ;保存x0
MPY AR3+0%,AR4-,A ;计算前向通道,A=B0x0
MAC AR3+0%,AR4-,A ;A=B0x0+B1x1
MAC AR3,AR4-,A ;B=B0x0+B1x1+B2x2=y(n)
STH A,AR3 ;保存y(n)
MVMM AR1,AR4 ;AR4重新指向A1
BD IIR2 ;循环
; PORTW AR3,PA0 ;向PA0口输出数据
MVDDAR3,AR2;在这里设置断点与探针
nop
.end
②IIR2.cmd
vectors.obj
IIR2.obj
-oIIR2.out
-mIIR2.map
-estart
MEMORY
{
PAGE0:
EPROM: org=0090H,len=0F70H
VECS: org=0080H,len=0010H
PAGE1:
SPRAM: org=1000H,len=1000H
DARAM: org=2000H,len=2000H
}
SECTIONS
{
.text :>EPROM PAGE0
.data :>EPROM PAGE0
.bss :>SPRAM PAGE1
x: align(4){} >DARAM PAGE1
COEF: align(8){} >DARAM PAGE1
buffer :>DARAM PAGE1
.vectors:>VECS PAGE0
}


③vectors.asm。参考实验一。
3)在工程文件夹IIR2中建立数据输入文件in.dat和数据输出文件out.dat,即建立方波输入文件,和滤波后输出的文件。in.dat文件内容为:第一行为16511200311,从第二行开始,输入30个数字“16384”(相当于0.5,若是改为32767,则有可能出现溢出现象),30个数字“0”,每行只输入一个数字。out.dat文件为空内容,用来存放输出结果。关于“16511200311”的说明如下:
CCS数据文件文件头格式为:
文件类型
1651数据类型
1起始地址
2003数据页号
1数据长度
1文件类型:固定为1651
数据类型:取1~4,对应类型为十六进制、整数、长整数和浮点数。
起始地址:十六进制,数据存放的内存缓冲区首地址。
数据页号:十六进制,指明数据取自哪个数据页。
数据长度:十六进制,指明数据块长度,以WORD为单位。
4)对工程进行编译、链接并装载可执行文件。
5)关联输入输出文件。
①设置探针和断点。打开IIR2.asm文件,把光标定位到指令“MVDDAR5,AR3”这一行,然后点击PorjectToolbar上的探针按钮和断点按钮;再把光标定位到指令“MVDD AR3,AR2”这一行,点击PorjectToolbar上的探针按钮和断点按钮。设置后的示意图如图4-1所示。

图4-1
②为探针设置关联文件。点击菜单File-FileI/O,在弹出的FileI/O对话框(图4-2)中点击AddFile,把工程文件夹中的数据文件in.txt添加进来。在Address栏中输入0x2003(即缓冲区indata的地址),Lenth栏中输入0x0001(缓冲区的长度),选中”WrapAround”(表示输入文件中的数据是循环向DSP内存中输入的),图4-2是设置好的界面。点击“AddProbePoint”按钮。在弹出的Break/ProbePoint对话框(图4-3)中点击一下“IIR2.asmline40-->NoConcection”,然后在Connect下拉菜单中选择……in.txt文件(……代表路径),最后点击Replace按扭,点击确定,结果如图4-3所示。这样就把in.txt文件与第一个探针相关联了,以后程序运行到此探针处就会从in.txt文件中读取数据。

图4-2图4-3

同理在FileI/O窗口(图4-2)中点击FileOutput标签,得到图4-4,点击AddFile,把out.txt添加进来。在Address栏中输入0x2004,在Length栏中输入0x0001,其它按默认设置,图4-4是设置的结果。完成上述步骤后,点击AddProbePoint,在弹出的Break/ProbePoint对话框(图4-5)中点击IIR2.asmline53-->NoConnection,在Connect下拉菜单中选择out.txt文件,最后点击Replace,图4-5是设置好的窗口。

图4-4图4-5
6)CCS图形窗口设置。点击菜单View-Graph-Time/Frequence,出现“GraphPropertyDialog”,按图4-6所示进行设置。

图4-6
7)运行程序,观察输入输出信号波形,并判断程序实现的是多少阶的什么类型的滤波器功能。点击Debug-Animate或F12运行程序,出现一个向左“流动”的经过IIR滤波器的输入输出信号波形,如下图4-7所示。

图4-7
8)在程序运行过程中,在记事本中打开并更改、保存in.dat中的数据,查看并记录图形,分析结果。
①in.dat文件内容为:3(10个16384+10个0)。
②in.dat文件内容为:10(3个16384+3个0)。
③in.dat文件内容为:1个32767+59个0。
④in.dat文件内容自定。
三、思考题---对照参考程序,编写实现四阶或更高阶数的低通、高通、带通、带阻IIR数字滤波器的DSP程序并仿真。提示:滤波器系数一般通过MATLAB仿真得到。
%附:利用MATLAB设计IIR低通滤波器
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
N=4;%设定阶次
%利用butter()函数直接计算IIR数字滤波器系数;
[b1,a1]=butter(N,0.1); %lowpass0.0-0.1
[b2,a2]=butter(N,0.3,''high'');%highpass0.3-1.0
[b3,a3]=butter(N,[0.10.3]); %bandpass0.1-0.3
[b4,a4]=butter(N,[0.10.3],''stop''); %bandstop0.1-0.3

figure(1);freqz(b1,a1);%画数字滤波器的频谱
figure(2);freqz(b2,a2);
figure(3);freqz(b3,a3);
figure(4);freqz(b4,a4);

b11=buffer(round(b132768),1)''%变换成DSP用的系数
a11=buffer(round(a132768),1)''
b21=buffer(round(b232768),1)''
a21=buffer(round(a232768),1)''
b31=buffer(round(b332768),1)''
a31=buffer(round(a332768),1)''
b41=buffer(round(b432768),1)''
a41=buffer(round(a432768),1)''


t=0:1/100000:1/100;%采样率为100KHz,或离散时间间隔1/100000
x=sin(2pi1500t)+sin(2pi10000t)+sin(2pi20000t);%1.5KHz、10KHz、20KHz的信号相叠加

xx=buffer(round(x/3.332768),1)''%参数2^15,把小数点移最高位后面后取整,然后排成1个一行便于输出。
csvwrite(''table5.txt'',xx)%参数表输出到文件中,输入信号x的离散值保存在文件table5.txt中,用来作DSP的输入信号

y1=filter(b1,a1,x);%低通滤波结果
y2=filter(b2,a2,x);%高通滤波结果
y3=filter(b3,a3,x);%带通滤波结果
y4=filter(b4,a4,x);%带阻滤波结果
%画出输入及滤波后的输出波形
figure(5);M=512;
subplot(5,1,1);plot(0:M-1,x(1:M));%在子图区域511中画输入信号x波形
subplot(5,1,2);plot(0:M-1,y1(1:M));%在子图区域512中画低通滤波结果波形
subplot(5,1,3);plot(0:M-1,y2(1:M));%在子图区域513中画高通滤波结果波形
subplot(5,1,4);plot(0:M-1,y3(1:M));%在子图区域514中画带通滤波结果波形
subplot(5,1,5);plot(0:M-1,y4(1:M));%在子图区域515中画带阻滤波结果波形
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%仿真后的波形如下:自上而下分别为输入、低通、高通、带通、带阻信号图形

下面是直接I型循环缓冲区法的参考程序: .title "IIR3.asm"
.mmregs
.def start
x0 .usect "x0",1
y0 .usect "y0",1
X .usect "X",5
Y .usect "Y",5
B .usect "B",5
A .usect "A",5
PA0 .set 0
PA1 .set 1
.data
table:
.word 0 ;x(n-4)
.word 0 ;x(n-3)
.word 0 ;x(n-2)
.word 0 ;x(n-1)

.word 0 ;y(n-4)
.word 0 ;y(n-3)
.word 0 ;x(n-2)
.word 0 ;x(n-1)

;低通,分号后为MATLAB中得到的系数
;b4~b0
;.word432768/10000/4;0.0004/4,b4
;.word1732768/10000/4;0.0017/4
;.word2532768/10000/4;0.0025/4
;.word1732768/10000/4;0.0017/4
;.word432768/10000/4;0.0004/4,b0
;a4~a0,下面要注意系数的正负问题
;.word-438332768/10000/4;0.4383/4;a4~a0
;.word2112232768/10000/4;-2.1122/4
;.word-3861232768/10000/4;3.8612/4
;.word3180632768/10000/4;-3.1806/4
;.word1.0000/4;a0/4

;高通MATLAB中得到的系数
;0.2754;-1.1017;1.6525;-1.1017;0.2754
;0.0762;-0.4844;1.2756;-1.5704;1.0000
;b4~b0
.word-275432768/10000/4
.word1101732768/10000/4
.word-1652532768/10000/4
.word1101732768/10000/4
.word-275432768/10000/4
;a4~a0
.word-76232768/10000/4
.word484432768/10000/4
.word-1275632768/10000/4
.word1570432768/10000/4
;.word1.0000/4;a0/4

.text
start: SSBX FRCT
STM #X,AR1 ;传送初始数据x(n-2),x(n-1)
RPT #3
MVPD #table,AR1+

STM #Y,AR1 ;传送初始数据y(n-2),y(n-1)
RPT #3
MVPD #table+4,AR1+

STM #B,AR1 ;传送系数B2,B1,B0
RPT #4
MVPD #table+8,AR1+

STM #A,AR1 ;传送系数A2,A1
RPT #3
MVPD #table+13,AR1+

STM #X+4,AR2 ;辅助寄存器指针初始化
STM #A+3,AR3
STM #Y+3,AR4
STM #B+4,AR5
STM #5,BK ;(BK)=3
STM #-1,AR0 ;(AR0)=-1
IIR: ;PORTR PA1,AR2 ;输入x(n)
mvkdx0,AR2
nop
MPY AR2+0%,AR5+0%,A ;计算前向通道
MAC AR2+0%,AR5+0%,A
MAC AR2+0%,AR5+0%,A
MAC AR2+0%,AR5+0%,A
MAC AR2,AR5+0%,A
MAC AR4+0%,AR3+0%,A ;计算反馈通道
MAC AR4+0%,AR3+0%,A
MAC AR4+0%,AR3+0%,A
MAC AR4+0%,AR3+0%,A
MAR AR3+0%
STHA,2,AR4;保存y(n),因系数除4所以结果左移2位
mvdkAR4,y0
nop
BD IIR
PORTW AR4,PA0 ;输出y(n)
.end

下面是直接I型循环缓冲区法的参考程序对应的中断向量表文件: vectors.obj
IIR3.obj
-oIIR3.out
-mIIR3.map
-estart

MEMORY
{
PAGE0:
EPROM: org=0090H,len=0F70H
VECS: org=0080H,len=0010H
PAGE1:
SPRAM: org=1000H,len=1000H
DARAM: org=2000H,len=2000H
}
SECTIONS
{
.text :>EPROM PAGE0
.data :>EPROM PAGE0
.bss:>SPRAMPAGE1
X: align(8){} >DARAM PAGE1
Y: align(8){} >DARAM PAGE1
B: align(8){} >DARAM PAGE1
A: align(8){} >DARAM PAGE1
x0:>DARAM PAGE1
y0:>DARAM PAGE1
.vectors:>VECS PAGE0
}


实验五FIR滤波器的DSP实现
一、实验原理
参考教材FIR滤波器的DSP实现方法。
二、实验内容与步骤
1.运行CCS。
2、FIR滤波器的DSP实现(软件仿真)。
1)在CCS环境下新建FIR工程和五个文件:fir.asm、fir.cmd、vectors.asm、indata.dat、outdata.dat。
2)分别编辑五个文件并将文件fir.asm、fir.cmd、vectors.asm添加到FIR工程中。参考程序如下。
①FIR.asm

用循环缓冲区和双操作数寻址方法实现FIR滤波器
N=80,y(n)=h0x(n)+h1x(n-1)+...+h78x(n-78)+h79x(n-79)
先用matlab,选择80点汉明窗设计一个截止频率为0.2pi的低通滤波器

.title "fir.asm"
.mmregs
.def start
.bss y,1 ;保存滤波结果
.bssindata,1;输入信号缓冲区(变量)
.bssoutdata,1;输出信号缓冲区(变量)
xn .usect "xn",80;xn
h .usect "h",80 ;h
;PA0 .set 0002H ;D/A端口地址
;PA1 .set 0008H ;A/D端口地址
.data
table:
.word-1,-4,-8,-12,-18,-25,-33,-42
.word-52,-63,-75,-86,-96,-103,-108,-107
.word-102,-89,-69,-39,0,49,109,179
.word260,350,449,555,667,782,898,1014
.word1126,1232,1330,1417,1492,1552,1596,1622
.word1631,1622,1596,1552,1492,1417,1330,1232
.word1126,1014,898,782,667,555,449,350
.word260,179,109,49,0,-39,-69,-89
.word-102,-107,-108,-103,-96,-86,-75,-63
.word-52,-42,-33,-25,-18,-12,-8,-4
.text
start:
SSBX FRCT ;小数乘法
STM #xn,AR1
RPT #79
ST #0,AR1+ ;把x(n)-x(n-79)赋始值0
STM #h,AR1
RPT #79
MVPD #table,AR1+ ;把参数表复制到数据存储区
STM #xn+79,AR3 ;AR3-->x(n-79)
STM #h+79,AR4 ;AR4-->h(n-79)
STM #80,BK ;循环缓冲区大小80
STM #-1,AR0 ;指针调整值-1
LD #xn,DP ;DP指向xn所在页
; PORTR PA1,@xn ;输入数据
LD #y,DP ;DP指向y所在页
FIR:
NOP
MVKD indata,AR3+0%;在这一行设置探针与断点用于从indata.dat文件中读输入数据
RPTZ A,#79
MAC AR3+0%,AR4+0%,A
STHA,@outdata;在这一行设置探针与断点用于将滤波结果写到文件outdata.dat中
NOP
;STH A,@y ;保存计算结果
;PORTW @y,PA0 ;硬件仿真时写D/A
B FIR ;跳转
;BD FIR ;延迟跳转
;PORTR PA1,AR3+0% ;硬件仿真时读A/D,新数据覆盖最老的数据
.end

②FIR.cmd
vectors.obj
fir.obj
-ofir.out
-mfir.map
-estart
MEMORY
{
PAGE0:
EPROM: org=0090H,len=0F70H
VECS: org=0080H,len=0010H
PAGE1:
SPRAM: org=1000H,len=1000H
DARAM: org=2000H,len=2000H
}
/由于在源程序中使用了BK寄存器,所以必须使用"align"命令/
SECTIONS
{
.text :>EPROM PAGE0
.data :>EPROM PAGE0
.bss :>SPRAM PAGE1
xn : align(128){}>DARAM PAGE1
h : align(128){}>DARAM PAGE1
.vectors:>VECS PAGE0
}
③vectors.asm。同实验一。
④indata.dat。在记事本中编辑该文件。第1行数据为“16512100111”,代表的含义为:文件类型整数数据类型起始地址数据页号数据长度;第2~31行数据为16384,即30个16384,第32~61行数据为0,即30个0。
⑤outdata.dat。无内容。
3)编译、链接、装载程序
4)设置探针、断点、及文件关联。见图5-1、5-2。

图5-12个探针、断点的设置位置示意图


图5-22个探针与文件关联的相关参数设置示意图
5)按F12运行程序(注意不要直接运行程序)并设置图形查看窗口。参见图5-3、5-4。

图5-3图形查看窗口有关参数的设置示意图

图5-4运行结果示意图
6)在程序运行过程中,在记事本中打开并更改、保存输入信号文件indata.dat的数据,观察输入输出信号波形,思考随输入信号频率的变化输出信号的变化规律。
①indata.dat的数据为60个16384+60个0
②indata.dat的数据为100个16384+100个0
③indata.dat的数据自己定义
三、思考题---对照参考程序,编写实现39阶低通、高通、带通、带阻FIR数字滤波器的DSP程序,并仿真。提示:滤波器系数一般通过MATLAB仿真得到。
附:利用MATLAB设计FIR低通滤波器
利用MATLAB程序设计出低通滤波器的系数。
程序说明:
A/D采样率fs定义为100KHZ;
设计一个截止频率为5KHZ的低通滤波器;注意:数字角频率Ω=ωT=2πf/fs
滤波器的阶数定为79;
采用窗函数设计法,利用MATLAB计算出滤波器的系数,然后将该系数应用到DSP的滤波程序中去。
以下是MATLAB程序代码。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
b1=fir1(79,0.1); %80pointhammingwindowFIRfilter,Wn=0.1π=2π5000/100000
b2=fir1(79,0.3,''high''); %80pointhighpassFIRfilter,Wn=0.3π=2π15000/100000=
b3=fir1(79,[0.10.3]); %bandpass0.1-0.3
b4=fir1(79,[0.10.3],''stop''); %bandstop0.1-0.3

fvtool(b1,1) %FlterVisualizationTool可心以查看幅度响应、冲激响应等
fvtool(b2,1)
fvtool(b3,1)
fvtool(b4,1)

h=buffer(round(b132768),8)''%参数2^15,把小数点移最高位后面后取整,然后排成8个一行便于输出。
csvwrite(''table1.txt'',h)%参数表输出到文件中
h=buffer(round(b232768),8)''%参数2^15,把小数点移最高位后面后取整,然后排成8个一行便于输出。
csvwrite(''table2.txt'',h)%参数表输出到文件中
h=buffer(round(b332768),8)''%参数2^15,把小数点移最高位后面后取整,然后排成8个一行便于输出。
csvwrite(''table3.txt'',h)%参数表输出到文件中
h=buffer(round(b432768),8)''%参数2^15,把小数点移最高位后面后取整,然后排成8个一行便于输出。
csvwrite(''table4.txt'',h)%参数表输出到文件中

%然后只要把参数表从table.txt中拷到代码中,每行前面加上''.word''

t=0:1/100000:1/100;%采样率为100KHz,一共采集1000个点
x=sin(2pi1500t)+sin(2pi10000t)+sin(2pi20000t);%1.5KHz、10KHz、20KHz的信号相叠加

xx=buffer(round(x/3.332768),1)''%参数2^15,把小数点移最高位后面后取整,然后排成1个一行便于输出。
csvwrite(''table5.txt'',h)%参数表输出到文件中,输入信号x的离散值保存在文件table5.txt中

y1=filter(b1,1,x);%低通滤波结果
y2=filter(b2,1,x);%高通滤波结果
y3=filter(b3,1,x);%带通滤波结果
y4=filter(b4,1,x);%带阻滤波结果
%画出输入输出波形
figure(1);subplot(5,1,1);plot(0:511,x(1:512));%在子图区域511中画输入信号x波形
subplot(5,1,2);plot(0:511,y1(1:512));%在子图区域512中画低通滤波结果波形
subplot(5,1,3);plot(0:511,y2(1:512));%在子图区域513中画高通滤波结果波形
subplot(5,1,4);plot(0:511,y3(1:512));%在子图区域514中画带通滤波结果波形
subplot(5,1,5);plot(0:511,y4(1:512));%在子图区域515中画带阻滤波结果波形
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

仿真后的波形如下:自上而下分别为输入、低通、高通、带通、带阻信号图形



实验六快速傅立叶变换(FFT)的实现
一、实验原理
参考教材《快速傅立叶变换的DSP实现方法》。
二、实验内容
FFT运算时间是衡量DSP芯片性能的一个重要指标,因此提高FFT的运算速度是非常重要的。在用DSP芯片实现FFT算法时,应充分利用DSP芯片所提供的各种软硬件资源,如片内RAM,比特反转寻址方式。
有关FFT程序说明如下:
1、fft.asm程序由以下部分组成,即
位码倒置程序;
第一级蝶形运算
第二级蝶形运算
第三级至第N级蝶形运算
求功率谱及输出程序
2、程序、数据空间的分配参见链接命令文件
3、正弦和余弦系数表由coeff.inc文件给出,主程序通过.copy汇编命令将正弦和余弦系数与程序代码汇编在一起(也可以用.include命令从coeff.inc文件中读入系数)。
数据文件coeff.inc给出1024复数点FFT的正弦、余弦系数各512个。利用此系数表可以完成8~1024点的FFT运算。
4、使用方法
1)根据N值,修改fft.asm中的两个常数,若N=128:
K_FFT_SIZE.set128
K_LOGN.set7
2)准备输入数据文件in.inc和fangbo.inc。输入数据按实部、虚部,实部、虚部,……顺序存放。
5、当N超过1024点时,除了修改K_FFT_SIZE和K_LOGN两个常数外,还要增加系数表,并且修改fft.cmd命令文件。
6、FFT模拟输入数据文件可以由MATLAB编程生成,也可以由CCS编程生成。
三、实验步骤---64点正弦波或方波信号FFT变换
输入信号为一正弦波或一方波,输入数据由MATLAB产生。实验步骤如下:
1.运行ccs,新建FFT工程,准备主程序文件fft.asm、中断向量表文件vectors.asm、链接命令文件fft.cmd、系数表文件coeff.inc、输入信号文件in.inc或fangbo.inc并将他们添加到FFT工程中,编译、链接、装载程序并运行。各文件内容请见后边的参考程序。
2.查看输入数据波形,打开图形显示设置对话框,按照图6-1设置参数,可得到图6-2或6-3所示图形。

图6-1图形显示属性设置对话框图6-2正弦信号时域图形6-3方波信号时域图形
3.查看输入数据的FFT功率谱,打开图形显示设置对话框,按照图6-4设置参数,可得到图6-5或6-6所示图形。

6-4图形显示属性设置对话框图6-5正弦信号FFT功率谱6-6方波信号FFT功率谱

四、参考程序
1)主程序fft.asm
.title "fft.asm"
.mmregs
.copy"coeff.inc";从文件coeff.inc中复制旋转因子系数
.copy"fangbo.inc";准备x(n)时,请确保X[k]的实部及虚部小于1,这样可防止计算时溢出
.def_c_int00
sine:.usect"sine",512;数据存储器中的正弦表起始地址
cosine:.usect "cosine",512;数据存储器中的余弦表起始地址
fft_data:.usect"fft_data",2048;保存每一级FFT结果X[k]的起始地址,原位运算
d_input:.usect "d_input",2048;保存输入信号x[n]的起始地址
fft_out:.usect"fft_out",1024;保存X[k]功率谱的起始地址
STACK.usect"STACK",10
K_DATA_IDX_1 .set 2;第一级运算时各组蝶形的地址增量
K_DATA_IDX_2 .set 4;第二级运算时各组蝶形的地址增量
K_DATA_IDX_3 .set 8;第三级运算时各组蝶形的地址增量
K_TWID_TBL_SIZE .set 512
K_TWID_IDX_3 .set 128
K_FLY_COUNT_3 .set 4;第一级运算时每组蝶形的地址增量
K_FFT_SIZE .set 64;本行用于设置DFT的长度(复数点数)。如N=64
K_LOGN.set6;蝶形的级数M=log2(N)
PA0.set 0;设置D/A端口地址
PA1.set 1;设置A/D端口地址
.bss d_twid_idx,1
.bss d_data_idx,1
.bss d_grps_cnt,1

.sect "fft_prg"
位倒码程序
.asg AR2,REORDERED;声明REORDERED为AR2的替代符号
.asg AR3,ORIGINAL_INPUT;声明ORIGINAL_INPUT为AR3的替代符号
.asg AR7,DATA_PROC_BUF;声明DATA_PROC_BUF为AR7的替代符号
_c_int00:SSBX FRCT
STM #STACK+10,SP

STM #d_input,AR1;获得输入信号
RPT #2K_FFT_SIZE-1
;PORTR PA1,AR1+
MVPD p_input,AR1+
;NOP;putaprobe,input2Ndataintod_input(dm)

STM #sine,AR1;movesine1(512)intosine(dm)
RPT #511
MVPD sine1,AR1+

STM #cosine,AR1;movecosine1intocosine(dm)
RPT #511
MVPD cosine1,AR1+

STM #d_input,ORIGINAL_INPUT;ORIGINAL_INPUT指向输入信号首地址d_input
STM #fft_data,DATA_PROC_BUF;DATA_PROC_BUF指向FFT结果首地址fft_data
MVMM DATA_PROC_BUF,REORDERED;RECORDEREDpointfft_datatoo

STM #K_FFT_SIZE-1,BRC;BRC=N-1。N=8,则BRC=7
RPTBD bit_rev_end-1;下面的程序块重复执行7+1=8次。将顺序x(1)~x(7)变成倒位序x(1)~x(7)。
STM #K_FFT_SIZE,AR0;AR0=N=8是缓冲区大小的一半。8个实部+8个虚部
MVDD ORIGINAL_INPUT+,REORDERED+;0000(0)-1000(4)-0100(2)-1100(6)-0010(1)-1010(5)-0110(3)-1110(7)
MVDD ORIGINAL_INPUT-,REORDERED+;0001(0)-1001(4)-0101(2)-1101(6)-0011(1)-1011(5)-0111(3)-1111(7)
MAR ORIGINAL_INPUT+0B;位倒序寻址。右进位加法运算ORIGINAL_INPUT=ORIGINAL_INPUT+AR0
bit_rev_end:NOP

FFTCODE
.asg AR1,GROUP_COUNTER
.asg AR2,PX
.asg AR3,QX
.asg AR4,WR
.asg AR5,WI
.asg AR6,BUTTERFLY_COUNTER
.asg AR7,STAGE_COUNTER

第一级蝶形运算stage1(实部+实部,虚部+虚部),(实部-实部,虚部-虚部)
STM #0,BK;循环寻址的缓冲区大小BK=0
;LD #-1,ASM;移位数域ASM=-1,对应右移1位;protectflowover,alloutput/2
LD #0,ASM

STM #fft_data,PX;PX指向第1个输入信号实部,这里的数据是位倒序后的数据
LD PX,16,A;A=(PX)<<16,或将PX指向的值(实部)装载到A的高16位中
STM #fft_data+K_DATA_IDX_1,QX;K_DATA_IDX_1是第一级蝶形地址增量2,QX指向第2个输入信号实部

STM #K_FFT_SIZE/2-1,BRC;BRC=N/2-1。N=8,则BRC=8/2-1=3
RPTBD stage1end-1;N=8时下面的程序块重复执行3+1=4次。即做四次蝶形运算
STM #K_DATA_IDX_1+1,AR0;N=8时,AR0=#K_DATA_IDX_1+1=3
SUB QX,16,A,B;B=A-(QX)<<16=(PX)<<16-(QX)<<16=实部-实部
ADD QX,16,A;A=A+(QX)<<16=(PX)<<16+(QX)<<16=实部+实部
STH A,ASM,PX+;实部+实部的值存入到PX指向的存储单元中,然后PX指向第1个输入信号虚部
ST B,QX+;实部-实部的值存入到QX指向的存储单元中,然后QX指向第2个输入信号虚部
||LD PX,A;A=(PX)<<16,或将PX指向的值(虚部)装载到A的高16位中
SUB QX,16,A,B;B=A-(QX)<<16=(PX)<<16-(QX)<<16=虚部-虚部
ADD QX,16,A;A=A+(QX)<<16=(PX)<<16+(QX)<<16=虚部+虚部
STH A,ASM,PX+0%;虚部+虚部的值存入到PX指向的存储单元中,然后PX指向第3个输入信号实部
ST B,QX+0%;虚部-虚部的值存入到QX指向的存储单元中,然后QX指向第4个输入信号实部
||LD PX,A;A=(PX)<<16,或将PX指向的值(实部)装载到A的高16位中
stage1end:NOP

第二级蝶形运算stage2
STM #fft_data,PX;PX=fft_data+0指向第1个输入信号实部
STM #fft_data+K_DATA_IDX_2,QX;QX=fft_data+4指向第3个输入信号实部(+0,+1,+2,+3)

STM #K_FFT_SIZE/4-1,BRC;BRC=N/2-1。N=8,则BRC=8/4-1=1
LD PX,16,A;A=(PX)<<16,或将PX指向的值(实部)装载到A的高16位中
RPTBD stage2end-1;N=8时下面的程序块重复执行1+1=2次。即做22=4次蝶形运算
STM #K_DATA_IDX_2+1,AR0;N=8时,AR0=#K_DATA_IDX_2+1=5
;1stbutterfly:(实部+实部,虚部+虚部),(实部-实部,虚部-虚部)
SUBQX,16,A,B;B=A-(QX)<<16=(PX)<<16-(QX)<<16=实部-实部
ADD QX,16,A;A=A+(QX)<<16=(PX)<<16+(QX)<<16=实部+实部
STH A,ASM,PX+;实部+实部的值存入到PX指向的存储单元中,然后PX指向第1个输入信号虚部
ST B,QX+;实部-实部的值存入到QX指向的存储单元中,然后QX指向第2个输入信号虚部
||LD PX,A;A=(PX)<<16,或将PX指向的值(虚部)装载到A的高16位中
SUBQX,16,A,B;B=A-(QX)<<16=(PX)<<16-(QX)<<16=虚部-虚部
ADD QX,16,A;A=A+(QX)<<16=(PX)<<16+(QX)<<16=虚部+虚部
STHA,ASM,PX+;虚部+虚部的值存入到PX指向的存储单元中,然后PX指向第2个输入信号实部
STH B,ASM,QX+;虚部-虚部的值存入到QX指向的存储单元中,然后QX指向第4个输入信号实部
;2ndbutterfly:(实部+虚部,虚部-实部),(实部-虚部,虚部+实部)
MAR QX+;QX指向第4个输入信号虚部
ADD PX,QX,A;A=(PX)<<16+(QX)<<16=实部+虚部???
SUB PX,QX-,B;B=(PX)<<16-(QX)<<16=实部-虚部,然后QX指向第4个输入信号实部???

STH A,ASM,PX+;实部+虚部的值存入到PX指向的存储单元(实部)中,然后PX指向第2个输入信号虚部
SUB PX,QX,A;A=(PX)<<16-(QX)<<16=虚部-实部,
ST B,QX;实部-虚部的值存入到QX指向的存储单元(实部)中
||LDQX+,B;B=(QX)<<16,QX指向第4个输入信号虚部。B=第4个输入信号实部???

ST A,PX;虚部-实部的值存入到PX指向的存储单元(虚部)中
||ADD PX+0%,A;A=(PX)+B=(PX)+(QX)=虚部+实部,然后PX指向第5个输入信号实部
ST A,QX+0%;虚部+实部的值存入到QX指向的存储单元(虚部)中,然后QX指向第6个输入信号实部
||LD PX,A

stage2end:NOP

第三级至log2N级蝶形运算stage3throughStagelog2N
STM #K_TWID_TBL_SIZE,BK;缓冲区大小寄存器BK=K_TWID_TBL_SIZE=512
ST #K_TWID_IDX_3,(d_twid_idx);变量d_twid_idx=K_TWID_IDX_3=128---???
STM #K_TWID_IDX_3,AR0;AR0=K_TWID_IDX_3=128---???
STM #cosine,WR;WR指向cosine表
STM #sine,WI;WI指向ine表
STM #K_LOGN-2-1,STAGE_COUNTER;N=8时,STAGE_COUNTER=K_LOGN=3
ST #K_FFT_SIZE/8-1,(d_grps_cnt);N=8时,变量d_grps_cnt=K_FFT_SIZE/8-1=0
STM #K_FLY_COUNT_3-1,BUTTERFLY_COUNTER;N=8时,BUTTERFLY_COUNTER=K_FLY_COUNT_3-1=3
ST #K_DATA_IDX_3,(d_data_idx);变量d_data_idx=K_DATA_IDX_3=8
stage:
STM #fft_data,PX;PX=fft_data+0指向第1个输入信号实部
LD (d_data_idx),A;A=d_data_idx=8
ADD (PX),A;A=A+PX---???
STLM A,QX;QX=A+PX指向第5个输入信号实部---???
;MVDK d_grps_cnt,GROUP_COUNTER;N=8时,GROUP_COUNTER=d_grps_cnt=0
MVKD (d_grps_cnt),GROUP_COUNTER;N=8时,GROUP_COUNTER=d_grps_cnt=0
group: MVMD BUTTERFLY_COUNTER,BRC;N=8时,BRC=BUTTERFLY_COUNTER=3---???
RPTBD butterflyend-1;WR指向的是cosine表,WI指向的是sine表
;下面程序段先乘以旋转因子再加减
LD WR,T;复信号乘以旋转因子,实部=Recos()+Imsin(),虚部=-Resin()+Imcos()
MPY QX+,A;A=(QX)T=(QX)(WR)=Recos(),QX指向第5个输入信号虚部
MACR WI+0%,QX-,A;A=A+Imsin()=实部=Recos()+Imsin(),QX指向第5个输入信号实部,T=WI
;问题在这里:WI=2200H,但是AR5却=2080,???,将SIN段定位到2000H后就可以了
ADD PX,16,A,B;B=A+(PX)<<16,对应PX指向的实部
ST B,PX;
||SUB PX+,B;B=(PX)<<16-A,,对应QX指向的实部,同时PX指向第5个输入信号虚部
ST B,QX;
||MPY QX+,A;A=(QX)T=(QX)(WI)=Resin(),QX指向第5个输入信号虚部
MASR QX,WR+0%,A;A=A-(QX)(WR)=-虚部=-(-Resin()+Imcos())
ADD PX,16,A,B;B=A+(PX)<<16=(PX)-(-Resin()+Imcos()),对应QX指向的虚部
ST B,QX+;存入QX指向的虚部,同时QX指向第6个输入信号实部
||SUB PX,B;B=(PX)<<16-A=(PX)+(-Resin()+Imcos()),对应PX指向的虚部
LD WR,T;
ST B,PX+;存PX指向的虚部,同时PX指向第2个输入信号实部
||MPY QX+,A;A=(QX)T=(QX)(WR)=Recos(),QX指向第6个输入信号虚部
butterflyend:nop
;Updatapointersfornextgroup
PSHM AR0;AR0=K_TWID_IDX_3=128被压入堆栈
;MVDK d_data_idx,AR0;AR0=d_data_idx=8
MVKD (d_data_idx),AR0
nop
nop
MAR PX+0;PX=PX+8
MAR QX+0;QX=QX+8
BANZD group,GROUP_COUNTER-;N=8时,GROUP_COUNTER=0
POPM AR0
MAR QX-
;Updata countersandindicesfornextstage
LD (d_data_idx),A;N=8时,A=d_data_idx=K_DATA_IDX_3=8
SUB #1,A,B;B=A-1=7
STLM B,BUTTERFLY_COUNTER;BUTTERFLY_COUNTER=B=7,当N=16时,最后一级有7个BUTTERFLY
STL A,1,(d_data_idx);d_data_idx=A<<1=16,,当N=16时,最后一级地址增量为16
LD (d_grps_cnt),A;N=8时,A=d_grps_cnt=_FFT_SIZE/8-1=0
;STL A,ASM,(d_grps_cnt);d_grps_cnt=A< STL A,-1,(d_grps_cnt)
LD (d_twid_idx),A;A=d_twid_idx=K_TWID_IDX_3=128
;STL A,ASM,(d_twid_idx);d_twid_idx=A< STL A,-1,(d_twid_idx)
BANZD stage,STAGE_COUNTER-;N=8时,STAGE_COUNTER=0
MVKD (d_twid_idx),AR0;AR0=_twid_idx=64
fft_end:
计算功率谱Computethepowerspectrum
STM #fft_data,AR2
STM #fft_out,AR4
;STM #K_FFT_SIZE2-1,BRC
STM #K_FFT_SIZE-1,BRC
RPTB power_end-1
SQUR AR2+,A
SQURA AR2+,A
STH A,AR4+
;STLA,AR4+
power_end:
STM #fft_out,AR4
RPT #K_FFT_SIZE-1
PORTW AR4+,PA0
here: B here
.end
2)中断向量表文件vectors.asm

Resetvectors

.title"vectors.asm"
.ref _c_int00
.sect ".vectors"
B _c_int00
.end
3)链接命令文件.asm
vectors.obj
fft.obj
-offt.out
MEMORY
{PAGE0:
P_SINE:origin=0x0100,len=0x0200/512W/
P_COSINE:origin=0x0300,len=0x0200/512W/
FFT_PROG:origin=0x0500,len=0x0A00/512W/
P_INPUT:origin=0x1000,len=0x0800/21024W/
VECT:origin=0xff80,len=0x80
PAGE1:
D_INPUT:origin=0x2800,len=0x0800/21024W/
D_FFT:origin=0x3000,len=0x0800/21024W/
D_FFTOUT:origin=0x3800,len=0x0400/21024W/
D_SINE:origin=0x2000,len=0x0200/512W/
D_COSINE:origin=0x2400,len=0x0200/512W/
SPRAM:origin=0x0080,len=0x10
}
SECTIONS
{
fft_prg:>FFT_PROGPAGE0
p_input:>P_INPUTPAGE0
sine1:>P_SINEPAGE0
cosine1:>P_COSINEPAGE0
.vectors:>VECTPAGE0
sine:align(512){}>D_SINEPAGE1
cosine:align(512){}>D_COSINEPAGE1
d_input:>D_INPUTPAGE1
fft_data:>D_FFTPAGE1
fft_out:>D_FFTOUTPAGE1
.bss:>SPRAMPAGE1
STACK:>SPRAMPAGE1
}
4)系数表文件coeff.inc
sine1:.sect"sine1"
.word0,201,402,603,804,1005,1206,1407,1607,1808
.word2009,2210,2410,2611,2811,3011,3211,3411,3611,3811
.word4011,4210,4409,4609,4808,5006,5205,5403,5602,5800
.word5997,6195,6392,6589,6786,6983,7179,7375,7571,7766
.word7961,8156,8351,8545,8739,8933,9126,9319,9512,9704
.word9896,10087,10278,10469,10659,10849,11039,11228,11416,11605
.word11793,11980,12167,12353,12539,12725,12910,13094,13278,13462
.word13645,13828,14010,14191,14372,14552,14732,14912,15090,15269
.word15446,15623,15800,15976,16151,16325,16499,16673,16846,17018
.word17189,17360,17530,17700,17869,18037,18204,18371,18537,18703
.word18868,19032,19195,19358,19519,19681,19841,20001,20159,20318
.word20475,20631,20787,20942,21097,21250,21403,21555,21706,21856
.word22005,22154,22301,22448,22594,22740,22884,23027,23170,23312
.word23453,23593,23732,23870,24007,24144,24279,24414,24547,24680
.word24812,24943,25073,25201,25330,25457,25583,25708,25832,25955
.word26077,26199,26319,26438,26557,26674,26790,26905,27020,27133
.word27245,27356,27466,27576,27684,27791,27897,28002,28106,28208
.word28310,28411,28511,28609,28707,28803,28898,28993,29086,29178
.word29269,29359,29447,29535,29621,29707,29791,29874,29956,30037
.word30117,30196,30273,30350,30425,30499,30572,30644,30714,30784
.word30852,30919,30985,31050,31114,31764,31237,31298,31357,31414
.word31471,31526,31581,31634,31685,31736,31785,31834,31881,31927
.word31971,32015,32057,32098,32138,32176,32214,32250,32285,32319
.word32353,32383,32413,32442,32469,32496,32521,32545,32568,32589
.word32610,32629,32647,32663,32679,32693,32706,32718,32728,32737
.word32745,32752,32758,32762,32765,32767,32767,32767,32765,32762
.word32758,32752,32745,32737,32728,32718,32706,32693,32679,32663
.word32647,32629,32610,32589,32568,32545,32521,32496,32469,32442
.word32413,32383,32351,32319,32285,32250,32214,32176,32138,32098
.word32057,32015,31971,31927,31881,31834,31785,31736,31685,31634
.word31581,31526,31471,31414,31357,31298,31273,31176,31114,31050
.word30985,30919,30852,30784,30714,30644,30572,30499,30425,30350
.word30273,30796,30117,30037,29956,29874,29791,29707,29621,29535
.word29447,29359,29269,29178,29086,28993,28898,28803,28707,28609
.word28511,28411,28310,28208,28106,28002,27897,27791,27684,27576
.word27466,27356,27245,27133,27020,26905,26790,26674,26557,26438
.word26319,26199,26077,25955,25832,25708,25583,25457,25330,25201
.word25073,24943,24812,24680,24547,24414,24279,24144,24007,23870
.word23732,23573,23453,23312,23170,23027,22884,22740,22594,22448
.word22301,22154,22005,21856,21706,21555,21403,21250,21097,20942
.word20787,20631,20475,20318,20159,20001,19841,19681,19519,19358
.word19195,19032,18868,18703,18537,18371,18204,18037,17869,17700
.word17530,17360,17189,17018,16846,16673,16499,16325,16151,15976
.word15800,15623,15446,15269,15090,14912,14732,14552,14372,14191
.word14010,13828,13645,13462,13278,13094,12910,12725,12539,12353
.word12167,11980,11793,11605,11416,11228,11039,10849,10659,10469
.word10278,10087,9896,9704,9512,9319,9126,8933,8739,8545
.word8351,8156,7961,7766,7571,7375,7179,6983,6786,6589
.word6392,6195,5997,5800,5602,5403,5205,5006,4808,4609
.word4409,4210,4011,3811,3611,3411,3211,3011,2811,2611
.word2410,2210,2009,1808,1607,1407,1206,1005,804,603
.word402,201

cosine1:.sect"cosine1"
.word32767,32767,32765,32762,32758,32752,32745,32737,32728,32718
.word32706,32693,32679,32663,32647,32629,32610,32589,32568,32545
.word32521,32496,32469,32442,32413,32383,32351,32319,32285,32250
.word32214,32176,32138,32098,32057,32015,31971,31927,31881,31834
.word31785,31736,31685,31634,31581,31526,31471,31414,31357,31298
.word31273,31176,31114,31050,30985,30919,30852,30784,30714,30644
.word30572,30499,30425,30350,30273,30796,30117,30037,29956,29874
.word29791,29707,29621,29535,29447,29359,29269,29178,29086,28993
.word28898,28803,28707,28609,28511,28411,28310,28208,28106,28002
.word27897,27791,27684,27576,27466,27356,27245,27133,27020,26905
.word26790,26674,26557,26438,26319,26199,26077,25955,25832,25708
.word25583,25457,25330,25201,25073,24943,24812,24680,24547,24414
.word24279,24144,24007,23870,23732,23573,23453,23312,23170,23027
.word22884,22740,22594,22448,22301,22154,22005,21856,21706,21555
.word21403,21250,21097,20942,20787,20631,20475,20318,20159,20001
.word19841,19681,19519,19358,19195,19032,18868,18703,18537,18371
.word18204,18037,17869,17700,17530,17360,17189,17018,16846,16673
.word16499,16325,16151,15976,15800,15623,15446,15269,15090,14912
.word14732,14552,14372,14191,14010,13828,13645,13462,13278,13094
.word12910,12725,12539,12353,12167,11980,11793,11605,11416,11228
.word11039,10849,10659,10469,10278,10087,9896,9704,9512,9319
.word9126,8933,8739,8545,8351,8156,7961,7766,7571,7375
.word7179,6983,6786,6589,6392,6195,5997,5800,5602,5403
.word5205,5006,4808,4609,4409,4210,4011,3811,3611,3411
.word3211,3011,2811,2611,2410,2210,2009,1808,1607,1407
.word1206,1005,804,603,402,201,0,-201,-402,-603
.word-804,-1005,-1206,-1407,-1607,-1808,-2009,-2210,-2410
.word-2611,-2811,-3011,-3211,-3411,-3611,-3811,-4011,-4210
.word-4409,-4609,-4808,-5006,-5205,-5403,-5602,-5800,-5997
.word-6195,-6392,-6589,-6786,-6983,-7179,-7375,-7571,-7766
.word-7961,-8156,-8351,-8545,-8739,-8933,-9126,-9319,-9512
.word-9704,-9896,-10087,-10278,-10469,-10659,-10849,-11039
.word-11228,-11416,-11605,-11793,-11980,-12167,-12353
.word-12539,-12725,-12910,-13094,-13278,-13462,-13645
.word-13828,-14010,-14191,-14372,-14552,-14732,-14912
.word-15090,-15269,-15446,-15623,-15800,-15976,-16151
.word-16325,-16499,-16673,-16846,-17018,-17189,-17360
.word-17530,-17700,-17869,-18037,-18204,-18371,-18537
.word-18703,-18868,-19032,-19195,-19358,-19519,-19681
.word-19841,-20001,-20159,-20318,-20475,-20631,-20787
.word-20942,-21097,-21250,-21403,-21555,-21706,-21856
.word-22005,-22154,-22301,-22448,-22594,-22740,-22884
.word-23027,-23170,-23312,-23453,-23593,-23732,-23870
.word-24007,-24144,-24279,-24414,-24547,-24680,-24812
.word-24943,-25073,-25201,-25330,-25457,-25583,-25708
.word-25832,-25955,-26077,-26199,-26319,-26438,-26557
.word-26674,-26790,-26905,-27020,-27133,-27245,-27356
.word-27466,-27576,-27684,-27791,-27897,-28002,-28106
.word-28208,-28310,-28411,-28511,-28609,-28707,-28803
.word-28898,-28993,-29086,-29178,-29269,-29359,-29447
.word-29535,-29621,-29707,-29791,-29874,-29956,-30037
.word-30117,-30196,-30273,-30350,-30425,-30499,-30572
.word-30644,-30714,-30784,-30852,-30919,-30985,-31050
.word-31114,-31764,-31237,-31298,-31357,-31414,-31471
.word-31526,-31581,-31634,-31685,-31736,-31785,-31834
.word-31881,-31927,-31971,-32015,-32057,-32098,-32138
.word-32176,-32214,-32250,-32285,-32319,-32353,-32383
.word-32413,-32442,-32469,-32496,-32521,-32545,-32568
.word-32589,-32610,-32629,-32647,-32663,-32679,-32693
.word-32706,-32718,-32728,-32737,-32745,-32752,-32758
.word-32762,-32765,-32767
5)正弦波文件in.inc
p_input:.sect"p_input"
.word0
.word0
.word161
.word0
.word320
.word0
.word476
.word0
.word627
.word0
.word772
.word0
.word910
.word0
.word1039
.word0
.word1158
.word0
.word1266
.word0
.word1362
.word0
.word1445
.word0
.word1514
.word0
.word1568
.word0
.word1607
.word0
.word1631
.word0
.word1638
.word0
.word1631
.word0
.word1607
.word0
.word1568
.word0
.word1514
.word0
.word1445
.word0
.word1362
.word0
.word1266
.word0
.word1158
.word0
.word1039
.word0
.word910
.word0
.word772
.word0
.word627
.word0
.word476
.word0
.word319
.word0
.word161
.word0
.word0
.word0
.word-161
.word0
.word-319
.word0
.word-476
.word0
.word-627
.word0
.word-772
.word0
.word-910
.word0
.word-1039
.word0
.word-1159
.word0
.word-1266
.word0
.word-1362
.word0
.word-1445
.word0
.word-1514
.word0
.word-1567
.word0
.word-1606
.word0
.word-1631
.word0
.word-1638
.word0
.word-1631
.word0
.word-1607
.word0
.word-1569
.word0
.word-1513
.word0
.word-1445
.word0
.word-1362
.word0
.word-1267
.word0
.word-1158
.word0
.word-1039
.word0
.word-910
.word0
.word-772
.word0
.word-626
.word0
.word-475
.word0
.word-319
.word0
.word-160
.word06)方波文件fangbo.incp_input:.sect"p_input"
.word 410
.word 0
.word 410
.word 0
.word 410
.word 0
.word 410
.word 0
.word 410
.word 0
.word 410
.word 0
.word 410
.word 0
.word 410
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 410
.word 0
.word 410
.word 0
.word 410
.word 0
.word 410
.word 0
.word 410
.word 0
.word 410
.word 0
.word 410
.word 0
.word 410
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 410
.word 0
.word 410
.word 0
.word 410
.word 0
.word 410
.word 0
.word 410
.word 0
.word 410
.word 0
.word 410
.word 0
.word 410
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 410
.word 0
.word 410
.word 0
.word 410
.word 0
.word 410
.word 0
.word 410
.word 0
.word 410
.word 0
.word 410
.word 0
.word 410
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
7)利用MATLAB获取复数形式的输入信号的一种方法N=64;t=0:1/100000:1/100;
x=sin(2pi1500t)+sin(2pi10000t)+sin(2pi20000t);
xx=round(x/3/N32768);
forn=1:N
y(2(n-1)+1)=xx(n);
y(2n)=0;
end
h=buffer(y,8)'';
csvwrite(''input.inc'',h);
献花(0)
+1
(本文系依米荷阳首藏)