lspgetq.c
上传用户:zhouyunkk
上传日期:2013-01-10
资源大小:59k
文件大小:7k
源码类别:

语音压缩

开发平台:

C/C++

  1. /*
  2.    ITU-T G.729 Annex C - Reference C code for floating point
  3.                          implementation of G.729
  4.                          Version 1.01 of 15.September.98
  5. */
  6. /*
  7. ----------------------------------------------------------------------
  8.                     COPYRIGHT NOTICE
  9. ----------------------------------------------------------------------
  10.    ITU-T G.729 Annex C ANSI C source code
  11.    Copyright (C) 1998, AT&T, France Telecom, NTT, University of
  12.    Sherbrooke.  All rights reserved.
  13. ----------------------------------------------------------------------
  14. */
  15. /*
  16.  File : LSPGETQ.C
  17.  Used for the floating point version of both
  18.  G.729 main body and G.729A
  19. */
  20. #include "typedef.h"
  21. #include "version.h"
  22. #ifdef VER_G729A
  23.  #include "ld8a.h"
  24. #else
  25.  #include "ld8k.h"
  26. #endif
  27. /* Prototype definitions of static functions */
  28. static void lsp_stability(
  29.  FLOAT  buf[]           /*in/out: LSP parameters  */
  30. );
  31. static void lsp_prev_compose(
  32.   FLOAT lsp_ele[],
  33.   FLOAT lsp[],
  34.   FLOAT fg[][M],
  35.   FLOAT freq_prev[][M],
  36.   FLOAT fg_sum[]
  37. );
  38. /*----------------------------------------------------------------------------
  39.  * lsp_get_quant - reconstruct quantized LSP parameter and check the stabilty
  40.  *----------------------------------------------------------------------------
  41.  */
  42. void lsp_get_quant(
  43.  FLOAT  lspcb1[][M],    /*input : first stage LSP codebook     */
  44.  FLOAT  lspcb2[][M],    /*input : Second stage LSP codebook    */
  45.  int    code0,          /*input : selected code of first stage */
  46.  int    code1,          /*input : selected code of second stage*/
  47.  int    code2,          /*input : selected code of second stage*/
  48.  FLOAT  fg[][M],        /*input : MA prediction coef.          */
  49.  FLOAT  freq_prev[][M], /*input : previous LSP vector          */
  50.  FLOAT  lspq[],         /*output: quantized LSP parameters     */
  51.  FLOAT  fg_sum[]        /*input : present MA prediction coef.  */
  52. )
  53. {
  54.    int  j;
  55.    FLOAT  buf[M];
  56.    for(j=0; j<NC; j++)
  57.      buf[j] = lspcb1[code0][j] + lspcb2[code1][j];
  58.    for(j=NC; j<M; j++)
  59.      buf[j] = lspcb1[code0][j] + lspcb2[code2][j];
  60.    /* check */
  61.    lsp_expand_1_2(buf, GAP1);
  62.    lsp_expand_1_2(buf, GAP2);
  63.    /* reconstruct quantized LSP parameters */
  64.    lsp_prev_compose(buf, lspq, fg, freq_prev, fg_sum);
  65.    lsp_prev_update(buf, freq_prev);
  66.    lsp_stability( lspq );  /* check the stabilty */
  67.    return;
  68. }
  69. /*----------------------------------------------------------------------------
  70.  * lsp_expand_1  - check for lower (0-4)
  71.  *----------------------------------------------------------------------------
  72.  */
  73. void lsp_expand_1(
  74.  FLOAT  buf[],          /* in/out: lsp vectors  */
  75.  FLOAT gap
  76. )
  77. {
  78.    int   j;
  79.    FLOAT diff, tmp;
  80.    for(j=1; j<NC; j++) {
  81.       diff = buf[j-1] - buf[j];
  82.       tmp  = (diff + gap) * (F)0.5;
  83.       if(tmp >  0) {
  84.          buf[j-1] -= tmp;
  85.          buf[j]   += tmp;
  86.       }
  87.    }
  88.     return;
  89. }
  90. /*----------------------------------------------------------------------------
  91.  * lsp_expand_2 - check for higher (5-9)
  92.  *----------------------------------------------------------------------------
  93.  */
  94. void lsp_expand_2(
  95.  FLOAT  buf[],          /*in/out: lsp vectors  */
  96.  FLOAT gap
  97. )
  98. {
  99.    int   j;
  100.    FLOAT diff, tmp;
  101.    for(j=NC; j<M; j++) {
  102.       diff = buf[j-1] - buf[j];
  103.       tmp  = (diff + gap) * (F)0.5;
  104.       if(tmp >  0) {
  105.          buf[j-1] -= tmp;
  106.          buf[j]   += tmp;
  107.       }
  108.    }
  109.     return;
  110. }
  111. /*----------------------------------------------------------------------------
  112.  * lsp_expand_1_2 - ..
  113.  *----------------------------------------------------------------------------
  114.  */
  115. void lsp_expand_1_2(
  116.  FLOAT  buf[],          /*in/out: LSP parameters  */
  117.  FLOAT  gap             /*input      */
  118. )
  119. {
  120.    int   j;
  121.    FLOAT diff, tmp;
  122.    for(j=1; j<M; j++) {
  123.       diff = buf[j-1] - buf[j];
  124.       tmp  = (diff + gap) * (F)0.5;
  125.       if(tmp >  0) {
  126.          buf[j-1] -= tmp;
  127.          buf[j]   += tmp;
  128.       }
  129.    }
  130.    return;
  131. }
  132. /*
  133.   Functions which use previous LSP parameter (freq_prev).
  134. */
  135. /*
  136.   compose LSP parameter from elementary LSP with previous LSP.
  137. */
  138. static void lsp_prev_compose(
  139.   FLOAT lsp_ele[],             /* (i) Q13 : LSP vectors                 */
  140.   FLOAT lsp[],                 /* (o) Q13 : quantized LSP parameters    */
  141.   FLOAT fg[][M],               /* (i) Q15 : MA prediction coef.         */
  142.   FLOAT freq_prev[][M],        /* (i) Q13 : previous LSP vector         */
  143.   FLOAT fg_sum[]               /* (i) Q15 : present MA prediction coef. */
  144. )
  145. {
  146.    int j, k;
  147.    for(j=0; j<M; j++) {
  148.       lsp[j] = lsp_ele[j] * fg_sum[j];
  149.       for(k=0; k<MA_NP; k++) lsp[j] += freq_prev[k][j]*fg[k][j];
  150.    }
  151.    return;
  152. }
  153. /*
  154.   extract elementary LSP from composed LSP with previous LSP
  155. */
  156. void lsp_prev_extract(
  157.   FLOAT lsp[M],                /* (i) Q13 : unquantized LSP parameters  */
  158.   FLOAT lsp_ele[M],            /* (o) Q13 : target vector               */
  159.   FLOAT fg[MA_NP][M],          /* (i) Q15 : MA prediction coef.         */
  160.   FLOAT freq_prev[MA_NP][M],   /* (i) Q13 : previous LSP vector         */
  161.   FLOAT fg_sum_inv[M]          /* (i) Q12 : inverse previous LSP vector */
  162. )
  163. {
  164.   int j, k;
  165.   /*----- compute target vectors for each MA coef.-----*/
  166.   for( j = 0 ; j < M ; j++ ) {
  167.       lsp_ele[j]=lsp[j];
  168.       for ( k = 0 ; k < MA_NP ; k++ )
  169.          lsp_ele[j] -= freq_prev[k][j] * fg[k][j];
  170.       lsp_ele[j] *= fg_sum_inv[j];
  171.    }
  172.    return;
  173. }
  174. /*
  175.   update previous LSP parameter
  176. */
  177. void lsp_prev_update(
  178.   FLOAT lsp_ele[M],             /* input : LSP vectors           */
  179.   FLOAT freq_prev[MA_NP][M]     /* input/output: previous LSP vectors  */
  180. )
  181. {
  182.   int k;
  183.   for ( k = MA_NP-1 ; k > 0 ; k-- )
  184.     copy(freq_prev[k-1], freq_prev[k], M);
  185.   copy(lsp_ele, freq_prev[0], M);
  186.   return;
  187. }
  188. /*----------------------------------------------------------------------------
  189.  * lsp_stability - check stability of lsp coefficients
  190.  *----------------------------------------------------------------------------
  191.  */
  192. static void lsp_stability(
  193.  FLOAT  buf[]           /*in/out: LSP parameters  */
  194. )
  195. {
  196.    int   j;
  197.    FLOAT diff, tmp;
  198.    for(j=0; j<M-1; j++) {
  199.       diff = buf[j+1] - buf[j];
  200.       if( diff < (F)0. ) {
  201.          tmp      = buf[j+1];
  202.          buf[j+1] = buf[j];
  203.          buf[j]   = tmp;
  204.       }
  205.    }
  206.    if( buf[0] < L_LIMIT ) {
  207.       buf[0] = L_LIMIT;
  208.       printf("warning LSP Low n");
  209.    }
  210.    for(j=0; j<M-1; j++) {
  211.       diff = buf[j+1] - buf[j];
  212.       if( diff < GAP3 ) {
  213.         buf[j+1] = buf[j]+ GAP3;
  214.       }
  215.    }
  216.    if( buf[M-1] > M_LIMIT ) {
  217.       buf[M-1] = M_LIMIT;
  218.       printf("warning LSP High n");
  219.    }
  220.    return;
  221. }