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

📄 encoder.asm

📁 TI C54写的G729代码,视线8kbps高质量语音编码,汇编优化
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;------------------------------------
;T0 = Pitch_fr3_fast(&exc[i_subfr]
;     xn, h1, L_SUBFR, T0_min,
;     T0_max, i_subfr, &T0_frac)
;------------------------------------
	LD #ptr_exc,DP
	PSHD ptr_exc
	LD ptr_exc,A
	ADD *(Addr_i_subfr),A
	NOP
	STL A,ptr_exc
    CALL    Pitch_fr3_fast
	LD #ptr_exc,DP
	POPD  ptr_exc

;------------------------------------
; index = Enc_lag3(T0, T0_frac.
;         &T0_min, &T0_max,
;         PIT_MIN, PIT_MAX,
;         i_subfr)
;------------------------------------

        CALLD   Enc_lag3
        	LD      #Addr_i_subfr, DP
        	LD      Addr_i_subfr, A

        MVDM    ptr_codeword, AR3
        LD      #Addr_i_subfr, DP
        LD      Addr_i_subfr, A
        STL     B, *AR3+		;save the index

; if(i_subfr==0)Parity_Pitch()
        BC      SkipP0, ANEQ        
                CALL    Parity_Pitch
                STL     A, *AR3+

SkipP0:
        MVMD    AR3, ptr_codeword

;-------------------------------------
; Syn_filt(Ap, &exc[i_subfr], y1,
;          L_SUBFR, mem_zero, 0)
;-------------------------------------
        LD      #Addr_i_subfr, DP
        LD      Addr_i_subfr, A
        BC      Y1_Second_40, ANEQ

        STM     #Addr_Ap1_1, AR2    ; AR2 --> ptr_bi
        MVDM    ptr_exc, AR3        ; AR3 --> ptr_xn
        STM     #Addr_yn1, AR5      ; AR5 --> ptr_yn
        MVDM    ptr_mem_zero, AR4   ; AR4 --> ptr_un
        CALLD   Syn_filt3
        LD      #L_SUBFR, A         ; A --> lg
        NOP
        B       Y1_End_80

Y1_Second_40:

        LD      #ptr_ai, DP
        STM     #Addr_Ap1_2, AR2    ; AR2 --> ptr_bi
        MVDM    ptr_exc, AR3        ; AR3 --> ptr_xn
        NOP
        MAR     *+AR3(#40)
        STM     #Addr_yn1, AR5      ; AR5 --> ptr_yn
;	MAR     *+AR5(#40)
        MVDM    ptr_mem_zero, AR4   ; AR4 --> ptr_un
        CALLD   Syn_filt3
        LD      #L_SUBFR, A         ; A --> lg
        NOP

        
Y1_End_80:
        CALL    G_pitch

        CALL    test_err
        BCD     EndTestErr, AEQ
        LD      #Addr_TempFlag, DP
        STL     A, Addr_TempFlag

                LD      #Addr_gain_pit, DP
                LD      #GPCLIP, B
                LD      Addr_gain_pit, A
                MIN     A
                STL     A, Addr_gain_pit
EndTestErr:

;------------------------------------
; xn2[i] = xn[i] - y1[i] * gain_pit
;------------------------------------

        STM     #L_SUBFR - 1, BRC
        STM     #Addr_xn1, AR2
        STM     #Addr_yn1, AR3
        MVDM    Addr_gain_pit, T

        RPTBD   EndXn2 - 1
        STM     #Addr_xn2, AR4
		LD *AR2+, A			;xn[i]
		MPY *AR3+, B			;L_temp = L_mult(y1[i], gain_pit);
		LD B, 1				;L_temp = L_shl(L_temp, 1);
		LD B,-16
		SUB B, A				;sub(xn[i], extract_h(L_temp));
		SAT A
		STL A, *AR4+		
EndXn2:

;-----------------------------------
; Innovative codebook serach.
;-----------------------------------
        CALL    ACELP_Codebook

        MVDM    ptr_codeword, AR3
        STM     #PulseIndex, AR2

        MVDD    *AR2-, *AR3+
        MVDD    *AR2, *AR3+

        MVMD    AR3, ptr_codeword

;------------------------------------
; Quantization of gains.
;------------------------------------
; g_coeff_cs[0]     = g_coeff[0];         
; exp_g_coeff_cs[0] = negate(g_coeff[1]); 
; g_coeff_cs[1]     = negate(g_coeff[2]); 
; exp_g_coeff_cs[1] = negate(add(g_coeff[3], 1));


        STM     #Addr_g_coeff, AR2
        STM     #Addr_g_coeff_cs, AR3
        STM     #Addr_exp_g_coeff_cs, AR4

; g_coeff_cs[0] = g_coeff[0]
        MVDD    *AR2+, *AR3+   
        LD      #0, ASM
        LD      *AR2+, 16, A
        NEG     A, B

; exp_g_coeff_cs[0] = negate(g_coeff[1]);
        ST      B, *AR4+       
        ||LD      *AR2+, A

        NEG     A, B
; g_coeff_cs[1] = negate(g_coeff[2])
        ST      B, *AR3        
        ||LD      *AR2, A

        ADD     #1, 16, A     
; Corr_xy2( xn, y1, y2, g_coeff_cs, exp_g_coeff_cs )
        NEG     A
        CALLD   Corr_xy2
; exp_g_coeff_cs[1] = negate(add(g_coeff[3], 1))		(use delay)
        STL     A, -16, *AR4     

        CALL    Qua_gain

        MVDM    ptr_codeword, AR3
        MVDM    ptr_sharp, AR4
        STL     A, *AR3+              ; Al = Qua_gain(xxx)
        MVMD    AR3, ptr_codeword


; sharp = gain_pit;
; if (sub(sharp, SHARPMAX) > 0) { sharp = SHARPMAX;  }
; if (sub(sharp, SHARPMIN) < 0) { sharp = SHARPMIN;  }
        
        LD      #Addr_gain_pit, DP
        LD      Addr_gain_pit, B
        LD      #SHARPMAX, A
        MIN     B
        LD      #SHARPMIN, A
        MAX     B

        STL     B, *AR4               ; update sharp

; --- Find the total excitation ---
; --- find synthesis speech corresponding to exc[] ---
; --- update filters memories for finding the target ---
; --- vector in the next subframe ---
; --- (update error[-m..-1] and mem_w_err[]) ---
; --- update error function for taming process ---

;  exc[i] = gain_pit*exc[i] + gain_code*code[i]
        
        STM     #L_SUBFR - 1, BRC
        MVDM    ptr_exc_subfrm, AR2
        STM     #Addr_gain_pit, AR3
        STM     #Addr_cn, AR4
        LD      #1, 14, B                  ; rounding
        RPTBD   EndTotalExc - 1
        STM     #Addr_gain_code, AR5
                
                MAC     *AR2, *AR3, B, A ;A = gain_pit*exc[i]
                MAC     *AR4+, *AR5, A   ;A += gain_code*code[i]
                STL     A, -15, *AR2+
EndTotalExc:

; update_exc_err(gain_pit, T0);

        CALL    update_exc_err

; for (i = L_SUBFR-M, j = 0; i < L_SUBFR; i++, j++)
; {
;    temp       = extract_h(L_shl( L_mult(y1[i], gain_pit),  1) );
;    k          = extract_h(L_shl( L_mult(y2[i], gain_code), 2) );
;    mem_w0[j]  = sub(xn[i], add(temp, k));
; }
        
        STM     #M - 1, BRC
        MVDM    ptr_mem_w0, AR1
        MVDM    ptr_speech_subfrm, AR2

        LD      #Addr_gain_pit, DP
        STM     #Addr_yn1+(L_SUBFR - M), AR4  ;AR4 -> &y1[L_SUBFR-M]
        STM     #Addr_yn2+(L_SUBFR - M), AR5  ;AR5 -> &y2[L_SUBFR-M]
        RPTBD   EndUpdateMemErr - 1
        STM     #Addr_xn1+(L_SUBFR - M), AR6  ;AR6 -> &xn[L_SUBFR-M]
                
                LD      Addr_gain_pit, T
                MPY     *AR4+, A            
				LD A,1
				LD A,-16			               ;≠LD A,-14   ! !
                LD      Addr_gain_code, T
                MPY     *AR5+, B
				LD B,2
				LD B,-16
                ADD     B,A
                SAT A			;saturate A
                LD      *AR6+, B
                SUB     A,B
                SAT B			;saturate B
                STL     B, *AR1+                ; update mem_w0

EndUpdateMemErr:

        

        LD      #Addr_i_subfr, DP
        LD      Addr_i_subfr, A

SubFrameEnd:

        BCD     SubFrameBegin, AEQ      ; if(i==0)loop;
        ADDM    #L_SUBFR, Addr_i_subfr  ; i += L_SUBFR

        CALL    UpdateSignals
        POPM    ST1
        RET


;-------------------------------------------------------------
;  UpdateSignals
;-------------------------------------------------------------
UpdateSignals:

        MVDM    ptr_old_speech, AR2
        MVDM    ptr_wsp, AR4
        MVMM    AR2, AR3
        MAR     *+AR2(L_FRAME)
        RPT     #L_TOTAL-L_FRAME-1
; Copy(&old_speech[L_FRAME], &old_speech[0], L_TOTAL-L_FRAME);
                MVDD    *AR2+, *AR3+       

        MVDM    ptr_exc, AR2

        MVMM    AR4, AR3
        MAR     *+AR4(-PIT_MAX)          ;AR4 -> &old_wsp[0]
        MAR     *+AR3(L_FRAME - PIT_MAX) ;AR3 -> &old_wsp[L_FRAME]

        RPT     #PIT_MAX - 1
; Copy(&old_wsp[L_FRAME], &old_wsp[0], PIT_MAX);
                MVDD    *AR3+, *AR4+       

        MVMM    AR2, AR3

        MAR     *+AR2(L_FRAME - PIT_MAX - L_INTERPOL) ;AR2 -> &old_exc[L_FRAME]
        MAR     *+AR3(-(PIT_MAX + L_INTERPOL))        ;AR2 -> &old_exc[0]

        RPT     #(PIT_MAX + L_INTERPOL - 1)
; Copy(&old_exc[L_FRAME], &old_exc[0], PIT_MAX+L_INTERPOL);
                MVDD    *AR2+, *AR3+                   

        RET

⌨️ 快捷键说明

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