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

语音压缩

开发平台:

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. #include <stdio.h>
  9. #include "typedef.h"
  10. #include "basic_op.h"
  11. #include "ld8a.h"
  12. void Lsp_get_quant(
  13.   Word16 lspcb1[][M],      /* (i) Q13 : first stage LSP codebook      */
  14.   Word16 lspcb2[][M],      /* (i) Q13 : Second stage LSP codebook     */
  15.   Word16 code0,            /* (i)     : selected code of first stage  */
  16.   Word16 code1,            /* (i)     : selected code of second stage */
  17.   Word16 code2,            /* (i)     : selected code of second stage */
  18.   Word16 fg[][M],          /* (i) Q15 : MA prediction coef.           */
  19.   Word16 freq_prev[][M],   /* (i) Q13 : previous LSP vector           */
  20.   Word16 lspq[],           /* (o) Q13 : quantized LSP parameters      */
  21.   Word16 fg_sum[]          /* (i) Q15 : present MA prediction coef.   */
  22. )
  23. {
  24.   Word16 j;
  25.   Word16 buf[M];           /* Q13 */
  26.   for ( j = 0 ; j < NC ; j++ )
  27.     buf[j] = add( lspcb1[code0][j], lspcb2[code1][j] );
  28.   for ( j = NC ; j < M ; j++ )
  29.     buf[j] = add( lspcb1[code0][j], lspcb2[code2][j] );
  30.   Lsp_expand_1_2(buf, GAP1);
  31.   Lsp_expand_1_2(buf, GAP2);
  32.   Lsp_prev_compose(buf, lspq, fg, freq_prev, fg_sum);
  33.   Lsp_prev_update(buf, freq_prev);
  34.   Lsp_stability( lspq );
  35.   return;
  36. }
  37. void Lsp_expand_1(
  38.   Word16 buf[],        /* (i/o) Q13 : LSP vectors */
  39.   Word16 gap           /* (i)   Q13 : gap         */
  40. )
  41. {
  42.   Word16 j, tmp;
  43.   Word16 diff;        /* Q13 */
  44.   for ( j = 1 ; j < NC ; j++ ) {
  45.     diff = sub( buf[j-1], buf[j] );
  46.     tmp = shr( add( diff, gap), 1 );
  47.     if ( tmp >  0 ) {
  48.       buf[j-1] = sub( buf[j-1], tmp );
  49.       buf[j]   = add( buf[j], tmp );
  50.     }
  51.   }
  52.   return;
  53. }
  54. void Lsp_expand_2(
  55.   Word16 buf[],       /* (i/o) Q13 : LSP vectors */
  56.   Word16 gap          /* (i)   Q13 : gap         */
  57. )
  58. {
  59.   Word16 j, tmp;
  60.   Word16 diff;        /* Q13 */
  61.   for ( j = NC ; j < M ; j++ ) {
  62.     diff = sub( buf[j-1], buf[j] );
  63.     tmp = shr( add( diff, gap), 1 );
  64.     if ( tmp > 0 ) {
  65.       buf[j-1] = sub( buf[j-1], tmp );
  66.       buf[j]   = add( buf[j], tmp );
  67.     }
  68.   }
  69.   return;
  70. }
  71. void Lsp_expand_1_2(
  72.   Word16 buf[],       /* (i/o) Q13 : LSP vectors */
  73.   Word16 gap          /* (i)   Q13 : gap         */
  74. )
  75. {
  76.   Word16 j, tmp;
  77.   Word16 diff;        /* Q13 */
  78.   for ( j = 1 ; j < M ; j++ ) {
  79.     diff = sub( buf[j-1], buf[j] );
  80.     tmp = shr( add( diff, gap), 1 );
  81.     if ( tmp > 0 ) {
  82.       buf[j-1] = sub( buf[j-1], tmp );
  83.       buf[j]   = add( buf[j], tmp );
  84.     }
  85.   }
  86.   return;
  87. }
  88. /*
  89.   Functions which use previous LSP parameter (freq_prev).
  90. */
  91. /*
  92.   compose LSP parameter from elementary LSP with previous LSP.
  93. */
  94. void Lsp_prev_compose(
  95.   Word16 lsp_ele[],             /* (i) Q13 : LSP vectors                 */
  96.   Word16 lsp[],                 /* (o) Q13 : quantized LSP parameters    */
  97.   Word16 fg[][M],               /* (i) Q15 : MA prediction coef.         */
  98.   Word16 freq_prev[][M],        /* (i) Q13 : previous LSP vector         */
  99.   Word16 fg_sum[]               /* (i) Q15 : present MA prediction coef. */
  100. )
  101. {
  102.   Word16 j, k;
  103.   Word32 L_acc;                 /* Q29 */
  104.   for ( j = 0 ; j < M ; j++ ) {
  105.     L_acc = L_mult( lsp_ele[j], fg_sum[j] );
  106.     for ( k = 0 ; k < MA_NP ; k++ )
  107.       L_acc = L_mac( L_acc, freq_prev[k][j], fg[k][j] );
  108.     lsp[j] = extract_h(L_acc);
  109.   }
  110.   return;
  111. }
  112. /*
  113.   extract elementary LSP from composed LSP with previous LSP
  114. */
  115. void Lsp_prev_extract(
  116.   Word16 lsp[M],                /* (i) Q13 : unquantized LSP parameters  */
  117.   Word16 lsp_ele[M],            /* (o) Q13 : target vector               */
  118.   Word16 fg[MA_NP][M],          /* (i) Q15 : MA prediction coef.         */
  119.   Word16 freq_prev[MA_NP][M],   /* (i) Q13 : previous LSP vector         */
  120.   Word16 fg_sum_inv[M]          /* (i) Q12 : inverse previous LSP vector */
  121. )
  122. {
  123.   Word16 j, k;
  124.   Word32 L_temp;                /* Q19 */
  125.   Word16 temp;                  /* Q13 */
  126.   for ( j = 0 ; j < M ; j++ ) {
  127.     L_temp = L_deposit_h(lsp[j]);
  128.     for ( k = 0 ; k < MA_NP ; k++ )
  129.       L_temp = L_msu( L_temp, freq_prev[k][j], fg[k][j] );
  130.     temp = extract_h(L_temp);
  131.     L_temp = L_mult( temp, fg_sum_inv[j] );
  132.     lsp_ele[j] = extract_h( L_shl( L_temp, 3 ) );
  133.   }
  134.   return;
  135. }
  136. /*
  137.   update previous LSP parameter
  138. */
  139. void Lsp_prev_update(
  140.   Word16 lsp_ele[M],             /* (i)   Q13 : LSP vectors           */
  141.   Word16 freq_prev[MA_NP][M]     /* (i/o) Q13 : previous LSP vectors  */
  142. )
  143. {
  144.   Word16 k;
  145.   for ( k = MA_NP-1 ; k > 0 ; k-- )
  146.     Copy(freq_prev[k-1], freq_prev[k], M);
  147.   Copy(lsp_ele, freq_prev[0], M);
  148.   return;
  149. }
  150. void Lsp_stability(
  151.   Word16 buf[]       /* (i/o) Q13 : quantized LSP parameters      */
  152. )
  153. {
  154.   Word16 j;
  155.   Word16 tmp;
  156.   Word32 L_diff;
  157.   Word32 L_acc, L_accb;
  158.   for(j=0; j<M-1; j++) {
  159.     L_acc = L_deposit_l( buf[j+1] );
  160.     L_accb = L_deposit_l( buf[j] );
  161.     L_diff = L_sub( L_acc, L_accb );
  162.     if( L_diff < 0L ) {
  163.       /* exchange buf[j]<->buf[j+1] */
  164.       tmp      = buf[j+1];
  165.       buf[j+1] = buf[j];
  166.       buf[j]   = tmp;
  167.     }
  168.   }
  169.   if( sub(buf[0], L_LIMIT) <0 ) {
  170.     buf[0] = L_LIMIT;
  171.     printf("lsp_stability warning Low n");
  172.   }
  173.   for(j=0; j<M-1; j++) {
  174.     L_acc = L_deposit_l( buf[j+1] );
  175.     L_accb = L_deposit_l( buf[j] );
  176.     L_diff = L_sub( L_acc, L_accb );
  177.     if( L_sub(L_diff, GAP3)<0L ) {
  178.       buf[j+1] = add( buf[j], GAP3 );
  179.     }
  180.   }
  181.   if( sub(buf[M-1],M_LIMIT)>0 ) {
  182.     buf[M-1] = M_LIMIT;
  183.     printf("lsp_stability warning High n");
  184.   }
  185.   return;
  186. }