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

📄 cb_gain_average.asm

📁 基于TMS320F2812的AMR+RS编解码+OFDM调制解调源程序。是stand alone运行版本
💻 ASM
字号:
*****************************************************************************
** Description:     Cb_gain_average() in c_g_aver                       **
**                                                                         **
** Inputs                                                                  **
**                                                                         **
**  Cb_gain_averageState *st,  
** ar2--- Word16 gain_code,         
** xar3---word16  lsp[],   
** xar4--- Word16 lspAver[]    									**

** Outputs:                                                                **
**   Cb_gain_averageState *st                                          **
** return ar2                                           			**
**                                                                         **
** Attribute    :       Cycles: 3032       Pm: 116                           **
**                      Modified Registers:  all  _buffer1                          **
**                                                                         **
** Programmer   :      xiewei                                     **
*****************************************************************************
  .ref _div_s
  .ref _buffer1
  .ref hangVar
  .ref hangCount
  .ref cbGainHistory
  .ref  L_CBGAINHIST	
  .global _Cb_gain_average
_Cb_gain_average:         ; cbGainMix = gain_code
           ;for (i = 0; i < (L_CBGAINHIST-1=6); i++)
       ADDB SP,#16
       MOVL XAR6,#cbGainHistory
       MOVL XAR5,#cbGainHistory
       ADDB XAR6,#1
       MOV AR0,#5
     ;st->cbGainHistory[i] = st->cbGainHistory[i+1];  
_loop_27          
       MOV AH,*XAR6++
       MOV *XAR5++,AH
       BANZ _loop_27,AR0--
       MOVL XAR5,#cbGainHistory
       ADDB XAR5,#6
      ;st->cbGainHistory[L_CBGAINHIST-1] = gain_code;  
       MOV *XAR5,AR2    
       MOV *-SP[12],AR2        ; for (i = 0; i < M; i++)               ;
       MOVL XAR6,#_buffer1
       MOV AR0,#9
_loop_37
       MOV AH,*XAR4    ;tmp1 = abs_s(sub(lspAver[i], lsp[i]))
       SUB AH,*XAR3++
       MOV AL,#0
       ABS ACC            
       CSB ACC            ;shift1 = sub(norm_s(tmp1), 1);
       MOV AL,T
       SUB AL,#1          
       MOV *-SP[2],AL
       MOV T,AL            ;tmp1 = shl(tmp1, shift1)
       LSL AH,T           
       MOV AR1,AH
       MOV AH,*XAR4++      ;shift2 = norm_s(lspAver[i])
       CSB ACC             
       MOV *-SP[4],T
       LSL AH,T         ;tmp2 = shl(lspAver[i], shift2)  
       MOV AR2,AH
       LCR _div_s           ;tmp[i] = div_s(tmp1, tmp2)
       MOV *XAR6,AL      
       MOV AH,*-SP[2]    ; shift = sub(add(2, shift1), shift2);
       ADD AH,#2         
       SUB AH,*-SP[4]
       SB _line_79,LT
       MOV AL,*XAR6     ; tmp[i] = shr(tmp[i], shift);
       MOV T,AH
       ASR AL,T
       B _line_84, UNC
_line_79:
       NEG AH             ;tmp[i] = shl(tmp[i], negate(shift));
       MOV T,AH
       LSL AL,T
      ; MOV AH,*-SP[4] 
_line_84:         
       MOV *XAR6++,AL
       BANZ _loop_37,AR0-- 
       MOVL XAR6,#_buffer1    
       MOV AL,*XAR6++
       ;by yangzhw               ; diff = tmp[0];
       MOV AR0,#9 - 1    ;for (i = 1; i < M; i++) 
_loop_73:                         
            ; diff = add(diff, tmp[i]);
       ADD AL,*XAR6++
       BANZ _loop_73,AR0--
       MOV *-SP[6],AL
       MOVL XAR5,#hangVar 
       MOV AH,*XAR5
       SUB AL,#5325    ;if (sub(diff, 5325) > 0)
       SB _line_103,LEQ
       ADD AH,#1       ;st->hangVar = add(st->hangVar, 1);
       MOV *XAR5,AH 
       B _line_107,UNC
_line_103:
       MOV *XAR5,#0     ;st->hangVar = 0
_line_107:       
	   MOV AH,*XAR5		;ah = st->hangVar	
       SUB AH,#10          ;if (sub(st->hangVar, 10) > 0)
       MOVL XAR5,#hangCount		;xar5 point to hangCount
       SB _line_91,LEQ
                        ;st->hangCount = 0;
       MOV *XAR5,#0
_line_91:
       MOV AR2,#8192            ;bgMix = 8192
       MOV AL,*-SP[6]           ; tmp_diff = sub(diff, 3277)
       SUB AL,#3277     		;al = tmp_diff
       SB _line_95,LEQ         ;if (tmp_diff > 0)
       MOV AR1,AL              ; tmp1 = tmp_diff; 
       B _line_125,UNC
_line_95:
       MOV AR1,#0               ;tmp1 = 0
_line_125:            
       MOV AH,#2048             ;if (sub(2048, tmp1) < 0)
       SUB AH,AR1                             
       SB _line_135 ,GEQ                              
       MOV AR2,#8192           ; bgMix = 8192;
       B _line_138  ,UNC
_line_135:
       mov	al,ar1                   
       LSL AL,#2               ;bgMix = shl(tmp1, 2);
       MOV AR2,AL 
_line_138:               ; if ( (sub(st->hangCount, 40) < 0) 
	   MOV AH,*XAR5	 ; ||  (sub(diff, 5325) > 0))                                 
	   SUB AH,#40
	   SB _line_DO,LT
       MOV AH,*-SP[6]
       SUB AH,#5325
       SB _line_DO,GT  
       SB _line_NDO,UNC    
_line_DO:
       MOV AR2,#8192       ;bgMix = 8192;        
_line_NDO: 
         ;L_sum = L_mult(6554, st->cbGainHistory[2]);         
       MOVL XAR5,#cbGainHistory       
       ADDB XAR5,#2
       MOV T,*XAR5++                 
       MPY p,T,#6554
       movl acc, p 
       LSL ACC,#1
       MOV AR0,#L_CBGAINHIST - 3 - 1        ;for (i = 3; i < L_CBGAINHIST=7; i++)       
_loop_124:   ;L_sum = L_mac(L_sum, 6554, st->cbGainHistory[i]);           
       MOV T,*XAR5++
       MPY P,T,#6554
       ADDL ACC,P<<PM
       BANZ _loop_124,AR0--
       ADD ACC,#0x0800<<4   ;cbGainMean = round(L_sum);                       
       MOV *-SP[8],AH
       MOV T,AR2         ;L_sum = L_mult(bgMix, cbGainMix);                        
       MPY ACC,T,*-SP[12]
       LSL ACC,#1
       MOV T,*-SP[8]    ;L_sum = L_mac(L_sum, 8192, cbGainMean);
       MPY P,T,#8192
       ADDL ACC,P<<PM                                   
                 ;L_sum = L_msu(L_sum, bgMix, cbGainMean);                               
       MOV T,AR2
       MPY P,T,*-SP[8]
       SUBL ACC,P<<PM
       LSL ACC,#2        ;cbGainMix = round(L_shl(L_sum, 2)); 
       ADD ACC,#0x0800<<4
       MOV AR2,AH
       MOVL XAR5,#hangCount
       MOV AL,*XAR5     ;st->hangCount = add(st->hangCount, 1);
       ADD AL,#1
       MOV *XAR5,AL
       SUBB SP,#16
       LRETR
  
  
  
  
  
  
  
  
  
  
  

⌨️ 快捷键说明

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