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

📄 fir.s54

📁 c5x中关于FIR滤波器的实验
💻 S54
字号:
;******************************************************************************
;               		SJTU DSP Tech. Center
;        Copyright (c) 2001 SJTU DSP Tech. Center. All Rights Reserved.
;
;  Description:
;  		TMS320C54x Program for Students Experiment
;
;  History:
;		Date		Authors			Changes
;		2001/07/23	Zheng Yigang	Created.
;******************************************************************************

STACK_ADDR		.set		0x0500
SIZE	    	.set    	41
LENGTHOFINPUT	.set 		1000

    .bss    tapin1, 2*SIZE		;make sure data buffer match the alignment
    .bss    tapin2, 2*SIZE
    .bss    newbuffer, SIZE
    .bss    oldbuffer, SIZE
    .bss    output1, LENGTHOFINPUT
    .bss	output2, LENGTHOFINPUT
    .bss	output3, LENGTHOFINPUT
    .bss    input, LENGTHOFINPUT
	
	.mmregs
	.global	main

coef .usect "coef", SIZE		;make sure data buffer match the alignment

;=============================================================================
	.data
FIR_Coeff:
	.word	-22,24,45,10,-47		;in Q16 frame
	.word	-55,15,89,59,-68
	.word   -141,-32,161,186,-49
	.word   -286,-184,210,418,94
	.word	-448,-503,132,745,472
	.word	-526,-1041,-231,1110,1250
	.word	-331,-1895,-1230,1428,2966
	.word	709,-3745,-4869,1613,13592
	.word	23161
    
;==============================================================================
;==============================================================================
	.text
main:
	stm		#STACK_ADDR, SP
	stm		#0x00a8, PMST		;store IPTR
	stm		#0x0000, SWWSR

	ssbx	FRCT                ;set fraction mode
	rsbx	OVM                 ;no saturation
	ssbx	SXM					;sign extension
	
	;load coefficients to coef
	stm     #coef, AR1
	rpt     #SIZE-1
	mvpd    FIR_Coeff, *AR1+
	;copy last half of coefficients because of its symmetry
	stm		#coef, AR4
	stm		#coef+2*SIZE-1, AR2
	rpt		#SIZE-1
	mvdd	*AR4+, *AR2-

	;set probe point to get input data
	nop
			
	call   	fir1
	
	call 	fir2
	
	call 	fir3
		
dead_loop:
	nop
	nop
	nop
	nop
	b		dead_loop
	
;==========================================================================
;                fir1,use circular buffer
;==========================================================================			
fir1:
	;clear tapin buffer
	stm		#tapin1, AR2		;make sure tapin1 mathc the alignment
	rptz	A, #2*SIZE-1
	stl		A, *AR2+
	
	;point initialize
	stm     #tapin1, AR3
	stm		#coef+2*SIZE-1, AR4
	stm     #2*SIZE, BK
	stm     #-1, AR0
	stm     #input, AR2
	stm     #output1, AR5
	
	;filtering------------------------
	stm		#LENGTHOFINPUT-1, BRC
    rptb	next1-1
    mvdd    *AR2+, *AR3+0%
    rptz    A, #2*SIZE-1
	mac     *AR3+0%, *AR4+0%, A
	sth     A, *AR5+
next1:

	ret
    	
;============================================================================
;                       fir2,use single linear buffer
;============================================================================
fir2:
	;clear tapin buffer
	stm		#tapin2, AR2
	rptz	A, #2*SIZE-1
	stl		A, *AR2+
	
	stm		#input, AR2
	stm		#output2, AR0
	stm		#coef, AR4
	stm		#LENGTHOFINPUT-1, BRC
	rptbd	next2-1
	stm		#tapin2+2*SIZE-1, AR6

	;filtering------------------------
	mvmm	AR6, AR3
	mvdd	*AR2+, *AR3
	mvmm	AR4, AR5
	rptz	A, #2*SIZE-1
	mac 	*AR3-, *AR5+, A
	sth		A, *AR0+
	;update buffer
	mar 	*AR3+		;AR3==>tapin2
	mvmm	AR3, AR5
	mar		*AR5+		;AR5==>tapin2+1
	rpt		#2*SIZE-2
	mvdd	*AR5+, *AR3+
next2:

 	ret
    
;============================================================================
;                       fir2, use dual linear buffers
;============================================================================
fir3:
    ;clear tapin buffer
	stm		#newbuffer, AR2
	rptz	A, #SIZE-1
	stl		A, *AR2+
	
	stm		#oldbuffer, AR2
	rptz	A, #SIZE-1
	stl		A, *AR2+
	
	;filtering------------------------
	stm		#input, AR2
	stm		#output3, AR1
	stm		#newbuffer+SIZE-1, AR4
	stm		#oldbuffer, AR6
	stm 	#LENGTHOFINPUT-1, BRC
	rptbd	next3-1
	stm		#2, AR0
		
	mvmm	AR6, AR3
	mvdd	*AR2+, *AR4			;read input
	add		*AR3+, *AR4-, A
	rptz	B, #SIZE-1
	firs	*AR3+, *AR4-, FIR_Coeff
	sth		B, *AR1+			;store output
								;AR4==>newbuffer-2
								;AR3==>oldbuffer+SIZE+1
	;update oldbuffer
	mvmm	AR6, AR3			;AR4==>oldbuffer
	mvmm	AR3, AR5
	mar		*AR5+				;AR5==>oldbuffer+1
	rpt		#SIZE-2
	mvdd	*AR5+, *AR3+     	
	
	mar		*AR4+0				;AR4==>newbuffer
	mvdd  	*AR4, *AR3
	
	;update newbuffer
	mvmm	AR4, AR5
	mar		*AR5+				;AR5==>newbuffer+1
	rpt		#SIZE-2
	mvdd	*AR5+, *AR4+     	
								;AR4==>newbuffer+SIZE-1
next3:

	ret
	
	
;================================================================================
	.sect	"vectors"
int_RESET:
	b		main
	nop
	nop
	
	.space	124*16
;=================================================================================
;end of fir.s54		

⌨️ 快捷键说明

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