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

📄 pit_ol_f.asm

📁 TI C54写的G729代码,视线8kbps高质量语音编码,汇编优化
💻 ASM
字号:
;================================================================
;  File Name
;  ----------
;  PIT_OL_F.ASM
;
;  Brief Description of the Code:
;  ------------------------------
;  Compute the open loop pitch lag
;
;  Ref
;  ------
;  PITCH_A.C
;================================================================
;  Pitch_ol_fast
;----------------------------------------------------------------
;  Word16 Pitch_ol(       /* output: open loop pitch lag                        */
;     Word16 signal[],    /* input : signal used to compute the open loop pitch */
;                         /*     signal[-pit_max] to signal[-1] should be known */
;     Word16   pit_max,   /* input : maximum pitch lag                          */
;     Word16   L_frame    /* input : length of frame to compute pitch           */
;  )
;----------------------------------------------------------------
;  Constants : PIT_MAX = pit_max
;              PIT_MIN = pit_min
;              L_FRAME = L_frame
;
;  Pointers  : ptr_wsp -> signal
;
;
;  Buffer    : Addr_pitch_ol_buf[240]
;
;  Output    : A = lag
;
;  Modified Registers : AR2, AR3
;----------------------------------------------------------------
		.mmregs
        .include ..\include\const.h
        .include ..\include\struct.h
        .include ..\include\ld8amem.h

        .text
        .def     Pitch_ol_fast

        .ref     mov_warn
        .ref     energy
        .ref     mov_war3
        .ref     test_around_lag_max_3
        .ref     test_multiple

param_lag_max   .tag     Str_Lag_max

        .asg     "AR1", pSigRef
        .asg     "AR2", pSignal
        .asg     "AR3", pScal_sig

        .asg     "Addr_lag_max_buf",         max
        .asg     "ptr_wsp",                  signal
        .asg     "Addr_pitch_ol_buf",        scal_sig
        .asg     "scal_sig+PIT_MAX+L_FRAME", max3
        .asg     "max3+1",                   max2
        .asg     "max2+1",                   max1
        .asg     "max1+1",                   p_max3
        .asg     "p_max3+1",                 p_max2
        .asg     "p_max2+1",                 p_max1

;----------------------------------------------------------------
;  note : param_lag_max is set at Addr_pitch_ol_buf + 230,
;         which is same data page as max1, max2....
;----------------------------------------------------------------

Pitch_ol_fast:

        MVDM    signal, pSigRef               ; pSigRef -> wsp[0]
        STM     #scal_sig, pScal_sig
        MAR     *+pSigRef(-PIT_MAX)           ; pSigRef -> &signal[-PIT_MAX]
        MVMM    pSigRef, pSignal              ;          =  old_wsp[0]

        LD      #PIT_MAX+L_FRAME-1, 0, A
        ROR     A 
		STL	A, AR6
        MAR     *AR6-
		LD	#0, 0, A
L0:
        SQURA   *pSignal, A                  ; A <-- *pSigRef**2
        MAR	*+pSignal(2)                 ; step is 2
        BANZ    L0,*AR6-

;--------------------------------------------------------
; Scaling of input signal.
;
;   if Overflow        -> scal_sig[i] = signal[i]>>3
;   else if t0 < 1^20  -> scal_sig[i] = signal[i]<<3
;   else               -> scal_sig[i] = signal[i]
;--------------------------------------------------------

        RSBX      OVA
   ;-----------------------

        SUB     #20h, 15, A, B
        SAT     A
        LD      #3, ASM
        XC      1, C
                LD      #0, ASM
        XC      1, AOV
                LD      #-3, ASM

        MVMM    pSigRef, pSignal

        LD      *pSignal+, 16, A
        RPT     #PIT_MAX+L_FRAME-1
                ST      A, *pScal_sig+  ||  LD      *pSignal+, A

;--------------------------------------------------------------
;  The pitch lag search is divided in three sections.
;  Each section cannot have a pitch multiple.
;  We find a maximum for each section.
;  We compare the maximum of each section by favoring small lag.
;
;  First section:  lag delay = pit_min     to  2*pit_min-1
;  Second section: lag delay = 2*pit_min   to  4*pit_min-1
;  Third section:  lag delay = 4*pit_min   to  pit_max
;---------------------------------------------------------------

;===============
;First section
;===============

        LD      #param_lag_max, DP
        STM     #param_lag_max, AR3
        ST      #20, p_max1
        ST      #PIT_MIN<<1, param_lag_max.lag_max
        ST      #PIT_MIN, param_lag_max.lag_min
        CALLD    mov_warn
        ST      #max1, param_lag_max.ptr_cor_max
        MVMD    AR1, p_max1
        CALL    energy

;===============
;Second section
;===============

        LD      #param_lag_max, DP
        ST      #40, p_max2
        ST      #PIT_MIN<<2, param_lag_max.lag_max
        ST      #PIT_MIN<<1, param_lag_max.lag_min
        CALLD    mov_warn
        ST      #max2, param_lag_max.ptr_cor_max
        MVMD    AR1, p_max2
        CALL    energy

;==============
;Third section
;==============

        LD      #param_lag_max, DP
        ST      #80, p_max3
        ST      #PIT_MAX, param_lag_max.lag_max
        ST      #PIT_MIN<<2, param_lag_max.lag_min
        CALLD   mov_war3
        ST      #max3, param_lag_max.ptr_cor_max
        CAll    test_around_lag_max_3
        MVMD    AR1, p_max3
        CALL    energy
;===================
; Test for multiple
;===================
        CALL    test_multiple

;================================
;Compare the 3 sections maxima.
;================================
; if(sub(max1,max2)<0){max1=max2;T1=T2}
; if(sub(max1,max3)<0)T1=T3
; return T1
        LD      #0, DP

        LD      *(max1), 16, A
        SUB     *(max2), 16, A
        NOP
        BC      K1, AGEQ
                DELAY   *(max2)
                DELAY   *(p_max2)

K1:     LD      *(max1), 16, A
        SUB     *(max3), 16, A
        NOP
        NOP
        BC      K2, AGEQ
                LD      *(p_max3), B
                STL     B, *(p_max1)

K2:      LD      *(p_max1), A

        RET

⌨️ 快捷键说明

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