www.pudn.com > g729Decoder.rar > ACELP_CA.asm


;================================================================ 
;  File Name 
;  ---------- 
;  ACELP_CO.ASM 
; 
;  Brief Description of the Code: 
;  ------------------------------ 
;  Find Algebraic codebook. 
; 
;  Ref 
;  ------ 
;  ACELP_CO.C (ACELP_Codebook) 
;============================================================== 
 
 
        .mmregs 
 
        .include  ..\include\const.h 
        .include  ..\include\tab_ld8a.h 
        .include  ..\include\ld8amem.h 
 
        .def      ACELP_Codebook 
 
        .ref      Cor_h 
        .ref      Corr_h_x 
        .ref      D4i40_17_fast 
 
 
;----------------------------------------------------------------- 
;  ACELP_Codebook 
;----------------------------------------------------------------- 
;  Word16  ACELP_Codebook( /* (o)   :index of pulses positions   */ 
;    Word16 x[],           /* (i)   :Target vector               */ 
;    Word16 h[],           /* (i)Q12:Impulse response of filters */ 
;    Word16 T0,            /* (i)   :Pitch lag                   */ 
;    Word16 pitch_sharp,   /* (i)Q14:Last quantized pitch gain   */ 
;    Word16 code[],        /* (o)Q13:Innovative codebook         */ 
;    Word16 y[],           /* (o)Q12:Filtered innovative codebook*/ 
;    Word16 *sign          /* (o)   :Signs of 4 pulses           */ 
;  ) 
;------------------------------------------------------------------ 
;------------------------------------------------------------------ 
;  Constants : Addr_Dn -> Dn 
;              Addr_rr -> rr 
;              Addr_DnSign -> DnSign 
; 
;              Addr_xn2 -> x 
;              Addr_h1 -> h 
;              Addr_T0 -> T0 
;              Addr_cn -> code 
;              Addr_yn2 -> y 
; 
;  Pointers  : ptr_sharp -> pitch_sharp 
; 
;  Variables : PulseIndex = D4i40_17(xxxxx) = ACELP_Codebook(xxxxx) 
;              PulseSign  = sign 
;------------------------------------------------------------------ 
;  Memmory map requirement : 
;                            PulseIndex .set  PulseSign + 1 
;------------------------------------------------------------------- 
 
        .asg    "AR2", pHn1 
        .asg    "AR3", pHn2 
        .asg    "AR4", pHn_i_T0 
 
        .asg    "AR2", pSharp 
 
ACELP_Codebook: 
 
; Include fixed-gain pitch contribution into impulse resp. h[] 
; Find correlations of h[] needed for the codebook search. 
 
     ; sharp = shl(pitch_sharp, 1); /* From Q14 to Q15 */ 
     ; if (sub(T0, L_SUBFR)<0) 
 
     ;   /* h[i] += pitch_sharp*h[i-T0] */ 
     ;   for (i = T0; i < L_SUBFR; i++) 
     ;     h[i] = add(h[i], mult(h[i-T0], sharp)); 
 
        LD      #Addr_T0, DP 
        LD      #L_SUBFR - 1, A 
        SUB     Addr_T0, A 
        LD      Addr_T0, B 
        BCD     EndFindHn, ALT			;if T0>L_SUBFR do nothing. 
        ADD     #Addr_h1, B				;B save the address of h1[T0] 
 
                MVDM    ptr_sharp, pSharp 
                STLM    A, BRC 
                LD      *pSharp, 1, A 
                STLM    B, pHn1 
                STLM    B, pHn2 
                STLM    A, T 
                STM     #Addr_h1, pHn_i_T0 
                LD      #0, ASM 
                LD      *pHn1+,16,  A     
                MPY    *pHn_i_T0+, B     
                ADD     B,A 
                 
                RPTB   EndFindHn - 1 
 
                        STL		A,-16, *pHn2+  
                        LD    	*pHn1+,16, A 
                        MPY    	*pHn_i_T0+, B  
                        ADD     B,A 
 
EndFindHn:               
 
 
        CALL    Cor_h 
         
        CALLD    Corr_h_x 
		STM #Addr_xn2,AR5 
        	 
        CALL    D4i40_17_fast 
 
   ;  Compute innovation vector gain. 
   ;  Include fixed-gain pitch contribution into code[]. 
 
     ; if(sub(T0 ,L_SUBFR) <0) 
 
     ;   for (i = T0; i < L_SUBFR; i++) 
     ;   { 
     ;     code[i] = add(code[i], mult(code[i-T0], sharp)); 
     ;   } 
 
        LD      #Addr_cn, A 
        CALL    AddFixedGain 
 
        RET 
 
 
;------------------------------------------------------------------ 
;  AddFixedGain 
;------------------------------------------------------------------ 
;  void  AddFixedGain( 
;    Word16 S[],        /* (i/o)   : Source/Target vector        */ 
;    Word16 T0,         /* (i)     :Pitch lag                    */ 
;    Word16 pitch_sharp,/* (i) Q14 :Last quantized pitch gain    */ 
;  ) 
;------------------------------------------------------------------ 
; sharp = shl(pitch_sharp, 1);          /* From Q14 to Q15 */ 
; if (sub(T0, L_SUBFR)<0) 
;   for (i = T0; i < L_SUBFR; i++) /* h[i] += pitch_sharp*h[i-T0] */ 
;     S[i] = add(S[i], mult(S[i-T0], sharp)); 
;------------------------------------------------------------------ 
;  Constants : Addr_T0 -> T0 
; 
;  Pointers  : ptr_sharp -> pitch_sharp 
; 
;  Input Register : AL = &S 
;------------------------------------------------------------------ 
 
        .asg    "AR2", pSn1 
        .asg    "AR3", pSn2 
        .asg    "AR4", pSn_i_T0 
 
AddFixedGain: 
        LD      #Addr_T0, DP 
        LD      #L_SUBFR - 1, B 
        SUB     Addr_T0, B 
        BCD     EndFindSn, BLT 
        STLM    A, pSn_i_T0 
        ADD     Addr_T0, A 
 
                MVDM    ptr_sharp, pSharp 
                STLM    B, BRC 
                LD      *pSharp, 1, B 
                STLM    A, pSn1 
                STLM    A, pSn2 
                STLM    B, T 
                LD      #0, ASM 
                LD      *pSn1+, 16, A  
                MPY    *pSn_i_T0+, B  
                ADD     B,A 
 
                RPTB   EndFindSn - 1 
 
                        STL      A,-16, *pSn2+     
                        LD    *pSn1+,16, A 
                        MPY    *pSn_i_T0+, B  
                        ADD     B,A 
 
EndFindSn: 
 
        RET