⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zhy_205.asm

📁 CCS环境下系数对称FIR滤波器的实现方法。
💻 ASM
字号:
*************************************************************
*  系数对称FIR滤波器的实现方法
*  N=8的FIR滤波器,若h(n)=h(N-1-n),就是系数对称滤波器,其输出 *
*  方程:y(n) = h0*x(n) + h1*x(n-1) + h2*x(n-2) + h3*x(n-3)  *
*             +h4*x(n-4)+h5*x(n-5) + h6*x(n-6) + h7*x(n-7)  *
*            = h0*(x(n)+x(n-7))   + h1*(x(n-1)+x(x-6))      *
*              h2*(x(n-2)+x(n-5)) + h3*(x(n-3)+x(n-4))      *
*                                                           *
*-----------------------------------------------------------*
*  程序来源:DSP技术与应用实例(赵红怡)     Page 205          *
*                                            lvlishan       *
*                                            2009 04 13     *
*                                            2009 04 17     *
*************************************************************
		.title   "FIR4.ASM"
		.mmregs
		.def     _c_int00
		.bss     y,1
x_new   .usect   "DATA1",4
x_old   .usect   "DATA2",4
x_in    .usect   "DATA3",4
x_out   .usect   "DATA4",4
y_out   .usect   "DATA5",256
size    .set     4
PA0     .set     0
PA1     .set     1
		.data
COEF    .word    1*32768/10,2*32768/10 ;对称的系数,只给出N/2=4个
		.word    3*32768/10,4*32768/10
		.text
_c_int00:
		LD       #x_new,DP ;设置DP指针
		SSBX     FRCT      ;乘法模式:有符号小数乘法
		STM      #y_out,AR4
		STM      #x_in,AR5
		STM      #x_new,AR2
		STM      #x_old+(size-1),AR3
		STM      #size,BK  ;循环缓冲区的长度=size
		STM      #-1,AR0   ;设置步进值
	;PORTR    PA1,@x_new;读取新的数据
	;使用分号屏蔽掉的代码是书中源程序之中所带的指令
FIR:    NOP
		NOP ;add a input toggle probe point here 在此处增加输入探针
		NOP
		STM      #x_in,AR5
		LD     *AR5,A
		LD     *AR5,A
		STL   A,*AR2
		LD    #0,A
	             ;x_new   ; x_old
		ADD      *AR2+0%,*AR3+0%,A ;AH = x(n) + x(N-7)
		RPTZ     B,#(size-1)       ;B = 0;下一条指令执行size次
		FIRS     *AR2+0%,*AR3+0%,COEF ;B=B+AH*h0
	                                  ;AH = x(n-1)+x(n-6)
		LD       #y,DP ;设置DP指针
		STH      B,@y         ;保存滤波器输出结果
		NOP ;add a output toggle probe point here 在此处增加输出探针
	    ;PORTW    @y,PA0       ;输出结果
		STH      B,*AR4+
		MAR       *AR2-%;
		MAR       *AR2-%
		NOP
		MAR       *AR3+%
		NOP
		MVDD     *AR2,*AR3
		;MAR      *-AR2(2)%    ;修正AR2指向新缓冲区最老的数据
		;MAR      *AR3+0%      ;修正AR3指向老缓冲区最老的数据
		MAR       *AR3-%   
		NOP
		;MVDD     *AR2,*AR3+0% ;新缓冲区向老缓冲区传送一个数
		B      FIR          ;延迟跳转
	;PORTR    PA1,*AR2     ;输入新数据到新缓冲区
		.end
****************************************************************
*  寻址方式说明:                                               *
*  MAR    *+ARx(1k) --> addr = circ(ARx+1k)                    *
*                            = circ(ARx+1k)                    *
*  指令说明:                                                   *
*  FIRS  Xmem,Ymem,pmad -->                                    *
*        pmad -> PAR                                           *
*        While(RC!=0)                                          *
*            (B)+(A(32~16))*(Pmem addressed by PAR) -->B       *
*             ((Xmem)+(Ymem))<<16 -->A                         *
*             (PAR)+1-->PAR                                    *
*             RC-1-->RC                                        *
****************************************************************
* (PAR) program address register                               *
****************************************************************
** --------------------------------------------------------------- **
** 缓冲区的存取说明:                                               **
** 循环缓冲区分为两段:较新缓冲区(0x80,0x81,0x82,0x83)              **
**                    较老缓冲区(0x88,0x89,0x8A,0x8B)              **
** 较新缓冲区中的数据总是从最新的数据开始计算, 计算顺序为:         **
** (每行的第1个数据是最新数据)                                     **
** 80  83  82  81<>80  83                                          **
**     81  80  83  82<>81  80                                      **
**         82  81  80  83<>82  81                                  **
**             82  82  81  80<>83  82                              **
**                 80  83  82  81<>80  83                          **
**                     ...   ...  循环                             **
** 较老缓冲区中的数据总是从最老的数据开始计算, 计算顺序为:         **
** (每行的第1个数据是最老数据,第4个数据在当前次计算完毕时更新)     **
** 8B  8A  89  88  8B<>8A                                          **
**     8A  89  88  8B  8A<>89                                      **
**         89  88  8B  8A  89<>88                                  **
**             88  8B  8A  89  88<>8B                              **
**                 8B  8A  89  88  8B<>8A                          **
**                     ...   ...  循环                             **
** --------------------------------------------------------------- **
**                                                  2009 04 17     **
** --------------------------------------------------------------- **

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -