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

语音压缩

开发平台:

C/C++

  1. /* Version 3.3    Last modified: December 26, 1995 */
  2. /*-------------------------------------------------------------*
  3.  *  Procedure Lsp_Az:                                          *
  4.  *            ~~~~~~                                           *
  5.  *   Compute the LPC coefficients from lsp (order=10)          *
  6.  *-------------------------------------------------------------*/
  7. #include "typedef.h"
  8. #include "basic_op.h"
  9. #include "oper_32b.h"
  10. #include "ld8k.h"
  11. #include "tab_ld8k.h"
  12. /* local function */
  13. static void Get_lsp_pol(Word16 *lsp, Word32 *f);
  14. void Lsp_Az(
  15.   Word16 lsp[],    /* (i) Q15 : line spectral frequencies            */
  16.   Word16 a[]       /* (o) Q12 : predictor coefficients (order = 10)  */
  17. )
  18. {
  19.   Word16 i, j;
  20.   Word32 f1[6], f2[6];
  21.   Word32 t0;
  22.   Get_lsp_pol(&lsp[0],f1);
  23.   Get_lsp_pol(&lsp[1],f2);
  24.   for (i = 5; i > 0; i--)
  25.   {
  26.     f1[i] = L_add(f1[i], f1[i-1]);        /* f1[i] += f1[i-1]; */
  27.     f2[i] = L_sub(f2[i], f2[i-1]);        /* f2[i] -= f2[i-1]; */
  28.   }
  29.   a[0] = 4096;
  30.   for (i = 1, j = 10; i <= 5; i++, j--)
  31.   {
  32.     t0   = L_add(f1[i], f2[i]);                 /* f1[i] + f2[i]             */
  33.     a[i] = extract_l( L_shr_r(t0, 13) );        /* from Q24 to Q12 and * 0.5 */
  34.     t0   = L_sub(f1[i], f2[i]);                 /* f1[i] - f2[i]             */
  35.     a[j] = extract_l( L_shr_r(t0, 13) );        /* from Q24 to Q12 and * 0.5 */
  36.   }
  37.   return;
  38. }
  39. /*-----------------------------------------------------------*
  40.  * procedure Get_lsp_pol:                                    *
  41.  *           ~~~~~~~~~~~                                     *
  42.  *   Find the polynomial F1(z) or F2(z) from the LSPs        *
  43.  *-----------------------------------------------------------*
  44.  *                                                           *
  45.  * Parameters:                                               *
  46.  *  lsp[]   : line spectral freq. (cosine domain)    in Q15  *
  47.  *  f[]     : the coefficients of F1 or F2           in Q24  *
  48.  *-----------------------------------------------------------*/
  49. static void Get_lsp_pol(Word16 *lsp, Word32 *f)
  50. {
  51.   Word16 i,j, hi, lo;
  52.   Word32 t0;
  53.    /* All computation in Q24 */
  54.    *f = L_mult(4096, 2048);             /* f[0] = 1.0;             in Q24  */
  55.    f++;
  56.    *f = L_msu((Word32)0, *lsp, 512);    /* f[1] =  -2.0 * lsp[0];  in Q24  */
  57.    f++;
  58.    lsp += 2;                            /* Advance lsp pointer             */
  59.    for(i=2; i<=5; i++)
  60.    {
  61.      *f = f[-2];
  62.      for(j=1; j<i; j++, f--)
  63.      {
  64.        L_Extract(f[-1] ,&hi, &lo);
  65.        t0 = Mpy_32_16(hi, lo, *lsp);         /* t0 = f[-1] * lsp    */
  66.        t0 = L_shl(t0, 1);
  67.        *f = L_add(*f, f[-2]);                /* *f += f[-2]         */
  68.        *f = L_sub(*f, t0);                   /* *f -= t0            */
  69.      }
  70.      *f   = L_msu(*f, *lsp, 512);            /* *f -= lsp<<9        */
  71.      f   += i;                               /* Advance f pointer   */
  72.      lsp += 2;                               /* Advance lsp pointer */
  73.    }
  74.    return;
  75. }
  76. /*___________________________________________________________________________
  77.  |                                                                           |
  78.  |   Functions : Lsp_lsf and Lsf_lsp                                         |
  79.  |                                                                           |
  80.  |      Lsp_lsf   Transformation lsp to lsf                                  |
  81.  |      Lsf_lsp   Transformation lsf to lsp                                  |
  82.  |---------------------------------------------------------------------------|
  83.  |  Algorithm:                                                               |
  84.  |                                                                           |
  85.  |   The transformation from lsp[i] to lsf[i] and lsf[i] to lsp[i] are       |
  86.  |   approximated by a look-up table and interpolation.                      |
  87.  |___________________________________________________________________________|
  88. */
  89. void Lsf_lsp(
  90.   Word16 lsf[],    /* (i) Q15 : lsf[m] normalized (range: 0.0<=val<=0.5) */
  91.   Word16 lsp[],    /* (o) Q15 : lsp[m] (range: -1<=val<1)                */
  92.   Word16 m         /* (i)     : LPC order                                */
  93. )
  94. {
  95.   Word16 i, ind, offset;
  96.   Word32 L_tmp;
  97.   for(i=0; i<m; i++)
  98.   {
  99.     ind    = shr(lsf[i], 8);               /* ind    = b8-b15 of lsf[i] */
  100.     offset = lsf[i] & (Word16)0x00ff;      /* offset = b0-b7  of lsf[i] */
  101.     /* lsp[i] = table[ind]+ ((table[ind+1]-table[ind])*offset) / 256 */
  102.     L_tmp   = L_mult(sub(table[ind+1], table[ind]), offset);
  103.     lsp[i] = add(table[ind], extract_l(L_shr(L_tmp, 9)));
  104.   }
  105.   return;
  106. }
  107. void Lsp_lsf(
  108.   Word16 lsp[],    /* (i) Q15 : lsp[m] (range: -1<=val<1)                */
  109.   Word16 lsf[],    /* (o) Q15 : lsf[m] normalized (range: 0.0<=val<=0.5) */
  110.   Word16 m         /* (i)     : LPC order                                */
  111. )
  112. {
  113.   Word16 i, ind, tmp;
  114.   Word32 L_tmp;
  115.   ind = 63;    /* begin at end of table -1 */
  116.   for(i= m-(Word16)1; i >= 0; i--)
  117.   {
  118.     /* find value in table that is just greater than lsp[i] */
  119.     while( sub(table[ind], lsp[i]) < 0 )
  120.     {
  121.       ind = sub(ind,1);
  122.     }
  123.     /* acos(lsp[i])= ind*256 + ( ( lsp[i]-table[ind] ) * slope[ind] )/4096 */
  124.     L_tmp  = L_mult( sub(lsp[i], table[ind]) , slope[ind] );
  125.     tmp = round(L_shl(L_tmp, 3));     /*(lsp[i]-table[ind])*slope[ind])>>12*/
  126.     lsf[i] = add(tmp, shl(ind, 8));
  127.   }
  128.   return;
  129. }
  130. /*___________________________________________________________________________
  131.  |                                                                           |
  132.  |   Functions : Lsp_lsf and Lsf_lsp                                         |
  133.  |                                                                           |
  134.  |      Lsp_lsf   Transformation lsp to lsf                                  |
  135.  |      Lsf_lsp   Transformation lsf to lsp                                  |
  136.  |---------------------------------------------------------------------------|
  137.  |  Algorithm:                                                               |
  138.  |                                                                           |
  139.  |   The transformation from lsp[i] to lsf[i] and lsf[i] to lsp[i] are       |
  140.  |   approximated by a look-up table and interpolation.                      |
  141.  |___________________________________________________________________________|
  142. */
  143. void Lsf_lsp2(
  144.   Word16 lsf[],    /* (i) Q13 : lsf[m] (range: 0.0<=val<PI) */
  145.   Word16 lsp[],    /* (o) Q15 : lsp[m] (range: -1<=val<1)   */
  146.   Word16 m         /* (i)     : LPC order                   */
  147. )
  148. {
  149.   Word16 i, ind;
  150.   Word16 offset;   /* in Q8 */
  151.   Word16 freq;     /* normalized frequency in Q15 */
  152.   Word32 L_tmp;
  153.   for(i=0; i<m; i++)
  154.   {
  155. /*    freq = abs_s(freq);*/
  156.     freq = mult(lsf[i], 20861);          /* 20861: 1.0/(2.0*PI) in Q17 */
  157.     ind    = shr(freq, 8);               /* ind    = b8-b15 of freq */
  158.     offset = freq & (Word16)0x00ff;      /* offset = b0-b7  of freq */
  159.     if ( sub(ind, 63)>0 ){
  160.       ind = 63;                 /* 0 <= ind <= 63 */
  161.     }
  162.     /* lsp[i] = table2[ind]+ (slope_cos[ind]*offset >> 12) */
  163.     L_tmp   = L_mult(slope_cos[ind], offset);   /* L_tmp in Q28 */
  164.     lsp[i] = add(table2[ind], extract_l(L_shr(L_tmp, 13)));
  165.   }
  166.   return;
  167. }
  168. void Lsp_lsf2(
  169.   Word16 lsp[],    /* (i) Q15 : lsp[m] (range: -1<=val<1)   */
  170.   Word16 lsf[],    /* (o) Q13 : lsf[m] (range: 0.0<=val<PI) */
  171.   Word16 m         /* (i)     : LPC order                   */
  172. )
  173. {
  174.   Word16 i, ind;
  175.   Word16 offset;   /* in Q15 */
  176.   Word16 freq;     /* normalized frequency in Q16 */
  177.   Word32 L_tmp;
  178.   ind = 63;           /* begin at end of table2 -1 */
  179.   for(i= m-(Word16)1; i >= 0; i--)
  180.   {
  181.     /* find value in table2 that is just greater than lsp[i] */
  182.     while( sub(table2[ind], lsp[i]) < 0 )
  183.     {
  184.       ind = sub(ind,1);
  185.       if ( ind <= 0 )
  186.         break;
  187.     }
  188.     offset = sub(lsp[i], table2[ind]);
  189.     /* acos(lsp[i])= ind*512 + (slope_acos[ind]*offset >> 11) */
  190.     L_tmp  = L_mult( slope_acos[ind], offset );   /* L_tmp in Q28 */
  191.     freq = add(shl(ind, 9), extract_l(L_shr(L_tmp, 12)));
  192.     lsf[i] = mult(freq, 25736);           /* 25736: 2.0*PI in Q12 */
  193.   }
  194.   return;
  195. }
  196. /*-------------------------------------------------------------*
  197.  *  procedure Weight_Az                                        *
  198.  *            ~~~~~~~~~                                        *
  199.  * Weighting of LPC coefficients.                              *
  200.  *   ap[i]  =  a[i] * (gamma ** i)                             *
  201.  *                                                             *
  202.  *-------------------------------------------------------------*/
  203. void Weight_Az(
  204.   Word16 a[],      /* (i) Q12 : a[m+1]  LPC coefficients             */
  205.   Word16 gamma,    /* (i) Q15 : Spectral expansion factor.           */
  206.   Word16 m,        /* (i)     : LPC order.                           */
  207.   Word16 ap[]      /* (o) Q12 : Spectral expanded LPC coefficients   */
  208. )
  209. {
  210.   Word16 i, fac;
  211.   ap[0] = a[0];
  212.   fac   = gamma;
  213.   for(i=1; i<m; i++)
  214.   {
  215.     ap[i] = round( L_mult(a[i], fac) );
  216.     fac   = round( L_mult(fac, gamma) );
  217.   }
  218.   ap[m] = round( L_mult(a[m], fac) );
  219.   return;
  220. }
  221. /*----------------------------------------------------------------------*
  222.  * Function Int_qlpc() and Int_lpc()                                    *
  223.  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                                    *
  224.  * Interpolation of the LPC parameters.                                 *
  225.  *----------------------------------------------------------------------*/
  226. /* Interpolation of the quantized LSP's */
  227. void Int_qlpc(
  228.  Word16 lsp_old[], /* input : LSP vector of past frame              */
  229.  Word16 lsp_new[], /* input : LSP vector of present frame           */
  230.  Word16 Az[]       /* output: interpolated Az() for the 2 subframes */
  231. )
  232. {
  233.   Word16 i;
  234.   Word16 lsp[M];
  235.   /*  lsp[i] = lsp_new[i] * 0.5 + lsp_old[i] * 0.5 */
  236.   for (i = 0; i < M; i++) {
  237.     lsp[i] = add(shr(lsp_new[i], 1), shr(lsp_old[i], 1));
  238.   }
  239.   Lsp_Az(lsp, Az);              /* Subframe 1 */
  240.   Lsp_Az(lsp_new, &Az[MP1]);    /* Subframe 2 */
  241.   return;
  242. }
  243. /*----------------------------------------------------------------------*
  244.  * Function Int_lpc()                                                   *
  245.  * ~~~~~~~~~~~~~~~~~~                                                   *
  246.  * Interpolation of the unquantized LPC parameters.                     *
  247.  * Same as the previous function but we do not recompute Az() for       *
  248.  * subframe 2  because it is already available.                         *
  249.  * We also compute the interpolate LSF (frequency domain).               *
  250.  *----------------------------------------------------------------------*/
  251. void Int_lpc(
  252.  Word16 lsp_old[], /* input : LSP vector of past frame              */
  253.  Word16 lsp_new[], /* input : LSP vector of present frame           */
  254.  Word16 lsf_int[], /* output: interpolated lsf coefficients         */
  255.  Word16 lsf_new[],
  256.  Word16 Az[]       /* output: interpolated Az() for the 2 subframes */
  257. )
  258. {
  259.   Word16 i;
  260.   Word16 lsp[M];
  261.   /*  lsp[i] = lsp_new[i] * 0.5 + lsp_old[i] * 0.5 */
  262.   for (i = 0; i < M; i++) {
  263.     lsp[i] = add(shr(lsp_new[i], 1), shr(lsp_old[i], 1));
  264.   }
  265.   Lsp_Az(lsp, Az);
  266.   Lsp_lsf(lsp, lsf_int, M);      /* transformation from LSP to LSF (freq.domain) */
  267.   Lsp_lsf(lsp_new, lsf_new, M);  /* transformation from LSP to LSF (freq.domain) */
  268.   return;
  269. }