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

语音压缩

开发平台:

C/C++

  1. /*
  2.    ITU-T G.729 Annex C - Reference C code for floating point
  3.                          implementation of G.729 Annex A
  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 : LPCFUNCA.C
  17.  Used for the floating point version of G.729A only
  18.  (not for G.729 main body)
  19. */
  20. /*-------------------------------------------------------------*
  21.  *  Procedure lsp_az:                                          *
  22.  *            ~~~~~~                                           *
  23.  *   Compute the LPC coefficients from lsp (order=10)          *
  24.  *-------------------------------------------------------------*/
  25. #include "typedef.h"
  26. #include "ld8a.h"
  27. #include "tab_ld8a.h"
  28. /* local function */
  29. static void  get_lsp_pol(FLOAT lsf[],FLOAT f[]);
  30. static void  lsp_az(FLOAT *lsp, FLOAT *a);
  31. /*-----------------------------------------------------------------------------
  32.  * lsp_az - convert LSPs to predictor coefficients a[]
  33.  *-----------------------------------------------------------------------------
  34.  */
  35. static void lsp_az(
  36.  FLOAT *lsp,            /* input : lsp[0:M-1] */
  37.  FLOAT *a               /* output: predictor coeffs a[0:M], a[0] = 1. */
  38. )
  39. {
  40.   FLOAT f1[M], f2[M];
  41.   int i,j;
  42.   get_lsp_pol(&lsp[0],f1);
  43.   get_lsp_pol(&lsp[1],f2);
  44.   for (i = NC; i > 0; i--)
  45.   {
  46.     f1[i] += f1[i-1];
  47.     f2[i] -= f2[i-1];
  48.   }
  49.   a[0] = (F)1.0;
  50.   for (i = 1, j = M; i <= NC; i++, j--)
  51.   {
  52.     a[i] = (F)0.5*(f1[i] + f2[i]);
  53.     a[j] = (F)0.5*(f1[i] - f2[i]);
  54.   }
  55.   return;
  56. }
  57. /*----------------------------------------------------------------------------
  58.  * get_lsp_pol - find the polynomial F1(z) or F2(z) from the LSFs
  59.  *----------------------------------------------------------------------------
  60.  */
  61. static void get_lsp_pol(
  62.    FLOAT lsp[],           /* input : line spectral freq. (cosine domain)  */
  63.    FLOAT f[]              /* output: the coefficients of F1 or F2 */
  64. )
  65. {
  66.   FLOAT b;
  67.   int   i,j;
  68.   f[0] = (F)1.0;
  69.   b = (F)-2.0*lsp[0];
  70.   f[1] = b;
  71.   for (i = 2; i <= NC; i++)
  72.   {
  73.     b = (F)-2.0*lsp[2*i-2];
  74.     f[i] = b*f[i-1] + (F)2.0*f[i-2];
  75.     for (j = i-1; j > 1; j--)
  76.       f[j] += b*f[j-1] + f[j-2];
  77.     f[1] += b;
  78.   }
  79.   return;
  80. }
  81. /*---------------------------------------------------------------------------
  82.  * weight_az:  Weighting of LPC coefficients  ap[i]  =  a[i] * (gamma ** i)
  83.  *---------------------------------------------------------------------------
  84.  */
  85. void weight_az(
  86.  FLOAT *a,              /* input : lpc coefficients a[0:m]       */
  87.  FLOAT gamma,           /* input : weighting factor              */
  88.  int m,                 /* input : filter order                  */
  89.  FLOAT *ap              /* output: weighted coefficients ap[0:m] */
  90. )
  91. {
  92.   FLOAT fac;
  93.   int i;
  94.   ap[0]=a[0];
  95.   fac=gamma;
  96.   for (i = 1; i < m; i++)
  97.   {
  98.     ap[i] = fac*a[i];
  99.     fac *= gamma;
  100.   }
  101.   ap[m] = fac*a[m];
  102.   return;
  103. }
  104. /*-----------------------------------------------------------------------------
  105.  * int_qlpc -  interpolated M LSP parameters and convert to M+1 LPC coeffs
  106.  *-----------------------------------------------------------------------------
  107.  */
  108. void int_qlpc(
  109.  FLOAT lsp_old[],       /* input : LSPs for past frame (0:M-1) */
  110.  FLOAT lsp_new[],       /* input : LSPs for present frame (0:M-1) */
  111.  FLOAT az[]             /* output: filter parameters in 2 subfr (dim 2(m+1)) */
  112. )
  113. {
  114.   int i;
  115.   FLOAT lsp[M];
  116.   for (i = 0; i < M; i++)
  117.     lsp[i] = lsp_old[i]*(F)0.5 + lsp_new[i]*(F)0.5;
  118.   lsp_az(lsp, az);
  119.   lsp_az(lsp_new, &az[M+1]);
  120.   return;
  121. }