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

📄 g729a_dec_ld8a.c

📁 在DSP上实现的G.729优化代码 编译过的 大家快来下载啊
💻 C
字号:
#include "../Common/typedef.h"
#include "../Include/G729A_basic_op.h"
#include "../Include/G729A_ld8a.h"

 static Word16 G729A_old_exc[G729A_L_FRAME+G729A_PIT_MAX+G729A_L_INTERPOL];
 static Word16 *G729A_exc;

 static Word16 G729A_lsp_old[G729A_M]={
             30000, 26000, 21000, 15000, 8000, 0, -8000,-15000,-21000,-26000};

 static Word16 G729A_mem_syn[G729A_M];

 static Word16 G729A_sharp;           
 static Word16 G729A_old_T0;           
 static Word16 G729A_gain_code;                         
 static Word16 G729A_gain_pitch;    
 
void G729AInit_Decod_ld8a(void)
{
  G729A_exc = G729A_old_exc + G729A_PIT_MAX + G729A_L_INTERPOL;
  
  G729ASet_zero(G729A_old_exc, G729A_PIT_MAX+G729A_L_INTERPOL);
  G729ASet_zero(G729A_mem_syn, G729A_M);

  G729A_sharp  = G729A_SHARPMIN;
  G729A_old_T0 = 60;
  G729A_gain_code = 0;
  G729A_gain_pitch = 0;

  G729ALsp_decw_reset();
 return;
}

void G729ADecod_ld8a(Word16  parm[], Word16  synth[], Word16  A_t[], Word16  *T2)
{
  Word16  *Az;                    
  Word16  lsp_new[G729A_M];                      
  Word16  code[G729A_L_SUBFR];        

  Word16  i, j, i_subfr;
  Word16  T0, T0_frac, index;
  Word16  bfi;
  Word32  L_temp;

  Word16 bad_pitch;             
  extern Word16 G729A_bad_lsf;          

  bfi = *parm++;

  G729AD_lsp(parm, lsp_new, G729Aadd_s(bfi, G729A_bad_lsf));
  parm += 2;

  G729AInt_qlpc(G729A_lsp_old, lsp_new, A_t);

  G729ACopy(lsp_new, G729A_lsp_old, G729A_M);

  Az = A_t;             

  for (i_subfr = 0; i_subfr < G729A_L_FRAME; i_subfr += G729A_L_SUBFR)
  {

    index = *parm++;            

    if(i_subfr == 0)
    {
      i = *parm++;              
      bad_pitch = G729Aadd_s(bfi, i);
      if( bad_pitch == 0)
      {
        G729ADec_lag3(index, G729A_PIT_MIN, G729A_PIT_MAX, i_subfr, &T0, &T0_frac);
        G729A_old_T0 = T0;
      }
      else         
      {
        T0  =  G729A_old_T0;
        T0_frac = 0;
        G729A_old_T0 = _sadd( G729A_old_T0, 1);
        G729A_old_T0 = _min2(G729A_old_T0, G729A_PIT_MAX);
      }
    }
    else                   
    {
      if( bfi == 0)
      {
        G729ADec_lag3(index, G729A_PIT_MIN, G729A_PIT_MAX, i_subfr, &T0, &T0_frac);
        G729A_old_T0 = T0;
      }
      else
      {
        T0  =  G729A_old_T0;
        T0_frac = 0;
        G729A_old_T0 = _sadd( G729A_old_T0, 1);
        G729A_old_T0 = _min2(G729A_old_T0, G729A_PIT_MAX);
      }
    }
    *T2++ = T0;

    G729APred_lt_3(&G729A_exc[i_subfr], T0, T0_frac, G729A_L_SUBFR);

    if(bfi != 0)        
    {

      parm[0] = G729ARandom() & (Word16)0x1fff;     
      parm[1] = G729ARandom() & (Word16)0x000f;      
    }
    G729ADecod_ACELP(parm[1], parm[0], code);
    parm +=2;

    j = G729Ashl_s(G729A_sharp, 1);          
    if(G729Asub_s(T0, G729A_L_SUBFR) <0 ) 
    {
        for (i = T0; i < G729A_L_SUBFR; i++) 
        {
          code[i] = _sadd(code[i], _smpy(code[i-T0], j)>>16);
        }
    }

    index = *parm++;       

    G729ADec_gain(index, code, G729A_L_SUBFR, bfi, &G729A_gain_pitch, &G729A_gain_code);

    G729A_sharp = G729A_gain_pitch;
    
    if (G729Asub_s(G729A_sharp, G729A_SHARPMAX) > 0) { G729A_sharp = G729A_SHARPMAX;  }
    if (G729Asub_s(G729A_sharp, G729A_SHARPMIN) < 0) { G729A_sharp = G729A_SHARPMIN;  }
    
    for (i = 0; i < G729A_L_SUBFR;  i++)
    {
       L_temp = G729AL_mult(G729A_exc[i+i_subfr], G729A_gain_pitch);
       L_temp = G729AL_mac(L_temp, code[i], G729A_gain_code);
       L_temp = G729AL_shl(L_temp, 1);
       G729A_exc[i+i_subfr] = G729Around(L_temp);
    }
    G729AOverflow = 0;
    G729ASyn_filt(Az, &G729A_exc[i_subfr], &synth[i_subfr], G729A_L_SUBFR, G729A_mem_syn, 0);
    if(G729AOverflow != 0)
    {
      for(i=0; i<G729A_PIT_MAX+G729A_L_INTERPOL+G729A_L_FRAME; i++)
        G729A_old_exc[i] = G729Ashr_s(G729A_old_exc[i], 2);

      G729ASyn_filt(Az, &G729A_exc[i_subfr], &synth[i_subfr], G729A_L_SUBFR, G729A_mem_syn, 1);
    }
    else
      G729ACopy(&synth[i_subfr+G729A_L_SUBFR-G729A_M], G729A_mem_syn, G729A_M);

    Az += G729A_MP1;    
  }

  G729ACopy(&G729A_old_exc[G729A_L_FRAME], &G729A_old_exc[0], G729A_PIT_MAX+G729A_L_INTERPOL);

  return;
}

⌨️ 快捷键说明

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