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

📄 decoder_amr.asm

📁 基于TMS320F2812的AMR+RS编解码+OFDM调制解调源程序。是stand alone运行版本
💻 ASM
字号:
*****************************************************************************
** Description:     Decoder_amr() in dec_amr.c				               **
**                                                                         **
** Inputs                                                                  **
**                                                                         **
**   Decoder_amrState *st            			                           **
**	 parm						                                           **
**   synth                                                                 **
**   A_t                                                                   **
**                                                                         **
** Outputs:                                                                **
**                                                                         **
**   Decoder_amrState *st                                                  **
**   synth                                                                 **
**   A_t                                                                   **
**                                                                         **
** Return value :       		                                           **
**                                                                         **
** Attribute    :       Cycles:           Pm:                              **
**                      Modified Registers:                                **
**                                                                         **
** Programmer   :       YANG zhiwei                                        **
*****************************************************************************
		.global		_Decoder_amr
		
		.ref		_copy
		.ref		_D_plsf_3
		.ref		_Int_lpc_1to3
		.ref		_dec_lag3
		.ref		_Pred_lt_3or6
		.ref		_decode_2i40_9bits
		.ref		_Dec_gain
		.ref		_Int_lsf
		.ref		_agc2
		.ref		_Syn_filt
		.ref		_ph_disp
		.ref		_lsp_avg
		.ref		_Cb_gain_average
		
		.ref		past_lsf_q
		.ref		prev_lsf
		.ref		parm
		.ref		lsp_new
		.ref		dec_lsp_old
		.ref		A_t
		.ref		old_T0
		.ref		dec_exc
		.ref		dec_sharp
		.ref		code
		.ref		excp
		.ref		ltpGainHistory
		.ref		lsf_i
		.ref		exc_enhanced
		.ref		dec_mem_syn
		.ref		_synth
		.ref		dec_old_exc
		.ref		lockFull
		.ref		gainMem
		.ref		lsp_meanSave
		
		.ref		M
		.ref		L_FRAME
		.ref		L_SUBFR
		.ref		PIT_MIN
		.ref		PIT_MAX
		.ref		SHARPMAX
		.ref		L_INTERPOL
		.ref		MP1
		
_Decoder_amr:
		addb	sp,#24	
			
		movl	xar2,#past_lsf_q		;xar2 point to st->lsfState->past_lsf_q
		movl	xar3,#prev_lsf	
		mov		ar1,#M
		lcr		_copy					;Copy (st->lsfState->past_lsf_q, prev_lsf, M)
		
		movl	xar2,#parm
		movl	xar3,#lsp_new	
		lcr		_D_plsf_3				;D_plsf_3(st->lsfState, parm, lsp_new)
		
		movl	xar2,#parm+3
		movl	*-sp[22],xar2	     	;parm += 3	
		
		movl	xar2,#A_t			;xar2 point to A_t
		movl	xar4,#dec_lsp_old		;xar4 point to st->lsp_old	
		movl	xar5,#lsp_new
		lcr		_Int_lpc_1to3				
		
		mov		ar0,#M - 1				;M loops
		movl	xar2,#dec_lsp_old		;xar2 point to st->lsp_old 
		movl	xar3,#lsp_new
_loop_315:
			mov		al,*xar3++
			mov		*xar2++,al				;st->lsp_old[i] = lsp_new[i]
			banz	_loop_315,ar0--
			
		movl	xar2,#A_t
		movl	*-sp[20],xar2			;Az = A_t
		
		mov		*-sp[18],#0				;evenSubfr = 0	
		mov		*-sp[17],#-1			;subfrNr = -1
		mov		*-sp[2],#0				;i_subfr = 0
_loop_338:
		add		*-sp[17],#1				;subfrNr = add(subfrNr, 1)
		
		mov		al,#1
		subr	*-sp[18],al				;evenSubfr = sub(1, evenSubfr)
		
		mov		al,*-sp[2]		
		mov		*-sp[11],al				;pit_flag = i_subfr		
			
		mov		*-sp[15],#5				;delta_frc_low = 5
		mov		*-sp[16],#9				;delta_frc_range = 9
		
		movl	xar2,#old_T0
		mov		al,*xar2				;al = st->old_T0
		sub		al,*-sp[15]
		mov		*-sp[13],al				;t0_min = sub(st->old_T0, delta_frc_low)
		
		cmp		*-sp[13],#PIT_MIN
		bf		_line_380,geq			;if ( t0_min >= PIT_MIN ) jump to _line_380
		mov		*-sp[13],#PIT_MIN	
_line_380:		
		mov		al,*-sp[13]				;al = t0_min
		add		al,*-sp[16]				;al = add(t0_min, delta_frc_range)
		mov		*-sp[14],al				;t0_max = add(t0_min, delta_frc_range)	
		
		cmp		*-sp[14],#PIT_MAX
		bf		_line_388,leq			;if ( t0_max <= PIT_MAX ) jump to _line_388
		mov		*-sp[14],#PIT_MAX		;t0_max = PIT_MAX
		mov		al,*-sp[14]				;al = t0_max
		sub		al,*-sp[16]				;al = sub(t0_max, delta_frc_range)
		mov		*-sp[13],al				;t0_min = sub(t0_max, delta_frc_range)
_line_388:	
		movl	xar3,*-sp[22]
		movz	ar2,*xar3
		add		*-sp[22],#1				;ar2 = index= *parm++
			
		movz	ar3,*-sp[13]			;ar3 = t0_min 
		movz	ar4,*-sp[14]			;ar4 = t0_max
		movz	ar5,*-sp[11]			;ar5 = pit_flag
		movl	xar7,#old_T0
		mov		ar6,*xar7				;ar6 = st->old_T0
		lcr		_dec_lag3
		mov		*-sp[3],ar0				;T0
		mov		*-sp[4],ar1				;T0_frac
			
		mov		ar7,ar0					;ar7 = T0
		mov		ar6,ar1					;ar6 = frac
		movl	xar4,#dec_exc+1
		movl	xar0,*xar4				;xar0 point to st->exc
		lcr		_Pred_lt_3or6
		
		movl	xar2,*-sp[22]
		movz	ar3,*xar2
		add		*-sp[22],#1				;ar3 = index= *parm++
		    		
		movl	xar4,*-sp[22]
		movz	ar2,*xar4
		add		*-sp[22],#1				;ar2 = i = parm++
				
		movz	ar1,*-sp[17]			;ar1 = subfrNr
		movl	xar4,#code				;xar4 point to code[]
		lcr		_decode_2i40_9bits
		
		movl	xar2,#dec_sharp
		mov		al,*xar2				;al = st->sharp
		lsl		al,1
		mov		*-sp[10],al				;pit_sharp = shl (st->sharp, 1)
		
		movz	ar0,*-sp[3]				;i = T0
		movl	xar2,#code				;xar2 point to code[]
_loop_424:
			cmp		ar0,#L_SUBFR
			bf		line_439,geq			;if ( i >= L_SUBFR ) jump to _line_439			
			mov		al,*-sp[3]				;al = T0
			mov		ar1,ar0					;ar1 = i
			sub		ar1,al					;ar1 = i - T0
		
			mov		t,*+xar2[ar1]			;t = code[i - T0]
			mpy		acc,t,*-sp[10]
			lsl		acc,1					;ah = temp = mult (code[i - T0], pit_sharp)
		
			add		*+xar2[ar0],ah			;code[i] = add (code[i], temp)
		
			inc		ar0						;i++
			bf		_loop_424,unc		
line_439:			
		movl	xar2,*-sp[22]
		mov		al,*xar2				
		add		*-sp[22],#1				;al = index = *parm++
		
		movl	xar7,#code				;xar7 point to code[]
		lcr		_Dec_gain
		mov		*-sp[7],ar5				;gain_pit
		mov		*-sp[8],ar6				;gain_code

		movl	xar2,#dec_sharp			;xar2 point to st->sharp
		cmp		ar5,#SHARPMAX
		bf		_line_475,leq			;if (pit_sharp <= SHARPMAX) jump to _line_475		
		mov		*-sp[10],#SHARPMAX		;pit_sharp = #SHARPMAX
		mov		*xar2,#SHARPMAX			;st->sharp = #SHARPMAX
		bf		_line_483,unc
_line_475:
		mov		*-sp[10],ar5			;pit_sharp = gain_pit
		mov		*xar2,ar5				;st->sharp = #SHARPMAX
_line_483:		
		mov		al,*-sp[10]
		lsl		al,1
		mov		*-sp[10],al				;pit_sharp = shl (pit_sharp, 1)
		cmp		al,#16384
		bf		_line_501,leq			;if(pit_sharp <= 16384) jump to _line_501
		mov		ar0,#L_SUBFR - 1		;L_SUBFR loops
		movl	xar3,#dec_exc+1
		movl	xar2,*xar3				;xar2 point to st->exc[]
		movl	xar3,#excp				;xar3 point to excp[]
_loop_487:
			mov		t,*-sp[10]				;t = pit_sharp
			mpy		acc,t,*xar2++
			lsl		acc,1					;ah = temp = mult (st->exc[i], pit_sharp)
		
			mov		t,*-sp[7]				;t = gain_pit 
			mpy		acc,t,ah
			lsl 	acc,1					;accL_temp = L_mult (temp, gain_pit)

			add		acc,#0x0800<<4			;acc = round (L_temp)
			mov		*xar3++,ah				;excp[i] = round (L_temp)
			banz	_loop_487,ar0--
	
_line_501:
		mov		ar0,#8 - 1				;8 loops
		movl	xar2,#ltpGainHistory	;xar2 point to ltpGainHistory[0]
		movl	xar3,#ltpGainHistory + 1	;xar3 point to ltpGainHistory[1]
_loop_502:
			mov		al,*xar3++				;al = st->ltpGainHistory[i+1]
			mov		*xar2++,al				;st->ltpGainHistory[i] = al 
			banz    _loop_502,ar0--
		
		mov		al,*-sp[7]
		mov		*xar2,al				;st->ltpGainHistory[8] = gain_pit

		movl	xar2,#prev_lsf			
		movl	xar3,#past_lsf_q
		movz	ar5,*-sp[2]				;ar5 = i_subfr
		movl	xar4,#lsf_i
		lcr		_Int_lsf
		
		
        movz	ar2,*-sp[8]				;ar2 = gain_code
        movl	xar3,#lsf_i
        movl	xar4,#lsp_meanSave
        lcr		_Cb_gain_average
        mov		*-sp[9],ar2				;gain_code_mix = Cb_gain_average()        

		mov		al,*-sp[7]
		mov		*-sp[12],al				;pitch_fac = gain_pit
		
		mov		ar0,#L_SUBFR - 1		;L_SUBFR loops
		movl	xar2,#exc_enhanced
		movl	xar4,#dec_exc + 1
		movl	xar3,*xar4				;xar3 point to st->exc[] 
		movl	xar4,#code
_loop_535:
			mov		al,*xar3				;al = st->exc[i]
			mov		*xar2++,al				;exc_enhanced[i] = al
		
			zapa
			mov		t,*-sp[12]				;t = pitch_fac
			mpy		p,t,*xar3
			mov		t,*-sp[8]				;t = gain_code
			mpya	p,t,*xar4++				;acc = p<<pm,p = code[i] * gain_code
			addl	acc,p<<pm               ;acc = L_mult (st->exc[i], pitch_fac) + L_mult (code[i], gain_code)
		
			lsl		acc,1					;L_temp = L_shl (L_temp, tmp_shift)
		
			add		acc,#0x0800<<4			;round (L_temp)
			mov		*xar3++,ah				;st->exc[i]= round (L_temp)
		
			banz    _loop_535,ar0--
		
		movl	xar2,#lockFull
		mov		*xar2,#0
																																																																																																																																																																																																																																																																																																																																																																																	movl	xar2,#gainMem
		movl	xar3,#exc_enhanced
		movz	ar5,*-sp[9]				;ar5 = gain_code_mix
		mov		al,*-sp[7]				;al = gain_pit
		movl	xar4,#code
		movz	ar0,*-sp[12]			;ar0 = pitch_fac
		lcr		_ph_disp
		
		cmp		*-sp[10],#16384
		bf		_line_609,leq			;if ( pit_sharp <= 16384 )jump to _line_609
		mov		ar0,#L_SUBFR - 1		;L_SUBFR loop
		movl	xar2,#exc_enhanced
		movl	xar3,#excp
_loop_598:
			mov		al,*xar2++
			add		*xar3++,al				;excp[i] = add (excp[i], exc_enhanced[i])
			banz	_loop_598,ar0--
		
		movl	xar4,#exc_enhanced
		movl	xar6,#excp
		lcr		_agc2
		
		movl	xar7,*-sp[20]			;xar7 ponit to Az
		movl	xar1,#excp
		movl	xar2,#_synth
		mov		acc,*-sp[2]
		addl	xar2,acc				;xar2 point to synth[i_subfr]
		mov		ar0,#L_SUBFR
		movl	xar3,#dec_mem_syn		;xar3 point to st->mem_syn
		mov		ar4,#0
		lcr		_Syn_filt
		
		bf		_line_630,unc
		
_line_609:
		movl	xar7,*-sp[20]			;xar7 ponit to Az
		movl	xar1,#exc_enhanced
		movl	xar2,#_synth
		mov		acc,*-sp[2]
		addl	xar2,acc				;xar2 point to synth[i_subfr]
		mov		ar0,#L_SUBFR
		movl	xar3,#dec_mem_syn		;xar3 point to st->mem_syn
		mov		ar4,#0
		lcr		_Syn_filt		
		
_line_630:		
		movl	xar2,#_synth + L_SUBFR - M
		mov		acc,*-sp[2]
		addl	xar2,acc				;xar2 point to synth[i_subfr+L_SUBFR-M]
		movl	xar3,#dec_mem_syn		;xar3 point to st->mem_syn
		mov		ar1,#M
		lcr		_copy
		
		movl	xar2,#dec_old_exc
		mov		acc,#L_SUBFR
		addl	xar2,acc				;xar2 point to st->old_exc[L_SUBFR]
		movl	xar3,#dec_old_exc
		mov		ar1,#PIT_MAX + L_INTERPOL
		lcr		_copy
		
		mov		acc,#MP1
		addl	*-sp[20],acc			;Az += MP1
		
		mov		al,*-sp[3]
		movl	xar2,#old_T0
		mov		*xar2,al				;st->old_T0 = T0
		
		add		*-sp[2],#L_SUBFR		;i_subfr += L_SUBFR
		cmp		*-sp[2],#L_FRAME
		bf		_loop_338,lt			;if ( i_subfr <  L_FRAME ) jump to _loop_338
		
		movl	xar1,#past_lsf_q
		lcr		_lsp_avg
		
 		subb	sp,#24
		lretr

⌨️ 快捷键说明

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