这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » FPGA » TI C54xx DSP 十天速成讲义 <七>

共37条 1/4 1 2 3 4 跳转至

TI C54xx DSP 十天速成讲义 <七>

菜鸟
2006-12-15 18:29:14     打赏
[replyview]实验7.1 FIR ;============================================================= ; fir4.asm ;用用循环缓冲区和双操作数寻址方法实现FIR滤波器 ;先用matlab,选择80点汉明窗设计一个截止频率为0.2π的低通滤波器 ; 本例与前不同的是系数直接引用程序存储器的系数表 ;N=5 y(n)=h0*x(n)+h1*x(n-1)+h2*x(n-2)+h3*x(n-3)+h4*x(n-4) ;============================================================= .title "fir4.asm" .mmregs .def start ;分配数据存储区 .bss y,1 ;y xn .usect "xn",80 ;xn h .usect "h",80 ;h PA0 .set 0000H ;数据输出端口 PA1 .set 0001H ;数据输入端口 ;参数表 .data table: .word -7,-18,-24,-22,-9,11,33,48 ;已在Matlab中转成十六进制的小数 .word 46,20,-24,-73,-104,-97,-43,49 .word 146,204,187,81,-91,-268,-371,-337 .word -144,162,476,661,603,261,-297,-894 .word -1283,-1222,-562,697,2373,4142,5618,6456 .word 6456,5618,4142,2373,697,-562,-1222,-1283 .word -894,-297,261,603,661,476,162,-144 .word -337,-371,-268,-91,81,187,204,146 .word 49,-43,-97,-104,-73,-24,20,46 .word 48,33,11,-9,-22,-24,-18,-7 start: SSBX FRCT ;小数乘法 ;把参数表复制到数据存储区 STM #h,AR1 RPT #79 MVPD #table,*AR1+ ;把x(n)-x(n-79)赋始值0 STM #xn,AR1 RPT #79 ST #0,*AR1+ STM #xn+79,AR3 ;x(n-79)---AR3 STM #h+79,AR4 ;h(n-79)---AR4 STM #80,BK ;循环缓冲区大小80 STM #-1,AR0 ;指针调整值-1 LD #xn,DP ;DP指向xn所在页 PORTR PA1,@xn ;输入数据 LD #y,DP ;DP指向y所在页 FIR: RPTZ A,#79 ;进行一次FIR运算 MAC *AR3+0%,*AR4+0%,A;A=(AR3)*(AR4)+A, AR3=AR3+AR0,AR4=AR4+AR0 STH A,@y ;保存计算结果 PORTW @y,PA0 ;输出结果 BD FIR ;读入下一个数据并进行下一次计算 PORTR PA1,*AR3+0% ;新数据覆盖了最旧的数据 .end 实验7.2 IIR .mmregs .global codestart K_DATA_SIZE .set 256 ;输入数据个数 K_BUFFER_SIZE .set 8 ;缓冲大小,需是2的整数次幂,并大于a、b的个数 K_STACK_SIZE .set 256 ;堆栈大小 K_A .set 3 ;a向量个数 K_B .set 4 ;b向量的个数 K_CIR .set 4 ;>=a、b的长度,也可以设为K_BUFFER_SIZE-1 STACK .usect "stack",K_STACK_SIZE SYSTEM_STACK .set K_STACK_SIZE+STACK .data DATA_DP: .align K_BUFFER_SIZE bufferdatax: .space K_BUFFER_SIZE*16 ;size in bits bufferdatay: .space K_BUFFER_SIZE*16 ;size in bits inputdata: .word 0 filterdata: .word 0 .text .asg AR2, ORIGIN .asg AR3, INPUT .asg AR4, FILTER .asg AR5, OUTPUT codestart: SSBX FRCT SSBX INTM LD #DATA_DP,DP STM #SYSTEM_STACK, SP CALL filter_start NOP NOP NOP LOOP: B LOOP .def b0,b1,b2,b3,a1,a2,a3; .def filter_start b0 .set 1456H ;b1=0.1589 *2^15 b1 .set 3D07H ;b2=0.4768 b2 .set 3D07H ;b3=0.4768 b3 .set 1456H ;b4=0.1589 a1 .set -103AH ;a1=-0.1268 a2 .set 430FH ;a2=0.5239 a3 .set -1016H ;a3=-0.1257 ;================================================================= ;滤波子程序:filter_start ;================================================================= .text filter_start: STM #K_CIR,BK ;设置环形buffer的大小 STM #1,AR0 ;和步长 STM #inputdata,ORIGIN ;AR2 STM #bufferdatax,INPUT ;AR3 STM #bufferdatay,FILTER ;AR4 STM #filterdata,OUTPUT ;AR5 ;初始化 RPT #K_B-1-1 ; ST #0,*INPUT+0% ;x(-1)、x(-2)、x(-3)设为0 RPT #K_A-1 ST 0,*FILTER+% ;y(-1)、y(-2)、y(-3)设为0 STM #bufferdatay,FILTER STM #K_DATA_SIZE-1,BRC ;块循环次数,头三个值已经直接通过了 RPTB filter_end-1 ;块循环结束位置 ;可以把块循环改成中断调用,有新数据就中断一次。 nop ;数据从件导入点,加nop保证数据在使用前导入 nop MVDD *ORIGIN,*INPUT ;新数据 MAR *+INPUT(-K_B+1)% MPY *INPUT+0%,#b3,B ;B=x(n-3)*b3, i=i+1 LD B,A MPY *INPUT+0%,#b2,B ;B=x(n-2)*b2, i=i+1 ADD B,A MPY *INPUT+0%,#b1,B ;B=x(n-1)*b1, i=i+1 ADD B,A MPY *INPUT+0%,#b0,B ;B=x(n)*b0, i=i+1 ADD B,A MPY *FILTER+0%,#a3,B ;B=y(n-3)*a3, j=j+1 j=n-3为y的指针 ADD B,A MPY *FILTER+0%,#a2,B ;B=y(n-2)*a2, j=j+1 ADD B,A MPY *FILTER+0%,#a1,B ;B=y(n-1)*a1, j=j+1 ADD B,A STH A,*FILTER ;传送y(n)至y区, ;16位小数相乘得到的是32位小数 STH A,*OUTPUT ;传送y(n)至结果区 ;取前16位就行了 MAR *+FILTER(-K_A+1)% nop nop ;数据文件导出点,加nop保证数据在导出前已更新 filter_end: NOP ;循环结束 RET .end [/replyview]



关键词: C54xx     十天     速成     讲义     数据    

菜鸟
2006-12-16 03:15:00     打赏
2楼
[em07]

菜鸟
2006-12-16 21:01:00     打赏
3楼
xieixer

菜鸟
2006-12-18 17:32:00     打赏
4楼
look

菜鸟
2006-12-20 23:32:00     打赏
5楼
[em05]

菜鸟
2007-01-01 22:10:00     打赏
6楼
look

菜鸟
2007-01-04 08:55:00     打赏
7楼

菜鸟
2007-01-06 01:07:00     打赏
8楼
ff

菜鸟
2007-01-08 21:15:00     打赏
9楼
22

菜鸟
2007-02-25 06:25:00     打赏
10楼
ddddddddddddddddddddd

共37条 1/4 1 2 3 4 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]