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

📄 ltp.c

📁 语音压缩和解压缩源代码。
💻 C
📖 第 1 页 / 共 2 页
字号:
      C[6]=A[2][2];      C[7]=A[1][1];      C[8]=A[0][0];#ifndef FIXED_POINT      C[6]*=.5;      C[7]*=.5;      C[8]*=.5;#endif      for (i=0;i<gain_cdbk_size;i++)      {         spx_word32_t sum=0;         spx_word16_t g0,g1,g2;         ptr = gain_cdbk+3*i;         g0=ptr[0]+32;         g1=ptr[1]+32;         g2=ptr[2]+32;         sum = ADD32(sum,MULT16_32_Q14(MULT16_16_16(g0,64),C[0]));         sum = ADD32(sum,MULT16_32_Q14(MULT16_16_16(g1,64),C[1]));         sum = ADD32(sum,MULT16_32_Q14(MULT16_16_16(g2,64),C[2]));         sum = SUB32(sum,MULT16_32_Q14(MULT16_16_16(g0,g1),C[3]));         sum = SUB32(sum,MULT16_32_Q14(MULT16_16_16(g2,g1),C[4]));         sum = SUB32(sum,MULT16_32_Q14(MULT16_16_16(g2,g0),C[5]));         sum = SUB32(sum,MULT16_32_Q15(MULT16_16_16(g0,g0),C[6]));         sum = SUB32(sum,MULT16_32_Q15(MULT16_16_16(g1,g1),C[7]));         sum = SUB32(sum,MULT16_32_Q15(MULT16_16_16(g2,g2),C[8]));         /* We could force "safe" pitch values to handle packet loss better */         if (sum>best_sum || i==0)         {            best_sum=sum;            best_cdbk=i;         }      }#ifdef FIXED_POINT      gain[0] = 32+(spx_word16_t)gain_cdbk[best_cdbk*3];      gain[1] = 32+(spx_word16_t)gain_cdbk[best_cdbk*3+1];      gain[2] = 32+(spx_word16_t)gain_cdbk[best_cdbk*3+2];#else      gain[0] = 0.015625*gain_cdbk[best_cdbk*3]  + .5;      gain[1] = 0.015625*gain_cdbk[best_cdbk*3+1]+ .5;      gain[2] = 0.015625*gain_cdbk[best_cdbk*3+2]+ .5;#endif      *cdbk_index=best_cdbk;   }#ifdef FIXED_POINT   for (i=0;i<nsf;i++)     exc[i]=SHL(MULT16_32_Q15(SHL(gain[0],7),e[2][i])+MULT16_32_Q15(SHL(gain[1],7),e[1][i])+MULT16_32_Q15(SHL(gain[2],7),e[0][i]),2);      err=0;   for (i=0;i<nsf;i++)   {      spx_sig_t perr=target[i]-SHL((MULT16_32_Q15(SHL(gain[0],7),x[2][i])+MULT16_32_Q15(SHL(gain[1],7),x[1][i])+MULT16_32_Q15(SHL(gain[2],7),x[0][i])),2);      spx_word16_t perr2 = PSHR(perr,15);      err = ADD64(err,MULT16_16(perr2,perr2));         }#else   for (i=0;i<nsf;i++)      exc[i]=gain[0]*e[2][i]+gain[1]*e[1][i]+gain[2]*e[0][i];      err=0;   for (i=0;i<nsf;i++)      err+=(target[i]-gain[2]*x[0][i]-gain[1]*x[1][i]-gain[0]*x[2][i])      * (target[i]-gain[2]*x[0][i]-gain[1]*x[1][i]-gain[0]*x[2][i]);#endif   return err;}/** Finds the best quantized 3-tap pitch predictor by analysis by synthesis */int pitch_search_3tap(spx_sig_t target[],                 /* Target vector */spx_sig_t *sw,spx_coef_t ak[],                     /* LPCs for this subframe */spx_coef_t awk1[],                   /* Weighted LPCs #1 for this subframe */spx_coef_t awk2[],                   /* Weighted LPCs #2 for this subframe */spx_sig_t exc[],                    /* Excitation */const void *par,int   start,                    /* Smallest pitch value allowed */int   end,                      /* Largest pitch value allowed */spx_word16_t pitch_coef,               /* Voicing (pitch) coefficient */int   p,                        /* Number of LPC coeffs */int   nsf,                      /* Number of samples in subframe */SpeexBits *bits,char *stack,spx_sig_t *exc2,spx_sig_t *r,int complexity,int cdbk_offset){   int i,j;   int cdbk_index, pitch=0, best_gain_index=0;   spx_sig_t *best_exc;   int best_pitch=0;   spx_word64_t err, best_err=-1;   int N;   ltp_params *params;   int *nbest;   spx_word16_t *gains;   N=complexity;   if (N>10)      N=10;   nbest=PUSH(stack, N, int);   gains = PUSH(stack, N, spx_word16_t);   params = (ltp_params*) par;   if (N==0 || end<start)   {      speex_bits_pack(bits, 0, params->pitch_bits);      speex_bits_pack(bits, 0, params->gain_bits);      for (i=0;i<nsf;i++)         exc[i]=0;      return start;   }      best_exc=PUSH(stack,nsf, spx_sig_t);      if (N>end-start+1)      N=end-start+1;   open_loop_nbest_pitch(sw, start, end, nsf, nbest, gains, N, stack);   for (i=0;i<N;i++)   {      pitch=nbest[i];      for (j=0;j<nsf;j++)         exc[j]=0;      err=pitch_gain_search_3tap(target, ak, awk1, awk2, exc, par, pitch, p, nsf,                                 bits, stack, exc2, r, &cdbk_index, cdbk_offset);      if (err<best_err || best_err<0)      {         for (j=0;j<nsf;j++)            best_exc[j]=exc[j];         best_err=err;         best_pitch=pitch;         best_gain_index=cdbk_index;      }   }      /*printf ("pitch: %d %d\n", best_pitch, best_gain_index);*/   speex_bits_pack(bits, best_pitch-start, params->pitch_bits);   speex_bits_pack(bits, best_gain_index, params->gain_bits);   /*printf ("encode pitch: %d %d\n", best_pitch, best_gain_index);*/   for (i=0;i<nsf;i++)      exc[i]=best_exc[i];   return pitch;}void pitch_unquant_3tap(spx_sig_t exc[],                    /* Excitation */int   start,                    /* Smallest pitch value allowed */int   end,                      /* Largest pitch value allowed */spx_word16_t pitch_coef,               /* Voicing (pitch) coefficient */const void *par,int   nsf,                      /* Number of samples in subframe */int *pitch_val,spx_word16_t *gain_val,SpeexBits *bits,char *stack,int count_lost,int subframe_offset,spx_word16_t last_pitch_gain,int cdbk_offset){   int i;   int pitch;   int gain_index;   spx_word16_t gain[3];   const signed char *gain_cdbk;   int gain_cdbk_size;   ltp_params *params;   params = (ltp_params*) par;   gain_cdbk_size = 1<<params->gain_bits;   gain_cdbk = params->gain_cdbk + 3*gain_cdbk_size*cdbk_offset;   pitch = speex_bits_unpack_unsigned(bits, params->pitch_bits);   pitch += start;   gain_index = speex_bits_unpack_unsigned(bits, params->gain_bits);   /*printf ("decode pitch: %d %d\n", pitch, gain_index);*/#ifdef FIXED_POINT   gain[0] = 32+(spx_word16_t)gain_cdbk[gain_index*3];   gain[1] = 32+(spx_word16_t)gain_cdbk[gain_index*3+1];   gain[2] = 32+(spx_word16_t)gain_cdbk[gain_index*3+2];#else   gain[0] = 0.015625*gain_cdbk[gain_index*3]+.5;   gain[1] = 0.015625*gain_cdbk[gain_index*3+1]+.5;   gain[2] = 0.015625*gain_cdbk[gain_index*3+2]+.5;#endif   if (count_lost && pitch > subframe_offset)   {      float gain_sum;      if (1) {	 float tmp = count_lost < 4 ? GAIN_SCALING_1*last_pitch_gain : 0.4 * GAIN_SCALING_1 * last_pitch_gain;         if (tmp>.95)            tmp=.95;         gain_sum = GAIN_SCALING_1*gain_3tap_to_1tap(gain);	 if (gain_sum > tmp) {	    float fact = tmp/gain_sum;	    for (i=0;i<3;i++)	       gain[i]*=fact;	 }      }   }   *pitch_val = pitch;   gain_val[0]=gain[0];   gain_val[1]=gain[1];   gain_val[2]=gain[2];   {      spx_sig_t *e[3];      spx_sig_t *tmp2;      tmp2=PUSH(stack, 3*nsf, spx_sig_t);      e[0]=tmp2;      e[1]=tmp2+nsf;      e[2]=tmp2+2*nsf;            for (i=0;i<3;i++)      {         int j;         int pp=pitch+1-i;#if 0         for (j=0;j<nsf;j++)         {            if (j-pp<0)               e[i][j]=exc[j-pp];            else if (j-pp-pitch<0)               e[i][j]=exc[j-pp-pitch];            else               e[i][j]=0;         }#else         {            int tmp1, tmp3;            tmp1=nsf;            if (tmp1>pp)               tmp1=pp;            for (j=0;j<tmp1;j++)               e[i][j]=exc[j-pp];            tmp3=nsf;            if (tmp3>pp+pitch)               tmp3=pp+pitch;            for (j=tmp1;j<tmp3;j++)               e[i][j]=exc[j-pp-pitch];            for (j=tmp3;j<nsf;j++)               e[i][j]=0;         }#endif      }#ifdef FIXED_POINT      {         for (i=0;i<nsf;i++)            exc[i]=SHL(MULT16_32_Q15(SHL(gain[0],7),e[2][i])+MULT16_32_Q15(SHL(gain[1],7),e[1][i])+MULT16_32_Q15(SHL(gain[2],7),e[0][i]),2);      }#else      for (i=0;i<nsf;i++)         exc[i]=gain[0]*e[2][i]+gain[1]*e[1][i]+gain[2]*e[0][i];#endif   }}/** Forced pitch delay and gain */int forced_pitch_quant(spx_sig_t target[],                 /* Target vector */spx_sig_t *sw,spx_coef_t ak[],                     /* LPCs for this subframe */spx_coef_t awk1[],                   /* Weighted LPCs #1 for this subframe */spx_coef_t awk2[],                   /* Weighted LPCs #2 for this subframe */spx_sig_t exc[],                    /* Excitation */const void *par,int   start,                    /* Smallest pitch value allowed */int   end,                      /* Largest pitch value allowed */spx_word16_t pitch_coef,               /* Voicing (pitch) coefficient */int   p,                        /* Number of LPC coeffs */int   nsf,                      /* Number of samples in subframe */SpeexBits *bits,char *stack,spx_sig_t *exc2,spx_sig_t *r,int complexity,int cdbk_offset){   int i;   float coef = GAIN_SCALING_1*pitch_coef;   if (coef>.99)      coef=.99;   for (i=0;i<nsf;i++)   {      exc[i]=exc[i-start]*coef;   }   return start;}/** Unquantize forced pitch delay and gain */void forced_pitch_unquant(spx_sig_t exc[],                    /* Excitation */int   start,                    /* Smallest pitch value allowed */int   end,                      /* Largest pitch value allowed */spx_word16_t pitch_coef,               /* Voicing (pitch) coefficient */const void *par,int   nsf,                      /* Number of samples in subframe */int *pitch_val,spx_word16_t *gain_val,SpeexBits *bits,char *stack,int count_lost,int subframe_offset,spx_word16_t last_pitch_gain,int cdbk_offset){   int i;   float coef = GAIN_SCALING_1*pitch_coef;   if (coef>.99)      coef=.99;   for (i=0;i<nsf;i++)   {      exc[i]=exc[i-start]*coef;   }   *pitch_val = start;   gain_val[0]=gain_val[2]=0;   gain_val[1] = pitch_coef;}

⌨️ 快捷键说明

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