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

语音压缩

开发平台:

C/C++

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