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

📄 cod_ld8a.c

📁 ITU 标准C写的G729代码,未优化,对照汇编学习,请勿用于商业目的
💻 C
📖 第 1 页 / 共 2 页
字号:
    /* update the LSPs for the next frame */
    Copy(lsp_new,   lsp_old,   M);
    Copy(lsp_new_q, lsp_old_q, M);
  }

 /*----------------------------------------------------------------------*
  * - Find the weighted input speech w_sp[] for the whole speech frame   *
  * - Find the open-loop pitch delay                                     *
  *----------------------------------------------------------------------*/

  Residu(&Aq_t[0], &speech[0], &exc[0], L_SUBFR);
// for(j1=0;j1<L_SUBFR;j1++)
// {
//    temp1[j1]=speech[j1];
// }
// for(j1=0;j1<L_SUBFR;j1++)
// {
//    temp1[j1]=exc[j1];
// }
// for(t=0,j1=0;j1<L_SUBFR;j1++)
// {
//	sprintf(&st[t],"%04x\n",(unsigned short)exc[j1]);
//  t=strlen(st);
// }
// fwrite(st,sizeof(char),strlen(st),out_stream3);

  Residu(&Aq_t[MP1], &speech[L_SUBFR], &exc[L_SUBFR], L_SUBFR);
// for(j1=L_SUBFR;j1<L_SUBFR+L_SUBFR;j1++)
// {
//    temp1[j1-L_SUBFR]=speech[j1];
// }
// for(j1=L_SUBFR;j1<L_SUBFR+L_SUBFR;j1++)
// {
//    temp2[j1-L_SUBFR]=exc[j1];
// }
//  for(t=0,j1=L_SUBFR;j1<L_SUBFR+L_SUBFR;j1++)
//  {
//	  sprintf(&st[t],"%04x\n",(unsigned short)exc[j1]);
//    t=strlen(st);
//  }
//  fwrite(st,sizeof(char),strlen(st),out_stream3);


  {
    Word16 Ap1[MP1];

    Ap = Ap_t;
    Ap1[0] = 4096;
    for(i=1; i<=M; i++)    /* Ap1[i] = Ap[i] - 0.7 * Ap[i-1]; */
       Ap1[i] = sub(Ap[i], mult(Ap[i-1], 22938));
  
//  for(j1=0;j1<=M;j1++)temp1[j1]=Ap[j1];
//  for(t=0,j1=0;j1<M+1;j1++)
//  {
//    Sprintf(&st[t],"%04x\n",(unsigned short)Ap1[j1]);
//    t=strlen(st);
//  }
//  fwrite(st,sizeof(char),strlen(st),out_stream2);

    Syn_filt(Ap1, &exc[0], &wsp[0], L_SUBFR, mem_w, 1);
//  for(j1=0;j1<=L_SUBFR;j1++)tempx[j1]=exc[j1];
//  for(j1=0;j1<=L_SUBFR;j1++)tempy[j1]=wsp[j1];
//  for(t=0,j1=0;j1<L_SUBFR;j1++)
//  {
//	sprintf(&st[t],"%04x\n",(unsigned short)wsp[j1]);
//	t=strlen(st);
//	}
//	fwrite(st,sizeof(char),strlen(st),out_stream3);

    Ap += MP1;
    for(i=1; i<=M; i++)    /* Ap1[i] = Ap[i] - 0.7 * Ap[i-1]; */
       Ap1[i] = sub(Ap[i], mult(Ap[i-1], 22938));
//  for(j1=0;j1<=M;j1++)temp1[j1]=Ap[j1];
//  for(t=0,j1=0;j1<M+1;j1++)
//  {
//	  sprintf(&st[t],"%04x\n",(unsigned short)Ap1[j1]);
//    t=strlen(st);
//  }
//  fwrite(st,sizeof(char),strlen(st),out_stream2);
    
	Syn_filt(Ap1, &exc[L_SUBFR], &wsp[L_SUBFR], L_SUBFR, mem_w, 1);
//  for(j1=L_SUBFR;j1<=L_SUBFR+L_SUBFR;j1++)tempx[j1-L_SUBFR]=exc[j1];
//  for(j1=L_SUBFR;j1<=L_SUBFR+L_SUBFR;j1++)tempy[j1-L_SUBFR]=wsp[j1];
//  for(t=0,j1=L_SUBFR;j1<L_SUBFR+L_SUBFR;j1++)
//  {
//	sprintf(&st[t],"%04x\n",(unsigned short)wsp[j1]);
//	t=strlen(st);
//  }
//  fwrite(st,sizeof(char),strlen(st),out_stream3);

  }





//  Find open loop pitch lag 

  T_op = Pitch_ol_fast(wsp, PIT_MAX, L_FRAME);

  {
	t=0; 
    sprintf(&st[t],"%04x\n",(unsigned short)T_op);
    t=strlen(st);
	fwrite(st,sizeof(char),strlen(st),out_stream3);
  }


  
//   Range for closed loop pitch search in 1st subframe 

  T0_min = sub(T_op, 3);
  if (sub(T0_min,PIT_MIN)<0) {
    T0_min = PIT_MIN;
  }

  T0_max = add(T0_min, 6);
  if (sub(T0_max ,PIT_MAX)>0)
  {
     T0_max = PIT_MAX;
     T0_min = sub(T0_max, 6);
  }


//  *------------------------------------------------------------------------*
//  *          Loop for every subframe in the analysis frame                 *
//  *------------------------------------------------------------------------*
//  *  To find the pitch and innovation parameters. The subframe size is     *
//  *  L_SUBFR and the loop is repeated 2 times.                             *
//  *     - find the weighted LPC coefficients                               *
//  *     - find the LPC residual signal res[]                               *
//  *     - compute the target signal for pitch search                       *
//  *     - compute impulse response of weighted synthesis filter (h1[])     *
//  *     - find the closed-loop pitch parameters                            *
//  *     - encode the pitch delay                                           *
//  *     - find target vector for codebook search                           *
//  *     - codebook search                                                  *
//  *     - VQ of pitch and codebook gains                                   *
//  *     - update states of weighting filter                                *
//  *------------------------------------------------------------------------*

  Aq = Aq_t;    // pointer to interpolated quantized LPC parameters 
  Ap = Ap_t;    // pointer to weighted LPC coefficients             

  for (i_subfr = 0;  i_subfr < L_FRAME; i_subfr += L_SUBFR)
  {

//     *---------------------------------------------------------------*
//     * Compute impulse response, h1[], of weighted synthesis filter  *
//     *---------------------------------------------------------------*

    h1[0] = 4096;
    Set_zero(&h1[1], L_SUBFR-1);

//    for(t=0,j1=0;j1<L_SUBFR;j1++)temp1[j1]=h1[j1];

    Syn_filt(Ap, h1, h1, L_SUBFR, &h1[1], 0);

    for(t=0,j1=0;j1<L_SUBFR;j1++)tempy[j1]=h1[j1];

//    *----------------------------------------------------------------------*
//    *  Find the target vector for pitch search:                            *
//    *----------------------------------------------------------------------*
    for(t=0,j1=0;j1<M+1;j1++)temp1[j1]=Ap[j1];
    for(t=0,j1=0;j1<L_SUBFR;j1++)tempx[j1]=exc[j1+i_subfr];

    Syn_filt(Ap, &exc[i_subfr], xn, L_SUBFR, mem_w0, 0);

    for(t=0,j1=0;j1<L_SUBFR;j1++)tempy[j1]=xn[j1];
//     *---------------------------------------------------------------------*
//     *                 Closed-loop fractional pitch search                 *
//     *---------------------------------------------------------------------*

    T0 = Pitch_fr3_fast(&exc[i_subfr], xn, h1, L_SUBFR, T0_min, T0_max,
                    i_subfr, &T0_frac);

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

    *ana++ = index;

    if (i_subfr == 0) {
      *ana++ = Parity_Pitch(index);
    }

//    *-----------------------------------------------------------------*
//    *   - find filtered pitch exc                                     *
//    *   - compute pitch gain and limit between 0 and 1.2              *
//    *   - update target vector for codebook search                    *
//    *-----------------------------------------------------------------*

    Syn_filt(Ap, &exc[i_subfr], y1, L_SUBFR, mem_zero, 0);

    gain_pit = G_pitch(xn, y1, g_coeff, L_SUBFR);

//     clip pitch gain if taming is necessary 

    taming = test_err(T0, T0_frac);

    if( taming == 1){
      if (sub(gain_pit, GPCLIP) > 0) {
        gain_pit = GPCLIP;
      }
    }

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

    for (i = 0; i < L_SUBFR; i++)
    {
      L_temp = L_mult(y1[i], gain_pit);
      L_temp = L_shl(L_temp, 1);               // gain_pit in Q14 
      xn2[i] = sub(xn[i], extract_h(L_temp));
    }


//    *-----------------------------------------------------*
//    * - Innovative codebook search.                       *
//    *-----------------------------------------------------*

    index = ACELP_Code_A(xn2, h1, T0, sharp, code, y2, &i);

    *ana++ = index;        // Positions index 
    *ana++ = i;            // Signs index     


//    *-----------------------------------------------------*
//    * - Quantization of gains.                            *
//    *-----------------------------------------------------*

    g_coeff_cs[0]     = g_coeff[0];            // <y1,y1> 
    exp_g_coeff_cs[0] = negate(g_coeff[1]);    // Q-Format:XXX -> JPN 
    g_coeff_cs[1]     = negate(g_coeff[2]);    // (xn,y1) -> -2<xn,y1> 
    exp_g_coeff_cs[1] = negate(add(g_coeff[3], 1)); // Q-Format:XXX -> JPN *

    Corr_xy2( xn, y1, y2, g_coeff_cs, exp_g_coeff_cs );  // Q0 Q0 Q12 ^Qx ^Q0 
                         // g_coeff_cs[3]:exp_g_coeff_cs[3] = <y2,y2>   
                         // g_coeff_cs[4]:exp_g_coeff_cs[4] = -2<xn,y2> 
                         // g_coeff_cs[5]:exp_g_coeff_cs[5] = 2<y1,y2>  

    *ana++ = Qua_gain(code, g_coeff_cs, exp_g_coeff_cs,
                         L_SUBFR, &gain_pit, &gain_code, taming);


 //   *------------------------------------------------------------*
 //   * - Update pitch sharpening "sharp" with quantized gain_pit  *
 //   *------------------------------------------------------------*

    sharp = gain_pit;
    if (sub(sharp, SHARPMAX) > 0) { sharp = SHARPMAX;         }
    if (sub(sharp, SHARPMIN) < 0) { sharp = SHARPMIN;         }

//    *------------------------------------------------------*
//    * - Find the total excitation                          *
//    * - update filters memories for finding the target     *
//    *   vector in the next subframe                        *
//    *------------------------------------------------------*

    for (i = 0; i < L_SUBFR;  i++)
    {
      // exc[i] = gain_pit*exc[i] + gain_code*code[i]; 
      // exc[i]  in Q0   gain_pit in Q14               
      // code[i] in Q13  gain_cod in Q1                

      L_temp = L_mult(exc[i+i_subfr], gain_pit);
      L_temp = L_mac(L_temp, code[i], gain_code);
      L_temp = L_shl(L_temp, 1);
      exc[i+i_subfr] = round(L_temp);
    }

    update_exc_err(gain_pit, T0);

    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));
    }

    Aq += MP1;           // interpolated LPC parameters for next subframe 
    Ap += MP1;

  }

//  *--------------------------------------------------*
//  * Update signal for next frame.                    *
//  * -> shift to the left by L_FRAME:                 *
//  *     speech[], wsp[] and  exc[]                   *
//  *--------------------------------------------------*

  Copy(&old_speech[L_FRAME], &old_speech[0], L_TOTAL-L_FRAME);
  Copy(&old_wsp[L_FRAME], &old_wsp[0], PIT_MAX);
  Copy(&old_exc[L_FRAME], &old_exc[0], PIT_MAX+L_INTERPOL);


//  for(t=0,j1=0;j1<L_FRAME;j1++)
//  {
//	sprintf(&st[t],"%04x\n",(unsigned short)xn[j1]);
//	t=strlen(st);
//  }
//  fwrite(st,sizeof(char),strlen(st),out_stream3);


  return;
}

⌨️ 快捷键说明

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