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

📄 pit_fr3.asm

📁 TI C54写的G729代码,视线8kbps高质量语音解码,汇编优化
💻 ASM
字号:
;=====================================================
;  File Name
;  ----------
;  PIT_FR3.ASM
;
;  Brief Description of the Code:
;  ------------------------------
;  Find the pitch period with 1/3 subsample resolution.
;
;  Ref
;  ------
;  PITCH_A.C
;======================================================
; Word16 Pitch_fr3_fast(  /* (o) : pitch period.             */
;   Word16 exc[],    /* (i) : excitation buffer         */
;   Word16 xn[],     /* (i) : target vector             */
;   Word16 h[],      /* (i)Q12 : impulse response of filters.*/
;   Word16 L_subfr,  /* (i) : Length of subframe         */
;   Word16 t0_min,   /* (i) : minimum value in the searched range.*/
;   Word16 t0_max,   /* (i) : maximum value in the searched range.*/
;   Word16 i_subfr,  /* (i) : indicator for first subframe.*/
;   Word16 *pit_frac /* (o) : chosen fraction.             */
; )
;-------------------------------------------------------
;  Constants :  Addr_T0 -> T0 = output of Pitch_fr3
;               Addr_T0_frac -> pit_frac
;               Addr_T0_min  -> t0_min
;               Addr_T0_max  -> t0_max
;               Addr_i_subfr -> i_subfr
;
;               Addr_xn1 -> xn
;               Addr_h1  -> h1
;
;               L_SUBFR = L_subfr
;
;  Pointers  :  ptr_exc_subfrm -> exc
;----------------------------------------------------
;  Local memory : Addr_pitch_fr3_buf
;----------------------------------------------------
;  The following variables must be in same data page :
;               Addr_T0 -> T0
;               Addr_T0_frac -> pit_frac
;               Addr_T0_min  -> t0_min
;               Addr_T0_max  -> t0_max
;               Addr_i_subfr -> i_subfr
;------------------------------------------------------
;  T0=Pitch_fr3(&exc[i_subfr],xn,h1,L_SUBFR,T0_min,
;                           T0_max,i_subfr,&T0_frac);
;------------------------------------------------------
;  Modified Registers : AR0, AR1, AR2, AR3, BRC
;------------------------------------------------------
		.mmregs
        .include ..\include\const.h
        .include ..\include\struct.h
        .include ..\include\ld8amem.h

        .text
        .def     Pitch_fr3_fast

        .ref     Norm_Corr
        .ref     Corr_h_x
        .ref     Interpol_3
        .ref     Dot_product
        .ref     Pred_lt_3

param_norm_corr .tag     Str_Norm_Corr

        .asg     "AR1", pCorr_norm

        .asg     "Addr_pitch_fr3_buf", corr_v
        .asg     "Addr_pitch_fr3_buf+40", max		;32bit
        .asg     "Addr_pitch_fr3_buf+42", lag
        .asg     "Addr_pitch_fr3_buf+43", corr
        .asg     "Addr_pitch_fr3_buf+44", frac
        .asg     "Addr_pitch_fr3_buf+45", index
        .asg     "Addr_pitch_fr3_buf+46", exc_tmp

Pitch_fr3_fast:

        LD      #param_norm_corr, DP
        MVKD    #ptr_exc, param_norm_corr.ptr_exc
        ST      #Addr_xn1, param_norm_corr.ptr_xn
        ST      #Addr_h1, param_norm_corr.ptr_h
        MVKD    #Addr_T0_min, param_norm_corr.t_min
        MVKD    #Addr_T0_max, param_norm_corr.t_max

;------------------------------------------------------------
; Compute correlation of target vector with impulse response
;------------------------------------------------------------
        CALLD    Corr_h_x
		STM #Addr_xn1,AR5        

;-----------------------------
; Find maximum integer delay.
;-----------------------------
        LD      #param_norm_corr, DP
        LD      param_norm_corr.t_max, B
        SUB     param_norm_corr.t_min, B
        MVDM    param_norm_corr.t_min, AR0 ; t = T0_min
        STLM    B, BRC
        MVMM    AR0,AR1            ; to = T0_min

        RPTBD   EndFindMax - 1
        LD      #0x8000, 16, B            ; max = MIN_32

                MVDM    param_norm_corr.ptr_exc, AR4   ; AR4 -> exc[0]
                STM     #Addr_Dn, AR3
                MAR     *AR4-0          ; AR4 -> exc[-t]
                CALLD   Dot_product    ; corr = Dot_Product()      
				STM	#L_SUBFR-1,AR6

                MAX     B               ; max(corr,max)
                NOP
                NOP
                XC      1, NC
                        MVMM    AR0, AR1        ; t -> t0
                MAR     *AR0+                   ; t++
EndFindMax:

        DST     B, *(max)
        LD      #Addr_T0, DP
        MVMD    AR1, Addr_T0


;-----------------------
; Test fractions.
;-----------------------
        LD      #Addr_T0_frac, DP
        ST      #0, Addr_T0_frac     ;frac = 0
        LD      #param_norm_corr, DP
        LD      param_norm_corr.ptr_exc, A
        LD      #ptr_exc_subfrm, DP
        STL	A, ptr_exc_subfrm
        CALL    Pred_lt_3

        LD      #param_norm_corr, DP
        MVDM    param_norm_corr.ptr_exc, AR4   ;AR4 -> exc[0]
        STM     #Addr_Dn, AR3                  ;AR3 -> Dn
        CALLD   Dot_product          ;corr = Dot_Product()
		STM	#L_SUBFR-1,AR6

		DST	A,*(max)	
        LD      #Addr_pit_frac, DP
        ST      #0, Addr_pit_frac    ; *pit_frac=0   *pit_frac = T0_frac

;-----------------------------------------------------------------
; If first subframe and lag>84 do not serch fractional pitch
;-----------------------------------------------------------------

        LD      #Addr_i_subfr, DP
        LD      Addr_i_subfr, A
        BC      NotFirstSubfrlag, ANEQ
                
        LD      #Addr_T0, DP
        LD      Addr_T0, A
        SUB     #84, A
		BC	NotFirstSubfrlag,ALEQ
                RET                  ;return t0

NotFirstSubfrlag:

;-------------------------------------
; copy(exc, exc_tmp, L_subfr)
;-------------------------------------
        LD      #param_norm_corr, DP
        MVDM    param_norm_corr.ptr_exc, AR4   ;AR4 -> exc[0]
        STM     #exc_tmp, AR5
        RPT     #L_SUBFR - 1
                MVDD    *AR4+, *AR5+

;-------------------------------------
; Fraction -1/3
;-------------------------------------
        LD      #Addr_T0_frac, DP
        ST      #-1, Addr_T0_frac     ;frac = -1
        CALL    Pred_lt_3

        LD      #param_norm_corr, DP
        MVDM    param_norm_corr.ptr_exc, AR4   ;AR4 -> exc[0]
        STM     #Addr_Dn, AR3                  ;AR3 -> Dn
        CALLD   Dot_product                    ;corr = Dot_Product()
		STM	#L_SUBFR-1,AR6

        DLD      *(max), B
        LD      #Addr_pit_frac, DP
        MAX     B
        NOP
        NOP
        BC      EndFraction1, C
                ST      #-1, Addr_pit_frac      ;*pit_frac=-1
                DST     B, *(max)

       ;-------------------------------------
       ; copy(exc, exc_tmp, L_subfr)
       ;-------------------------------------
                LD      #param_norm_corr, DP
                MVDM    param_norm_corr.ptr_exc, AR4   ;AR4 -> exc[0]
                STM     #exc_tmp, AR5
                RPT     #L_SUBFR - 1
                        MVDD    *AR4+, *AR5+
EndFraction1:
;-------------------------------------
; Fraction +1/3
;-------------------------------------
        LD      #Addr_T0_frac, DP
        ST      #1, Addr_T0_frac     ;frac = 1
        CALL    Pred_lt_3

        LD      #param_norm_corr, DP
        MVDM    param_norm_corr.ptr_exc, AR4   ;AR4 -> exc[0]
        STM     #Addr_Dn, AR3                  ;AR3 -> Dn
        CALLD   Dot_product                    ;corr = Dot_Product()
		STM	#L_SUBFR-1,AR6

        DLD      *(max), B
        LD      #Addr_pit_frac, DP
        MAX     B
        NOP
        NOP
        BC      EndFraction2, C
                ST      #1, Addr_pit_frac      ;*pit_frac=1
                DST     B, *(max)
EndFraction2:
        BC      EndPitchFr3, NC
        ;-------------------------------------
        ; copy(exc_tmp, exc, L_subfr)
        ;-------------------------------------
                LD      #param_norm_corr, DP
                MVDM    param_norm_corr.ptr_exc, AR5   ;AR5 -> exc[0]
                STM     #exc_tmp, AR4
                RPT     #L_SUBFR - 1
                        MVDD    *AR4+, *AR5+

EndPitchFr3:

		LD	*(Addr_pit_frac), A
		STL	A, *(Addr_T0_frac)
		
        RET                     ;return t0

⌨️ 快捷键说明

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