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

📄 example 4-8.asm

📁 《基于TI DSP的通用算法实现》程序代码
💻 ASM
字号:

; Example 4 - 8. Implementation of an IIR 32×16-bit Canonical Direct Form I for the TMS320C54x DSP

; TEXAS INSTRUMENTS FRANCE
; Audio DSP Development
; ASM Code Module of the eqz32x16.asm
; AUTHOR CAVALIER Philippe
; MESSINA Nathalie
;
; (C) Copyright 1997. Texas Instruments France. All rights reserved
;
**********************************************************
* macro definitions *
**********************************************************
.mmregs
.include "init54x.inc"
**********************************************************
* reset/interrupt/trap vectors *
**********************************************************
*
* Always start from Reset.
*
	.global Start
	.sect "vecs"
Start
	BD Init 		; Branch to MainLine.
	NOP
	NOP
	
	
	
**********************************************************
* Set up constant and filter coeff *
**********************************************************
K_FRAME_SIZE 	.set 128 ; Number of samples
K_NB_FILTER 	.set 5 ; Number of 2nd-order IIR filter
K_BUFFER_INDEX 	.set 2 ; Circ buff index
K_BUFFER_SIZE 	.set 2*3*(K_NB_FILTER+1)-2 ; Circ buff size
EqzCoffTable 	.sect "eqz_coff"
		.word 03fd4h ; A2/2 first IIR filter
		.word 0802dh ; A1/2
		.word 03fffh ; A0/2 (0dB/100hz)
		.word 0c02ah ; -B2/2
		.word 07fd2h ; -B1/2
		.word 03ef4h ; A2/2
		.word 081a8h ; A1/2
		.word 03f80h ; A0/2 (-9dB/330hz)
		.word 0c189h ; -B2/2
		.word 07e57h ; -B1/2
		.word 03d54h ; A2/2
		.word 082b9h ; A1/2
		.word 04105h ; A0/2 (7dB/1khz)
		.word 0c1a5h ; -B2/2
		.word 07d46h ; -B1/2		
		.word 039f9h ; A2/2
		.word 091d5h ; A1/2
		.word 03ef8h ; A0/2 (-3dB/3k3hz)
		.word 0c70dh ; -B2/2
		.word 06e2ah ; -B1/2
		.word 032c2h ; A2/2 Last IIR filter
		.word 0d345h ; A1/2
		.word 03d01h ; A0/2 (-4dB/10khz)
		.word 0d03bh ; -B2/2
		.word 02cbah ; -B1/2
**********************************************************
* Set up in/out buffer *
**********************************************************


DataFilin 	.usect "eqz_vars",256 			; for 32 samples
DataFilout 	.usect "eqz_vars",256 			; for 32 samples
DataInternal 	.usect "eqz_bfr",K_BUFFER_SIZE		; to store d(n),d(n-1),d(n-2)
DataTempBuff 	.usect "eqz_bfr",1


**********************************************************
* Init section *
**********************************************************
.text
Init
	LD #0,A 	; acc = >00000000.
	STLM A,SWWSR 	; 0 Wait States.
	STLM A,BSCR 	; Bank shift.
	STM #K_ST0,ST0
	STM #K_ST1,ST1
	STM #K_PMST,PMST
	
	
****************************************************************
* *
* Main program *
* *
****************************************************************
Main
	CALL EqzInit
Continue
	NOP
	NOP
	CALL EqzTask
	NOP
	NOP
	B Continue
	
	
****************************************************************
* *
* Sub routines *
* *
****************************************************************
	.asg AR0,EQZ_INDEX 	; Circ buff index
	.asg AR1,EQZ_NB 	; Number of filters
	.asg AR2,pEQZ_DATA_L 	; Low word of data buffer
	.asg AR3,pEQZ_DATA_H 	; High word of data buffer 
	.asg AR4,pEQZ_COFF_1 	; Coefficient pointer 1
	.asg AR5,pEQZ_COFF_2 	; Coefficient pointer 2
	.asg AR6,pINBUF 	; Input data
	.asg AR7,pOUTBUF 	; Output data

	.sect "eqz_prog"

EqzInit
	STM #DataInternal,pEQZ_DATA_L
	RPTZ A,#(K_BUFFER_SIZE-1) 	; Clear the data
	STL A,*pEQZ_DATA_L+ 		; buffer
	STM #DataInternal+1,pEQZ_DATA_L
					; pEQZ_DATA_L points on the
					; first low word of the data buffer
	STM #DataInternal,pEQZ_DATA_H
					; pEQZ_DATA_H points on the
					; first high word of the data buffer
	STM #K_BUFFER_SIZE,BK 		; Load circ buff size
	STM #K_BUFFER_INDEX,EQZ_INDEX 	; Load circ buff index
	STM #EqzCoffTable,pEQZ_COFF_1 	; pEQZ_COFF_1 points on the
					; first coefficient
	RETD
	STM #EqzCoffTable,pEQZ_COFF_2
					; pEQZ_COFF_2 points also on


; the first coefficient
;--------------------------------------------------------------

EqzTask
	STM #(DataFilin),pINBUF 	; Load input add mem
	STM #(K_FRAME_SIZE-1),BRC 	; Load loop counter
EqzFilterBegin
	RPTBD EqzFilterEnd-1
	STM #(DataFilout),pOUTBUF 	; Load output add mem
	STM #(K_NB_FILTER-2),EQZ_NB
	DLD *pINBUF+,B
	LD B,-2,B
	LD #0,A
	MACSU *pEQZ_DATA_L+0%,*pEQZ_COFF_1+,A 		;a2/2*x0low(n-2)
	MACSU *pEQZ_DATA_L+0%,*pEQZ_COFF_1+,A 		;a1/2*x0low(n-1)
	STL B,*pEQZ_DATA_L-% 				;storage x0high(n)
	STH B,*pEQZ_DATA_L+% 				;storage x0low(n)
	MACSU *pEQZ_DATA_L+0%,*pEQZ_COFF_1+,A 		;a0/2*x0low(n)
	MPY *pEQZ_DATA_H+0%,*pEQZ_COFF_2+,B 		;a2/2*x0high(n-2)
	MAC *pEQZ_DATA_H+0%,*pEQZ_COFF_2+,B 		;a1/2*x0high(n-1)
	MAC *pEQZ_DATA_H+0%,*pEQZ_COFF_2+,B 		;a0/2*x0high(n)
Loop:
	MACSU *pEQZ_DATA_L+0%,*pEQZ_COFF_1+,A 		;-b2/2*ylow(n-2)
	MACSU *pEQZ_DATA_L,*pEQZ_COFF_1+,A 		;-b1/2*ylow(n-1)
	ADD A,-16,B
	MAC *pEQZ_DATA_H+0%,*pEQZ_COFF_2+,B 		;-b2/2*yhigh(n-2)
	MAC *pEQZ_DATA_H,*pEQZ_COFF_2+,B 		;-b1/2*yhigh(n-1)
	MAR *pEQZ_DATA_L-0%
	MAR *pEQZ_DATA_H-0%
	MPY *pEQZ_DATA_H+0%,*pEQZ_COFF_2+,A 		;a2/2*xhigh(n-2)next
	MAC *pEQZ_DATA_H+0%,*pEQZ_COFF_2+,A 		;a1/2*xhigh(n-1)next
	LD B,1,B
	DST B,*pEQZ_DATA_H
	MAC *pEQZ_DATA_H+0%,*pEQZ_COFF_2+,A 		;a0/2*xhigh(n)next
	LD A,B
	LD #0,A
	MACSU *pEQZ_DATA_L+0%,*pEQZ_COFF_1+,A 		;a2/2*xlow(n-2)next
	BANZD Loop,*EQZ_NBMACSU
	*pEQZ_DATA_L+0%,*pEQZ_COFF_1+,A 		;a1/2*xlow(n-1)next
	MACSU *pEQZ_DATA_L+0%,*pEQZ_COFF_1+,A 		;a0/2*xlow(n)next
EndLoop
	MACSU *pEQZ_DATA_L+0%,*pEQZ_COFF_1+,A 		;-b2/2*ylow(n-2)
	MACSU *pEQZ_DATA_L+0%,*pEQZ_COFF_1,A 		;-b1/2*ylow(n-2)
	ADD A,-16,B
	MAC *pEQZ_DATA_H+0%,*pEQZ_COFF_2+,B 		;-b2/2*yhigh(n-2)
	MAC *pEQZ_DATA_H+0%,*pEQZ_COFF_2,B 		;-b1/2*yhigh(n-1)
	LD B,1,B
	STH B,*pEQZ_DATA_H+0%
	STL B,*pEQZ_DATA_L+0%
	MAR *+pEQZ_COFF_1(-24)
	MAR *+pEQZ_COFF_2(-24)
	DST B,*pOUTBUF+
EqzFilterEnd

	RET
	.end
	
	
	
	





























⌨️ 快捷键说明

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