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

📄 update.asm

📁 利用G.723协议在DSP实现音频信号的压缩与解压缩实验
💻 ASM
📖 第 1 页 / 共 2 页
字号:
           .title   "update.asm"
           .mmregs
           
           .include "g723_stat.asm"
           .include "g723tab_h.asm"
           .include "g723_global.asm"
;-------------------------------------------------------------------
;/*
; * update()
; *
; * updates the state variables for each output code
; */
;void
;update(
;	int		code_size,	/* distinguish 723_40 with others */
;	int		y,		/* quantizer step size */
;	int		wi,		/* scale factor multiplier */
;	int		fi,		/* for long/short term energies */
;	int		dq,		/* quantized prediction difference */
;	int		sr,		/* reconstructed signal */
;	int		dqsez,		/* difference from 2-pole predictor */
;	struct g723_state *state_ptr)	/* coder state pointer */
;{
;	int		cnt;
;	short		mag, exp; // mant;	/* Adaptive predictor, FLOAT A */
;	short		a2p;		/* LIMC */
;	short		a1ul;		/* UPA1 */
;	short		/*ua2*/ pks1;	/* UPA2 */
;	short		/*uga2a*/ fa1;
;//	short		uga2b;
;	char		tr;		/* tone/transition detector */
;	short		ylint, thr2, dqthr;
;	short  		ylfrac, thr1;
;	short		pk0;

;-------------------------------------------------------------------------
;	pk0 = (dqsez < 0) ? 1 : 0;	/* needed in updating predictor poles */
;
;	mag = dq & 0x7FFF;		/* prediction difference magnitude */
;--------------------------------------------------------------------------

       
       
temp_mag         .set            0           
temp_pk0         .set            1             
temp_i           .set            2
temp_thr2        .set            3
temp_tr          .set            4
temp_pks1        .set            5
temp_dqsez       .set            6
temp_a2p         .set            7
temp_y           .set            8
temp_exp         .set            9
temp_dqthr       .set            10

       ;AR4->y, wi=witab[i], fi=fitab[i], B=i
       ;AR5->dq, AR6->sr, A=dqsez, AR7=state_ptr  
                 .text                       
update:
        
		frame		#-11  
		nop
		nop
		mvmm    AR7, AR2
		stl     A, *SP(temp_dqsez)
		nop
		nop
		nop
		nop
		;mvmm    AR7, AR2             
        stl     B, *SP(temp_i)
        st      #0, *SP(temp_pk0)
        ld      *AR4, A
        stl     A, *SP(temp_y)
        ld      *SP(temp_dqsez), A
        nop
        nop
        xc      2, ALT   ;A=dqsez
        st      #1, *SP(temp_pk0)
        ld      *AR5, A
        and     #0x7fff, A     
        stl     A, *SP(temp_mag)
;----------------------------------------------------------------------   
;	/* TRANS */
;	ylint = state_ptr->yl >> 15;	/* exponent part of yl */
;	ylfrac = (state_ptr->yl >> 10) & 0x1F;	/* fractional part of yl */
;	thr1 = (32 + ylfrac) << ylint;		/* threshold */
;	thr2 = (ylint > 9) ? 31 << 10 : thr1;	/* limit thr2 to 31 << 10 */
;	dqthr = (thr2 + (thr2 >> 1)) >> 1;	/* dqthr = 0.75 * thr2 */
;	if (state_ptr->td == 0)		/* signal supposed voice */
;		tr = 0;
;	else if (mag <= dqthr)		/* supposed data, but small mag */
;		tr = 0;			/* treated as voice */
;	else				/* signal is data (modem) */
;		tr = 1;
;-----------------------------------------------------------------------
        dld      *AR2, A       
        sfta     A, -15   
        stlm     A, T        ;T = ylint 
       
        dld      *AR7, A
        sfta     A, -10
        and      #0x1f, A
        add      #32, A
        norm     A           ;A=thr1
        ld       A, B
        ldm      T, A        ;A=ylint
        sub      #9, A
        nop
        nop
        xc       2, AGT
        ld       #0x7f00, B  ;B=thr2
        
        ld       B, A 
        add      B, -1, A  
        sfta     A, -1       ;A=dqthr
        stl      A, *SP(temp_dqthr)
        
        mar      *+AR2(td)
        ld       *AR2, A             
        bc       tr1, ANEQ
        ld       #0, B        ;if (state_ptr->td == 0)
        b        end_tr
tr1:
        ld       *SP(temp_dqthr), A
        sub      *SP(temp_mag), A
        bc       tr2, ALT
        ld       #0, B        ;else if (mag <= dqthr)
        b        end_tr
tr2:
        ld       #1, B        ;else tr = 1   B=tr
end_tr
        stl       B, *SP(temp_tr)                                
;----------------------------------------------------
;	 /* Quantizer scale factor adaptation.
;	 */
;
;	/* FUNCTW & FILTD & DELAY */
;	/* update non-steady state step size multiplier */
;	state_ptr->yu = y + ((wi - y) >> 5);
;----------------------------------------------------
        
        ld       #tab_witab, A
        add      *SP(temp_i), A   ;A->wi
        stlm     A, AR2
        nop
        nop
        ld       *AR4, B          ;*AR4=y
        ld       *AR2, A          ;
        sub      B, A
              
        sfta     A, -5      
        
        add      *AR4, A          ;A=state_ptr->yu


;---------------------------------------------------
;	/* LIMB */
;	if (state_ptr->yu < 544)	/* 544 <= yu <= 5120 */
;		state_ptr->yu = 544;
;	else if (state_ptr->yu > 5120)
;		state_ptr->yu = 5120;
;------------------------------------------------------------
        sub      #544, A
        bcd       yu1, AGEQ
        add      #544, A
        ld       #544, A
        b        end_yu
yu1:
        sub      #5120, A
        bcd       end_yu, ALEQ       
        add      #5120, A
        ld       #5120, A
end_yu    ;  A=state_ptr->yu
        mvmm     AR7, AR2
        mar      *+AR2(yu)
        stl      A, *AR2
;-------------------------------------------------------------
;	/* FILTE & DELAY */
;	/* update steady state step size multiplier */
;	state_ptr->yl += state_ptr->yu + ((-state_ptr->yl) >> 6);
;-------------------------------------------------------------
        
       dld       *AR7, B
       neg       B
       add       B, -6, A
       dadd      *AR7, A  ;A=state_ptr->yl
       dst       A, *AR7
;---------------------------------------------------------------
;	/*
;	 * Adaptive predictor coefficients.
;	 */
;	if (tr == 1) {			/* reset a's and b's for modem signal */
;		state_ptr->a[0] = 0;
;		state_ptr->a[1] = 0;
;		state_ptr->b[0] = 0;
;		state_ptr->b[1] = 0;
;		state_ptr->b[2] = 0;
;		state_ptr->b[3] = 0;
;		state_ptr->b[4] = 0;
;		state_ptr->b[5] = 0;
;	}
;----------------------------------------------------------------
       ld        *SP(temp_tr), B
       sub       #1, B
       mvmm      AR7, AR2
       mar       *+AR2(a)
       mvmm      AR7, AR3
       mar       *+AR3(b)
       bc        end_ab, BNEQ
       rpt       #1
       st        #0, *AR2+
       rpt       #5
       st        #0, *AR3+

;----------------------------------------------------------------
;    else {			/* update a's and b's */
;		pks1 = pk0 ^ state_ptr->pk[0];		/* UPA2 */
;---------------------------------------------------------------
end_ab:
       mvmm      AR7, AR2
       mar       *+AR2(pk)
       ld        *SP(temp_pk0), B
       xor       *AR2, B
       stl       B, *SP(temp_pks1)
;---------------------------------------------------------------
;		/* update predictor pole a[1] */
;		a2p = state_ptr->a[1] - (state_ptr->a[1] >> 7);
;---------------------------------------------------------------
       mvmm		 AR7, AR2
       mar       *+AR2(a+1)
       ld        *AR2, A
       sub       *AR2-, -7, A    ;A=a2p
       stl       A, *SP(temp_a2p) 
;---------------------------------------------------------------
;		if (dqsez != 0) {
;			fa1 = (pks1) ? state_ptr->a[0] : -state_ptr->a[0];
;			if (fa1 < -8191)	/* a2p = function of fa1 */
;				a2p -= 0x100;
;			else if (fa1 > 8191)
;				a2p += 0xFF;
;			else
;				a2p += fa1 >> 5;
;
;			if (pk0 ^ state_ptr->pk[1])
;				/* LIMC */
;				if (a2p <= -12160)
;					a2p = -12288;
;				else if (a2p >= 12416)
;					a2p = 12288;
;				else
;					a2p -= 0x80;
;			else if (a2p <= -12416)
;				a2p = -12288;
;			else if (a2p >= 12160)
;				a2p = 12288;
;			else
;				a2p += 0x80;  }		
;------------------------------------------------------------------------       
       ld        *SP(temp_dqsez), B
       bc        dqsez00, BEQ              
       ld        *SP(temp_pks1), B
       ld        *AR2, A   ;*AR2= state_ptr->a[0]
       nop                
       xc        1, BEQ
       neg       A
       
       sub       #-8192, A
       ld        *SP(temp_a2p), B
       bcd        fa1, AGEQ
       add       #-8192, A
       sub       #0x100, B      ;B=a2p   
       b         end_fa
fa1:
       sub       #8191, A
       bcd       fa2, ALEQ
       add       #8191, A      
       add       #0xff, B
       b         end_fa 
fa2:
       add       A, -5, B       ;B=a2p   
end_fa
       stl       B, *SP(temp_a2p)
       
       mvmm      AR7, AR2
       mar       *+AR2(pk+1)   ;*AR2=state_ptr->pk[1]
       ld        *SP(temp_pk0), A
       xor       *AR2, A
       bc        a2p1, AEQ
       
       sub       #-12160, B
       bcd        a2p01, BGT
       add       #-12160, B 
       ld        #-12288, B
       b         end_a2p
a2p01
       sub       #12416, B  
       bcd       a2p02, BLT
       add       #12416, B
       ld        #12288, B
       b         end_a2p
a2p02
       sub       #0x80, B    ;B=a2p
       b         end_a2p
a2p1:       
       sub       #-12416, B
       bcd       a2p11, BGT
       add       #-12416, B
       ld        #-12288, B
       b         end_a2p
a2p11:       
       sub       #12160, B 
       bcd       a2p12, BLT
       add       #12160, B
       ld        #12288, B
       b         end_a2p
a2p12:   
       add       #0x80, B    
end_a2p       
       ld        B, A     ;A=a2p
       stl       A, *SP(temp_a2p)
;----------------------------------------             
;		/* TRIGB & DELAY */
;		state_ptr->a[1] = a2p;
;---------------------------------------
dqsez00:
        mvmm     AR7, AR2     
        mar      *+AR2(a+1)
        stl      A, *AR2-   ;A=a2p
;-------------------------------------------------------        
;		/* UPA1 */
;		/* update predictor pole a[0] */
;		state_ptr->a[0] -= state_ptr->a[0] >> 8;
;		if (dqsez != 0)
;			if (pks1 == 0)
;				state_ptr->a[0] += 192;
;			else
;				state_ptr->a[0] -= 192;
;-------------------------------------------------------
        ld       *AR2, A      ;A=state_ptr->a[0]
        sub      *AR2, -8, A  ;A=state_ptr->a[0]
       ; stl      A, *AR2     ;A=state_ptr->a[0]
        
        ld       *SP(temp_dqsez), B
        bc       end_dqsez11, BEQ
        ld       *SP(temp_pks1), B
        bc       pks11, BNEQ
        add      #192, A
        b        end_dqsez11 
pks11:        
        sub      #192, A      

⌨️ 快捷键说明

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