声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1144|回复: 2

[滤波] 求助:如何在DSP上用汇编语言观测IIR滤波效果?

[复制链接]
发表于 2008-6-5 06:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
本帖最后由 wdhd 于 2016-9-10 14:41 编辑

  各位大侠:
  现我有个问题是:在5402 DSP实验箱上实现IIR滤波一般都是用C语言,可以通过view/graph来观测滤波效果,可是当我改成用汇编语言时不知该怎么设置才能观测到同用C语言实验时同样的效果,程序见下,请各位大侠指教,谢谢。
  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
回复
分享到:

使用道具 举报

发表于 2008-6-5 09:00 | 显示全部楼层
直接观察滤波结果的地址,效果一样。
 楼主| 发表于 2008-6-6 21:11 | 显示全部楼层
谢谢!我尝试一下。我上述目的只要是想动态观测滤波效果,不知你是否尝试过?
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-9-21 21:55 , Processed in 0.051282 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表