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

📄 g723decoder.asm

📁 利用G.723协议在DSP实现音频信号的压缩与解压缩实验
💻 ASM
字号:
             .title   "g723decoder.asm"
             
             .include "g723_global.asm"
             .include "g723tab_h.asm"
             .include "g723_stat.asm"
             
             .mmregs
;----------------------------------------------------------------------------
;void
;g723_40_decoder(
;	short		*wIn,
;	short		*wOut,
;	struct g723_state *state_ptr)
;{
;	short		sezi, sei, sez, se;	/* ACCUM */
;	short		y; //dif;			/* MIX */
;	short		sr;			/* ADDB */
;	short		dq;
;	short		dqsez;
;    short       i;
var_sl      .set      0
var_sei     .set      var_sl+1
var_sezi    .set      var_sei+1
var_se      .set      var_sezi+1
var_sez     .set      var_se+1
var_d       .set      var_sez+1
var_y       .set      var_d+1
var_sr      .set      var_y+1
var_dqsez   .set      var_sr+1
var_dq      .set      var_dqsez+1
var_i       .set      var_dq+1
;ST1
;AR7
;AR6
;AR1
off_m       .set     -10   
off_p       .set     10
frame_size  .set     14
;return address         
wOut       .set      frame_size+1
state_ptr  .set      frame_size+2

            .text
_g723_40_decoder:
        pshm   	AR1
        pshm   	AR6
        pshm   	AR7
        pshm    ST1
        frame   #off_m
        
        stlm   A, AR2
        ssbx   CPL
        ssbx   SXM
        ssbx   OVM
        ssbx   FRCT
        rsbx   C16
        
        mvdk   *SP(wOut), AR1
        mvdk   *SP(state_ptr), AR7
;------------------------------------------------------------
;	i = *wIn & 0x1f;			/* mask to get proper bits */
;	sezi = predictor_zero(state_ptr);
;	sez = sezi >> 1;
;	sei = sezi + predictor_pole(state_ptr);
;	se = sei >> 1;			/* se = estimated signal */
;------------------------------------------------------------        
        ld      *AR2, A
        and     #0x1f, A
        stl     A, *SP(var_i)   
        
        mvmm    SP, AR6        
        calld    predictor_zero     ;AR7=state_ptr
        mar     *+AR6(var_sezi)    ;*AR6=var_sezi
        
        ld   *AR6, -1, A
        stl  A, *SP(var_sez)
        
         
        call  predictor_pole     ;返回值放在A
        add    *SP(var_sezi), A  ;A=sei            
        stl   A, -1, *SP(var_se)                                                    
;-----------------------------------------------------------------
;	y = step_size(state_ptr);	/* adaptive quantizer step size */
;------------------------------------------------------------------
         call step_size   ;AR7=state_ptr   ;返回值y = A                       
         stl  A, *SP(var_y)
;----------------------------------------------------------------------
;	dq = reconstruct(i & 0x10, _dqlntab[i], y);	/* estimation diff. */
;----------------------------------------------------------------------
        ld    #tab_dqlntab, B
        ld    *SP(var_i), A   
        add   A, B      ;B->dqlntab[i]
        stlm  B, AR3
        and   #0x10, A, A
        stlm  A, AR6    ;AR6=i & 0x10
        ld    *SP(var_y), A ;A->var_y  
                                        
        call  reconstruct   ;返回值=B
                       
        stl   B, *SP(var_dq)
;---------------------------------------------------------------------------
;	sr = (dq < 0) ? (se - (dq & 0x7FFF)) : (se + dq); /* reconst. signal */
;---------------------------------------------------------------------------
       ld  *SP(var_dq), A
       bc  a1, AGEQ
a0     ld   #0x7fff, A
       and  *SP(var_dq), A
       sub  *SP(var_se), A
       neg  A
       b    enda1
a1:    ld   *SP(var_se), A
       add  *SP(var_dq), A
       
enda1:
       stl  A, *SP(var_sr)        
;---------------------------------------------------------------------------
;	dqsez = sr - se + sez;		/* pole prediction diff. */
;---------------------------------------------------------------------------
       add   *SP(var_sez), A  ;A=sr + sez
       ld    *SP(var_se), B
       sub   B, A             ;A=dqsez
;---------------------------------------------------------------------------
;	update(5, y, _witab[i], _fitab[i], dq, sr, dqsez, state_ptr);
;---------------------------------------------------------------------------
       mvmm  SP, AR4
       mar   *+AR4(var_y)   ;AR4->var_y
       mvmm  SP, AR5
       mar   *+AR5(var_dq)  ;AR5->var_dq
       mvmm  SP, AR6
       
       ld    *SP(var_i), B  ;B=i
       
       calld  update         ;AR7=state_ptr  ;A=dqsez                           
       mar   *+AR6(var_sr)  ;AR6->var_sr                     
;---------------------------------------------------------------------------
;    *wOut= sr << 2;	/* sr was of 14-bit dynamic range */
;
;}
       ld      *SP(var_sr), A
       stl     A, 2, *AR1
       frame   #off_p
       popm  ST1
       popm  AR7
       popm  AR6
       popm  AR1
       
       ret
     
            .end

⌨️ 快捷键说明

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