QUA_LSP.C
上传用户:meifeng08
上传日期:2013-06-18
资源大小:5304k
文件大小:10k
源码类别:

语音压缩

开发平台:

C/C++

  1. /*
  2.    ITU-T G.729A Speech Coder    ANSI-C Source Code
  3.    Version 1.1    Last modified: September 1996
  4.    Copyright (c) 1996,
  5.    AT&T, France Telecom, NTT, Universite de Sherbrooke
  6.    All rights reserved.
  7. */
  8. /*-------------------------------------------------------------------*
  9.  * Function  Qua_lsp:                                                *
  10.  *           ~~~~~~~~                                                *
  11.  *-------------------------------------------------------------------*/
  12. #include "typedef.h"
  13. #include "basic_op.h"
  14. #include "ld8a.h"
  15. #include "tab_ld8a.h"
  16. void Qua_lsp(
  17.   Word16 lsp[],       /* (i) Q15 : Unquantized LSP            */
  18.   Word16 lsp_q[],     /* (o) Q15 : Quantized LSP              */
  19.   Word16 ana[]        /* (o)     : indexes                    */
  20. )
  21. {
  22.   Word16 lsf[M], lsf_q[M];  /* domain 0.0<= lsf <PI in Q13 */
  23.   /* Convert LSPs to LSFs */
  24.   Lsp_lsf2(lsp, lsf, M);
  25.   Lsp_qua_cs(lsf, lsf_q, ana );
  26.   /* Convert LSFs to LSPs */
  27.   Lsf_lsp2(lsf_q, lsp_q, M);
  28.   return;
  29. }
  30. /* static memory */
  31. static Word16 freq_prev[MA_NP][M];    /* Q13:previous LSP vector       */
  32. static Word16 freq_prev_reset[M] = {  /* Q13:previous LSP vector(init) */
  33.   2339, 4679, 7018, 9358, 11698, 14037, 16377, 18717, 21056, 23396
  34. };     /* PI*(float)(j+1)/(float)(M+1) */
  35. void Lsp_encw_reset(
  36.   void
  37. )
  38. {
  39.   Word16 i;
  40.   for(i=0; i<MA_NP; i++)
  41.     Copy( &freq_prev_reset[0], &freq_prev[i][0], M );
  42. }
  43. void Lsp_qua_cs(
  44.   Word16 flsp_in[M],    /* (i) Q13 : Original LSP parameters    */
  45.   Word16 lspq_out[M],   /* (o) Q13 : Quantized LSP parameters   */
  46.   Word16 *code          /* (o)     : codes of the selected LSP  */
  47. )
  48. {
  49.   Word16 wegt[M];       /* Q11->normalized : weighting coefficients */
  50.   Get_wegt( flsp_in, wegt );
  51.   Relspwed( flsp_in, wegt, lspq_out, lspcb1, lspcb2, fg,
  52.     freq_prev, fg_sum, fg_sum_inv, code);
  53. }
  54. void Relspwed(
  55.   Word16 lsp[],                 /* (i) Q13 : unquantized LSP parameters */
  56.   Word16 wegt[],                /* (i) norm: weighting coefficients     */
  57.   Word16 lspq[],                /* (o) Q13 : quantized LSP parameters   */
  58.   Word16 lspcb1[][M],           /* (i) Q13 : first stage LSP codebook   */
  59.   Word16 lspcb2[][M],           /* (i) Q13 : Second stage LSP codebook  */
  60.   Word16 fg[MODE][MA_NP][M],    /* (i) Q15 : MA prediction coefficients */
  61.   Word16 freq_prev[MA_NP][M],   /* (i) Q13 : previous LSP vector        */
  62.   Word16 fg_sum[MODE][M],       /* (i) Q15 : present MA prediction coef.*/
  63.   Word16 fg_sum_inv[MODE][M],   /* (i) Q12 : inverse coef.              */
  64.   Word16 code_ana[]             /* (o)     : codes of the selected LSP  */
  65. )
  66. {
  67.   Word16 mode, j;
  68.   Word16 index, mode_index;
  69.   Word16 cand[MODE], cand_cur;
  70.   Word16 tindex1[MODE], tindex2[MODE];
  71.   Word32 L_tdist[MODE];         /* Q26 */
  72.   Word16 rbuf[M];               /* Q13 */
  73.   Word16 buf[M];                /* Q13 */
  74.   for(mode = 0; mode<MODE; mode++) {
  75.     Lsp_prev_extract(lsp, rbuf, fg[mode], freq_prev, fg_sum_inv[mode]);
  76.     Lsp_pre_select(rbuf, lspcb1, &cand_cur );
  77.     cand[mode] = cand_cur;
  78.     Lsp_select_1(rbuf, lspcb1[cand_cur], wegt, lspcb2, &index);
  79.     tindex1[mode] = index;
  80.     for( j = 0 ; j < NC ; j++ )
  81.       buf[j] = add( lspcb1[cand_cur][j], lspcb2[index][j] );
  82.     Lsp_expand_1(buf, GAP1);
  83.     Lsp_select_2(rbuf, lspcb1[cand_cur], wegt, lspcb2, &index);
  84.     tindex2[mode] = index;
  85.     for( j = NC ; j < M ; j++ )
  86.       buf[j] = add( lspcb1[cand_cur][j], lspcb2[index][j] );
  87.     Lsp_expand_2(buf, GAP1);
  88.     Lsp_expand_1_2(buf, GAP2);
  89.     Lsp_get_tdist(wegt, buf, &L_tdist[mode], rbuf, fg_sum[mode]);
  90.   }
  91.   Lsp_last_select(L_tdist, &mode_index);
  92.   code_ana[0] = shl( mode_index,NC0_B ) | cand[mode_index];
  93.   code_ana[1] = shl( tindex1[mode_index],NC1_B ) | tindex2[mode_index];
  94.   Lsp_get_quant(lspcb1, lspcb2, cand[mode_index],
  95.       tindex1[mode_index], tindex2[mode_index],
  96.       fg[mode_index], freq_prev, lspq, fg_sum[mode_index]) ;
  97.   return;
  98. }
  99. void Lsp_pre_select(
  100.   Word16 rbuf[],              /* (i) Q13 : target vetor             */
  101.   Word16 lspcb1[][M],         /* (i) Q13 : first stage LSP codebook */
  102.   Word16 *cand                /* (o)     : selected code            */
  103. )
  104. {
  105.   Word16 i, j;
  106.   Word16 tmp;                 /* Q13 */
  107.   Word32 L_dmin;              /* Q26 */
  108.   Word32 L_tmp;               /* Q26 */
  109.   Word32 L_temp;
  110.   /* avoid the worst case. (all over flow) */
  111.   *cand = 0;
  112.   L_dmin = MAX_32;
  113.   for ( i = 0 ; i < NC0 ; i++ ) {
  114.     L_tmp = 0;
  115.     for ( j = 0 ; j < M ; j++ ) {
  116.       tmp = sub(rbuf[j], lspcb1[i][j]);
  117.       L_tmp = L_mac( L_tmp, tmp, tmp );
  118.     }
  119.     L_temp = L_sub(L_tmp,L_dmin);
  120.     if (  L_temp< 0L) {
  121.       L_dmin = L_tmp;
  122.       *cand = i;
  123.     }
  124.   }
  125.   return;
  126. }
  127. void Lsp_select_1(
  128.   Word16 rbuf[],              /* (i) Q13 : target vector             */
  129.   Word16 lspcb1[],            /* (i) Q13 : first stage lsp codebook  */
  130.   Word16 wegt[],              /* (i) norm: weighting coefficients    */
  131.   Word16 lspcb2[][M],         /* (i) Q13 : second stage lsp codebook */
  132.   Word16 *index               /* (o)     : selected codebook index   */
  133. )
  134. {
  135.   Word16 j, k1;
  136.   Word16 buf[M];              /* Q13 */
  137.   Word32 L_dist;              /* Q26 */
  138.   Word32 L_dmin;              /* Q26 */
  139.   Word16 tmp,tmp2;            /* Q13 */
  140.   Word32 L_temp;
  141.   for ( j = 0 ; j < NC ; j++ )
  142.     buf[j] = sub(rbuf[j], lspcb1[j]);
  143.                    /* avoid the worst case. (all over flow) */
  144.   *index = 0;
  145.   L_dmin = MAX_32;
  146.   for ( k1 = 0 ; k1 < NC1 ; k1++ ) {
  147.     L_dist = 0;
  148.     for ( j = 0 ; j < NC ; j++ ) {
  149.       tmp = sub(buf[j], lspcb2[k1][j]);
  150.       tmp2 = mult( wegt[j], tmp );
  151.       L_dist = L_mac( L_dist, tmp2, tmp );
  152.     }
  153.     L_temp =L_sub(L_dist,L_dmin);
  154.     if ( L_temp <0L ) {
  155.       L_dmin = L_dist;
  156.       *index = k1;
  157.     }
  158.   }
  159.   return;
  160. }
  161. void Lsp_select_2(
  162.   Word16 rbuf[],              /* (i) Q13 : target vector             */
  163.   Word16 lspcb1[],            /* (i) Q13 : first stage lsp codebook  */
  164.   Word16 wegt[],              /* (i) norm: weighting coef.           */
  165.   Word16 lspcb2[][M],         /* (i) Q13 : second stage lsp codebook */
  166.   Word16 *index               /* (o)     : selected codebook index   */
  167. )
  168. {
  169.   Word16 j, k1;
  170.   Word16 buf[M];              /* Q13 */
  171.   Word32 L_dist;              /* Q26 */
  172.   Word32 L_dmin;              /* Q26 */
  173.   Word16 tmp,tmp2;            /* Q13 */
  174.   Word32 L_temp;
  175.   for ( j = NC ; j < M ; j++ )
  176.     buf[j] = sub(rbuf[j], lspcb1[j]);
  177.                             /* avoid the worst case. (all over flow) */
  178.   *index = 0;
  179.   L_dmin = MAX_32;
  180.   for ( k1 = 0 ; k1 < NC1 ; k1++ ) {
  181.     L_dist = 0;
  182.     for ( j = NC ; j < M ; j++ ) {
  183.       tmp = sub(buf[j], lspcb2[k1][j]);
  184.       tmp2 = mult( wegt[j], tmp );
  185.       L_dist = L_mac( L_dist, tmp2, tmp );
  186.     }
  187.     L_temp = L_sub(L_dist, L_dmin);
  188.     if ( L_temp <0L ) {
  189.       L_dmin = L_dist;
  190.       *index = k1;
  191.     }
  192.   }
  193.   return;
  194. }
  195. void Lsp_get_tdist(
  196.   Word16 wegt[],        /* (i) norm: weight coef.                */
  197.   Word16 buf[],         /* (i) Q13 : candidate LSP vector        */
  198.   Word32 *L_tdist,      /* (o) Q27 : distortion                  */
  199.   Word16 rbuf[],        /* (i) Q13 : target vector               */
  200.   Word16 fg_sum[]       /* (i) Q15 : present MA prediction coef. */
  201. )
  202. {
  203.   Word16 j;
  204.   Word16 tmp, tmp2;     /* Q13 */
  205.   Word32 L_acc;         /* Q25 */
  206.   *L_tdist = 0;
  207.   for ( j = 0 ; j < M ; j++ ) {
  208.     /* tmp = (buf - rbuf)*fg_sum */
  209.     tmp = sub( buf[j], rbuf[j] );
  210.     tmp = mult( tmp, fg_sum[j] );
  211.     /* *L_tdist += wegt * tmp * tmp */
  212.     L_acc = L_mult( wegt[j], tmp );
  213.     tmp2 = extract_h( L_shl( L_acc, 4 ) );
  214.     *L_tdist = L_mac( *L_tdist, tmp2, tmp );
  215.   }
  216.   return;
  217. }
  218. void Lsp_last_select(
  219.   Word32 L_tdist[],     /* (i) Q27 : distortion         */
  220.   Word16 *mode_index    /* (o)     : the selected mode  */
  221. )
  222. {
  223.     Word32 L_temp;
  224.   *mode_index = 0;
  225.   L_temp =L_sub(L_tdist[1] ,L_tdist[0]);
  226.   if (  L_temp<0L){
  227.     *mode_index = 1;
  228.   }
  229.   return;
  230. }
  231. void Get_wegt(
  232.   Word16 flsp[],    /* (i) Q13 : M LSP parameters  */
  233.   Word16 wegt[]     /* (o) Q11->norm : M weighting coefficients */
  234. )
  235. {
  236.   Word16 i;
  237.   Word16 tmp;
  238.   Word32 L_acc;
  239.   Word16 sft;
  240.   Word16 buf[M]; /* in Q13 */
  241.   buf[0] = sub( flsp[1], (PI04+8192) );           /* 8192:1.0(Q13) */
  242.   for ( i = 1 ; i < M-1 ; i++ ) {
  243.     tmp = sub( flsp[i+1], flsp[i-1] );
  244.     buf[i] = sub( tmp, 8192 );
  245.   }
  246.   buf[M-1] = sub( (PI92-8192), flsp[M-2] );
  247.   /* */
  248.   for ( i = 0 ; i < M ; i++ ) {
  249.     if ( buf[i] > 0 ){
  250.       wegt[i] = 2048;                    /* 2048:1.0(Q11) */
  251.     }
  252.     else {
  253.       L_acc = L_mult( buf[i], buf[i] );           /* L_acc in Q27 */
  254.       tmp = extract_h( L_shl( L_acc, 2 ) );       /* tmp in Q13 */
  255.       L_acc = L_mult( tmp, CONST10 );             /* L_acc in Q25 */
  256.       tmp = extract_h( L_shl( L_acc, 2 ) );       /* tmp in Q11 */
  257.       wegt[i] = add( tmp, 2048 );                 /* wegt in Q11 */
  258.     }
  259.   }
  260.   /* */
  261.   L_acc = L_mult( wegt[4], CONST12 );             /* L_acc in Q26 */
  262.   wegt[4] = extract_h( L_shl( L_acc, 1 ) );       /* wegt in Q11 */
  263.   L_acc = L_mult( wegt[5], CONST12 );             /* L_acc in Q26 */
  264.   wegt[5] = extract_h( L_shl( L_acc, 1 ) );       /* wegt in Q11 */
  265.   /* wegt: Q11 -> normalized */
  266.   tmp = 0;
  267.   for ( i = 0; i < M; i++ ) {
  268.     if ( sub(wegt[i], tmp) > 0 ) {
  269.       tmp = wegt[i];
  270.     }
  271.   }
  272.   sft = norm_s(tmp);
  273.   for ( i = 0; i < M; i++ ) {
  274.     wegt[i] = shl(wegt[i], sft);                  /* wegt in Q(11+sft) */
  275.   }
  276.   return;
  277. }