虫虫首页|资源下载|资源专辑|精品软件|心愿单
m 登录|注册

《基于TI DSP的通用算法实现》程序代码

源代码在线查看: example 3-17.asm

软件大小: 223.37K 下载次数: 2
上传用户: yueyan51
关键词: DSP 算法 程序 代码
下载地址: 电信下载 网通下载 移动下载 联通下载 VIP VIP

相关代码

					
					;Example 3 - 17. Scaling for BFP Based FFT Implementation ASM Listing for TMS320C55x
					
					;****************************************************************
					; scale_exp:   Find maximum absolute value in array specified by 
					; 		   	   address AR3 and length T0. Pre-scale the input to next
					;			   radix-2 stage by 2^(exponent of the maximum absolute 
					;			   value - 1) for first two stages and by 2^(exponent of 
					;			   the maximum absolute value - 2) for all following stages
					;****************************************************************
					scale_exp:
						PSH dbl(AC0)		; save registers to be modified(stack size += 12)
						PSH dbl(AC1)
						PSH dbl(AC2)
						PSH dbl(AC3)
						PSH AR3
						PSH T0
						PSH T1
					
					; --------find maximum absolute value (real and imaginary)-------
						MOV *sp(data_ptr + 12), AR3	; load array size into AR3 (sp 
										; offset computed from 
						MOV *sp(data_sz + 12), T0	; above pushed registers and the 
										; return address
						SUB #2, T0
					|| 	MOV dbl(*AR3+), AC0				; AC0_H = x_Re[0],  AC0_L = x_Im[1]
					
						MOV T0, BRC0					; BRC0 = NX - 2
					|| 	MOV dbl(*AR3), AC1 				; AC1_H = x_Re[2],  AC1_L = x_Im[3]
					
						MOV dbl(*AR3+), AC2				; AC2_H = x_Re[2],  AC1_L = x_Im[3]
					|| 	RPTBLOCAL find_max  
						
						MAXDIFF AC0, AC1, AC1, AC3			; AC1_H/L contain max's
					
					find_max: 
						MOV dbl(*AR3+), AC0				; AC0_H = x_Re[n], AC0_L = x_Imn+1]
					|| 	MINDIFF AC0, AC2, AC2, AC3			; AC2_H/L contain min's
						
						MOV HI(AC1), AR3					; AR3 = even max value
						MOV AC1, T0						; T0  = odd  max value	   		
						MAX AR3, T0					
						MOV HI(AC2), T1						; T1  = odd  min value
						MOV AC2, AR3						; AR3 = even min value
						MIN AR3, T1
						ABS T1
						MAX T0, T1
						MOV T1, HI(AC0)					; put maximum absolute value in high part of AC0
						
					
					; -------scale array according to maximum asbolute value---------
						EXP AC0, T1					; determine exponent from maximum absolute value
						MOV *sp(bit_buf + 12), AR3			; AR3 contains expected bit growth
						SUB AR3, T1					; subtract 1 or 2 from the exponent to compensate 
												; for the maximum possible bit growth (factor of 
												; 2 or 4) in the next radix-2 stage	
						BCC no_scale, T1 == #0				; branch if no scaling needed
						ADD *sp(ret_exp + 12), T1, AC0	;		 sum current with previous exp.
						MOV *sp(data_sz + 12), T0   			; put nx in T0 for next loop
						MOV AC0, *sp(ret_exp + 12)			; put exponent back on stack
					|| 	SUB #1, T0		
					
						MOV *sp(data_ptr + 12), AR3
					|| 	MOV T0, BRC0					; initialize loop counter (BRC0 = nx - 1)
											
						RPTBLOCAL scale	 
						MOV dbl(*AR3), pair(LO(AC0))			
						MOV AC0					
					scale: 
						MOV AC1					no_scale:	
						POP T1				; restore registers
						POP T0
						POP AR3
						POP dbl(AC3)
						POP dbl(AC2)
						POP dbl(AC1)
						POP dbl(AC0)
					
						RET	
									

相关资源