phi_lsfr.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:19k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2. This software module was originally developed by
  3. Peter Kroon (Bell Laboratories, Lucent Technologies)
  4. P. Kabal    (McGill University)
  5. in the course of development of the MPEG-2 NBC/MPEG-4 Audio standard
  6. ISO/IEC 13818-7, 14496-1,2 and 3. This software module is an
  7. implementation of a part of one or more MPEG-2 NBC/MPEG-4 Audio tools
  8. as specified by the MPEG-2 NBC/MPEG-4 Audio standard. ISO/IEC gives
  9. users of the MPEG-2 NBC/MPEG-4 Audio standards free license to this
  10. software module or modifications thereof for use in hardware or
  11. software products claiming conformance to the MPEG-2 NBC/ MPEG-4 Audio
  12. standards. Those intending to use this software module in hardware or
  13. software products are advised that this use may infringe existing
  14. patents. The original developer of this software module and his/her
  15. company, the subsequent editors and their companies, and ISO/IEC have
  16. no liability for use of this software module or modifications thereof
  17. in an implementation. Copyright is not released for non MPEG-2
  18. NBC/MPEG-4 Audio conforming products. The original developer retains
  19. full right to use the code for his/her own purpose, assign or donate
  20. the code to a third party and to inhibit third party from using the
  21. code for non MPEG-2 NBC/MPEG-4 Audio conforming products. This
  22. copyright notice must be included in all copies or derivative works.
  23. Copyright (c) 1996.
  24.  * Last modified: May 1, 1996
  25.  *
  26.  */
  27. /*====================================================================*/
  28. /**---------------------------------------------------------------------------- Telecommunications & Signal Processing Lab ---------------
  29.  *                            McGill University
  30.  * Author / revision:
  31.  *  P. Kabal
  32.  *  $Revision: 1.2 $  $Date: 2002/05/13 15:52:07 $
  33.  *  Revised for speechlib library 8/15/94
  34.  *  
  35.  */
  36. /*======================================================================
  37.     Modified by Andy Gerrits, Philips Research Laboratories.
  38.     Date: 1997/03/27
  39.   ======================================================================*/
  40. /*======================================================================*/
  41. /*      I N C L U D E S                                                 */
  42. /*======================================================================*/
  43. #include <stdio.h>
  44. #include <stdlib.h>
  45. #include <math.h>
  46. #include <assert.h>
  47. #include "phi_lsfr.h"
  48. #include "att_proto.h"    
  49. /*======================================================================*/
  50. /*     L O C A L     S Y M B O L     D E F I N I T I O N S              */
  51. /*======================================================================*/
  52. #define MAXORDER 20         /* Modified by AG: 16 -> 20 */
  53. #ifndef PI
  54. #define PI 3.1415927
  55. #endif
  56. #define NBIS 4 /* number of bisections */
  57. #define DW (0.01 * PI) /* resolution for initial search */
  58. /*======================================================================*/
  59. /*     L O C A L    F U N C T I O N S     P R O T O T Y P E S           */ 
  60. /*======================================================================*/
  61. float FNevChebP( /* result */
  62. float  x, /* input : value */
  63. const float c[], /* input : Array of coefficient values */
  64. long n /* input : Number of coefficients */
  65. );
  66. long pc2lsf_org( /* ret 1 on succ, 0 on failure */
  67. float lsf[], /* output: the np line spectral freq. */
  68. const float pc[], /* input : the np+1 predictor coeff. */
  69. long np     /* input : order = # of freq to cal. */
  70. );
  71. /*======================================================================*/
  72. /*       F U N C T I O N S     D E F I N I T I O N S                    */ 
  73. /*======================================================================*/
  74. /*----------------------------------------------------------------------------
  75.  * lsf2pc - convert lsf to predictor coefficients
  76.  *
  77.  * FIR filter using the line spectral frequencies
  78.  * can, of course, also be use to get predictor coeff
  79.  * from the line spectral frequencies
  80.  *----------------------------------------------------------------------------
  81.  */
  82. void PHI_lsf2pc
  83. (
  84. long order,            /* input : predictor order                     */
  85. const float lsf[],     /* input : line-spectral freqs [0,pi]          */
  86. float pc[]             /* output: predictor coeff: a_1,a_2...a_order  */
  87. {
  88.    double mem[2*MAXORDER+2];
  89.    float temp_pc[MAXORDER+1];
  90.    long i;
  91.  
  92.    /* Modified by AG: assertion on order */  
  93.    assert(order <= MAXORDER);
  94.    
  95.    for (i=0; i< 2*order+2; i++) mem[i] = 0.0;
  96.    for (i=0; i< order+1; i++) temp_pc[i] = (float)0.0;
  97.    temp_pc[0]=(float)1.0;
  98.    lsffir( temp_pc, lsf, order, mem, order+1);
  99.    
  100.    /* Modified by AG: Alternative definition of a parameters */  
  101.    for (i=0; i < order; i++) pc[i] = (float)-1.0 * temp_pc[i+1];
  102.    
  103. }
  104. /*----------------------------------------------------------------------------
  105.  * lsffir - FIR filter using the line spectral frequencies
  106.  *----------------------------------------------------------------------------
  107.  */
  108. /* Modified by AG: doubles used instead of floats */  
  109. void lsffir(
  110. float *x,            /* out/in: input and output signals           */
  111. const float *lsf,    /* input : line-spectral freqs, range [0:pi)  */
  112. long order,          /* input : order of lsf                       */
  113. double *w,           /* input : filter state (2*(order+1)          */
  114. long framel          /* input : length of array                    */
  115. )
  116. {
  117.    long j, i;
  118.    long n1, n2, n3, n4;
  119.    long odd;
  120.    double xin1, xin2, xout1, xout2;
  121.    odd = order % 2;
  122.    for( j=0; j<framel; j++){
  123.      xin1 = (double)x[j];
  124.      xin2 = (double)x[j];
  125.      for( i=0; i<(order>>1); i++){
  126.         n1 = i*4;
  127.         n2 = n1+1;
  128.         n3 = n2+1;
  129.         n4 = n3+1;
  130.         xout1 = -2. * cos((double)lsf[i*2+0]) * w[n1] + w[n2] + xin1;
  131.         xout2 = -2. * cos((double)lsf[i*2+1]) * w[n3] + w[n4] + xin2;
  132.         w[n2] = w[n1];
  133.         w[n1] = xin1;
  134.         w[n4] = w[n3];
  135.         w[n3] = xin2;
  136.         xin1 = xout1;
  137.         xin2 = xout2;
  138.      }
  139.      /* if odd, finish with extra odd term */
  140.      if(odd == 1) {
  141.         n1 = i*4;
  142.         n2 = n1+1;
  143.         n4 = n2;
  144.         xout1 = -2. * cos((double)lsf[i*2+0]) * w[n1] + w[n2] + xin1;
  145.         w[n2] = w[n1];
  146.         w[n1] = xin1;
  147.       } else            /* else even */
  148.         xout1 = xin1 + w[n4+1];
  149.       xout2 = xin2 - w[n4+2];
  150.       x[j] =  (float)(0.5 * (xout1 + xout2));
  151.       if(odd == 1) {
  152.        w[n4+2] = w[n4+1];
  153.        w[n4+1] = xin2;
  154.       } else {
  155.        w[n4+1] = xin1;
  156.        w[n4+2] = xin2;
  157.       }
  158.    }
  159. }
  160. void PHI_pc2lsf( /* ret 1 on succ, 0 on failure */
  161. long np,     /* input : order = # of freq to cal. */
  162. const float pc[],     /* input : the np predictor coeff. */
  163. float lsf[]      /* output: the np line spectral freq. */
  164. )
  165. {
  166.    float temp_pc[MAXORDER+1];
  167.    long i;
  168.  
  169.    /* Modified by AG: assertion on order */  
  170.    assert(np <= MAXORDER);
  171.    
  172.    for (i=1; i < np+1; i++) temp_pc[i] = (float)-1.0 * pc[i-1];
  173.    temp_pc[0]=(float)1.0;
  174.    if (!pc2lsf_org(lsf, temp_pc, np))
  175.    {
  176.        fprintf(stderr,"FATAL ERROR in PHI_pc2lsfn");
  177.        exit(0);
  178.    }
  179. }
  180.   
  181. /*----------------------------------------------------------------------------
  182.  * pc2lsf -  Convert predictor coefficients to line spectral frequencies
  183.  *
  184.  * Description:
  185.  *  The transfer function of the prediction error filter is formed from the
  186.  *  predictor coefficients.  This polynomial is transformed into two reciprocal
  187.  *  polynomials having roots on the unit circle. The roots of these polynomials
  188.  *  interlace.  It is these roots that determine the line spectral frequencies.
  189.  *  The two reciprocal polynomials are expressed as series expansions in
  190.  *  Chebyshev polynomials with roots in the range -1 to +1.  The inverse cosine
  191.  *  of the roots of the Chebyshev polynomial expansion gives the line spectral
  192.  *  frequencies.  If np line spectral frequencies are not found, this routine
  193.  *  stops with an error message.  This error occurs if the input coefficients
  194.  *  do not give a prediction error filter with minimum phase.
  195.  *
  196.  *  Line spectral frequencies and predictor coefficients are usually expressed
  197.  *  algebraically as vectors.
  198.  *    lsf[0]     first (lowest frequency) line spectral frequency
  199.  *    lsf[i]     1 <= i < np
  200.  *    pc[0]=1.0  predictor coefficient corresponding to lag 0
  201.  *    pc[i]      1 <= 1 <= np
  202.  *
  203.  * Parameters:
  204.  *  ->  float pc[]
  205.  *      Vector of predictor coefficients (Np+1 values).  These are the 
  206.  *      coefficients of the predictor filter, with pc[0] being the predictor 
  207.  *      coefficient corresponding to lag 0, and pc[Np] corresponding to lag Np.
  208.  *      The predictor coeffs. must correspond to a minimum phase prediction
  209.  *      error filter.
  210.  *  <-  float lsf[]
  211.  *      Array of Np line spectral frequencies (in ascending order).  Each line
  212.  *      spectral frequency lies in the range 0 to pi.
  213.  *  ->  long Np
  214.  *      Number of coefficients (at most MAXORDER = 50)
  215.  *----------------------------------------------------------------------------
  216.  */
  217. long pc2lsf_org( /* ret 1 on succ, 0 on failure */
  218. float lsf[], /* output: the np line spectral freq. */
  219. const float pc[], /* input : the np+1 predictor coeff. */
  220. long np     /* input : order = # of freq to cal. */
  221. )
  222. {
  223.   float fa[(MAXORDER+1)/2+1], fb[(MAXORDER+1)/2+1];
  224.   float ta[(MAXORDER+1)/2+1], tb[(MAXORDER+1)/2+1];
  225.   float *t;
  226.   float xlow, xmid, xhigh;
  227.   float ylow, ymid, yhigh;
  228.   float xroot;
  229.   float dx;
  230.   long i, j, nf;
  231.   long odd;
  232.   long na, nb, n;
  233.   float ss, aa;
  234.   assert(np <= MAXORDER);
  235. /* Determine the number of coefficients in ta(.) and tb(.) */
  236.   odd = (long)(np % 2 != 0);
  237.   if (odd) {
  238.     nb = (np + 1) / 2;
  239.     na = nb + 1;
  240.   }
  241.   else {
  242.     nb = np / 2 + 1;
  243.     na = nb;
  244.   }
  245. /*
  246. *   Let D=z**(-1), the unit delay; the predictor coefficients form the
  247. *
  248. *             N         n 
  249. *     P(D) = SUM pc[n] D  .   ( pc[0] = 1.0 )
  250. *            n=0
  251. *
  252. *   error filter polynomial, A(D)=P(D) with N+1 terms.  Two auxiliary
  253. *   polynomials are formed from the error filter polynomial,
  254. *     Fa(D) = A(D) + D**(N+1) A(D**(-1))  (N+2 terms, symmetric)
  255. *     Fb(D) = A(D) - D**(N+1) A(D**(-1))  (N+2 terms, anti-symmetric)
  256. */
  257.   fa[0] = (float)1.0;
  258.   for (i = 1, j = np; i < na; ++i, --j)
  259.     fa[i] = pc[i] + pc[j];
  260.   fb[0] = (float)1.0;
  261.   for (i = 1, j = np; i < nb; ++i, --j)
  262.     fb[i] = pc[i] - pc[j];
  263. /*
  264. * N even,  Fa(D)  includes a factor 1+D,
  265. *          Fb(D)  includes a factor 1-D
  266. * N odd,   Fb(D)  includes a factor 1-D**2
  267. * Divide out these factors, leaving even order symmetric polynomials, M is the
  268. * total number of terms and Nc is the number of unique terms,
  269. *
  270. *   N       polynomial            M         Nc=(M+1)/2
  271. * even,  Ga(D) = F1(D)/(1+D)     N+1          N/2+1
  272. *        Gb(D) = F2(D)/(1-D)     N+1          N/2+1
  273. * odd,   Ga(D) = F1(D)           N+2        (N+1)/2+1
  274. *        Gb(D) = F2(D)/(1-D**2)   N          (N+1)/2
  275. */
  276.   if (odd) {
  277.     for (i = 2; i < nb; ++i)
  278.       fb[i] = fb[i] + fb[i-2];
  279.   }
  280.   else {
  281.     for (i = 1; i < na; ++i) {
  282.       fa[i] = fa[i] - fa[i-1];
  283.       fb[i] = fb[i] + fb[i-1];
  284.     }
  285.   }
  286. /*
  287. *   To look for roots on the unit circle, Ga(D) and Gb(D) are evaluated for
  288. *   D=exp(jw).  Since Gz(D) and Gb(D) are symmetric, they can be expressed in
  289. *   terms of a series in cos(nw) for D on the unit circle.  Since M is odd and
  290. *   D=exp(jw)
  291. *
  292. *           M-1        n 
  293. *   Ga(D) = SUM fa(n) D             (symmetric, fa(n) = fa(M-1-n))
  294. *           n=0
  295. *                                    Mh-1
  296. *         = exp(j Mh w) [ f1(Mh) + 2 SUM fa(n) cos((Mh-n)w) ]
  297. *                                    n=0
  298. *                       Mh
  299. *         = exp(j Mh w) SUM ta(n) cos(nw) ,
  300. *                       n=0
  301. *
  302. *   where Mh=(M-1)/2=Nc-1.  The Nc=Mh+1 coefficients ta(n) are defined as
  303. *
  304. *   ta(n) =   fa(Nc-1) ,    n=0,
  305. *         = 2 fa(Nc-1-n) ,  n=1,...,Nc-1.
  306. *   The next step is to identify cos(nw) with the Chebyshev polynomial T(n,x).
  307. *   The Chebyshev polynomials satisfy the relationship T(n,cos(w)) = cos(nw).
  308. *   Omitting the exponential delay term, the series expansion in terms of
  309. *   Chebyshev polynomials is
  310. *
  311. *           Nc-1
  312. *   Ta(x) = SUM ta(n) T(n,x)
  313. *           n=0
  314. *
  315. *   The domain of Ta(x) is -1 < x < +1.  For a given root of Ta(x), say x0,
  316. *   the corresponding position of the root of Fa(D) on the unit circle is
  317. *   exp(j arccos(x0)).
  318. */
  319.   ta[0] = fa[na-1];
  320.   for (i = 1, j = na - 2; i < na; ++i, --j)
  321.     ta[i] = (float)2.0 * fa[j];
  322.   tb[0] = fb[nb-1];
  323.   for (i = 1, j = nb - 2; i < nb; ++i, --j)
  324.     tb[i] = (float)2.0 * fb[j];
  325. /*
  326. *   To find the roots, we sample the polynomials Ta(x) and Tb(x) looking for
  327. *   sign changes.  An interval containing a root is successively bisected to
  328. *   narrow the interval and then linear interpolation is used to estimate the
  329. *   root.  For a given root at x0, the line spectral frequency is w0=acos(x0).
  330. *
  331. *   Since the roots of the two polynomials interlace, the search for roots
  332. *   alternates between the polynomials Ta(x) and Tb(x).  The sampling interval
  333. *   must be small enough to avoid having two cancelling sign changes in the
  334. *   same interval.  Consider specifying the resolution in the LSF domain.  For
  335. *   an interval [xl, xh], the corresponding interval in frequency is [w1, w2],
  336. *   with xh=cos(w1) and xl=cos(w2) (note the reversal in order).  Let dw=w2-w1,
  337. *     dx = xh-xl = xh [1-cos(dw)] + sqrt(1-xh*xh) sin(dw).
  338. *   However, the calculation of the square root is overly time-consuming.  If
  339. *   instead, we use equal steps in the x-domain, the resolution in the LSF
  340. *   domain is best at at pi/2 and worst at 0 and pi.  As a compromise we fit a
  341. *   quadratic to the step size relationship.  At x=1, dx=(1-cos(dw); at x=0,
  342. *   dx=sin(dw).  Then the approximation is
  343. *     dx' = (a(1-cos(dw))-sin(dw)) x**2 + sin(dw)).
  344. *   For a=1, this value underestimates the step size in the range of interest.
  345. *   However, the step size for just below x=1 and just above x=-1 fall well
  346. *   below the desired step sizes.  To compensate for this, we use a=4.  Then at
  347. *   x=+1 and x=-1, the step sizes are too large by a factor of 4, but rapidly
  348. *   fall to about 60% of the desired values and then rise slowly to become 
  349. *   equal to the desired step size at x=0.
  350. */
  351.   nf = 0;
  352.   t = ta;
  353.   n = na;
  354.   xroot = (float)2.0;
  355.   xlow = (float)1.0;
  356.   ylow = FNevChebP(xlow, t, n);
  357. /*
  358. *   Define the step-size function parameters
  359. *   The resolution in the LSF domain is at least DW/2**NBIS, not counting the
  360. *   increase in resolution due to the linear interpolation step.  For
  361. *   DW=0.02*Pi, and NBIS=4, and a sampling frequency of 8000, this corresponds
  362. *   to 5 Hz.
  363. */
  364.   ss = (float)sin (DW);
  365.   aa = (float)(4.0 - 4.0 * cos (DW)  - (double)ss);
  366. /* Root search loop */
  367.   while (xlow > (float)-1.0 && nf < np) {
  368.     /* New trial point */
  369.     xhigh = xlow;
  370.     yhigh = ylow;
  371.     dx = aa * xhigh * xhigh + ss;
  372.     xlow = xhigh - dx;
  373.     if (xlow < (float)-1.0)
  374.       xlow = (float)-1.0;
  375.     ylow = FNevChebP(xlow, t, n);
  376.     if (ylow * yhigh <= (float)0.0) {
  377.     /* Bisections of the interval containing a sign change */
  378.       dx = xhigh - xlow;
  379.       for (i = 1; i <= NBIS; ++i) {
  380. dx = (float)0.5 * dx;
  381. xmid = xlow + dx;
  382. ymid = FNevChebP(xmid, t, n);
  383. if (ylow * ymid <= (float)0.0) {
  384.   yhigh = ymid;
  385.   xhigh = xmid;
  386. }
  387. else {
  388.   ylow = ymid;
  389.   xlow = xmid;
  390. }
  391.       }
  392.       /*
  393.        * Linear interpolation in the subinterval with a sign change
  394.        * (take care if yhigh=ylow=0)
  395.        */
  396.       if (yhigh != ylow)
  397. xmid = xlow + dx * ylow / (ylow - yhigh);
  398.       else
  399. xmid = xlow + dx;
  400.       /* New root position */
  401.       lsf[nf] = (float)acos((double) xmid);
  402.       ++nf;
  403.       /* Start the search for the roots of the next polynomial at the estimated
  404.        * location of the root just found.  We have to catch the case that the
  405.        * two polynomials have roots at the same place to avoid getting stuck at
  406.        * that root.
  407.        */
  408.       if (xmid >= xroot) {
  409. xmid = xlow - dx;
  410.       }
  411.       xroot = xmid;
  412.       if (t == ta) {
  413. t = tb;
  414. n = nb;
  415.       }
  416.       else {
  417. t = ta;
  418. n = na;
  419.       }
  420.       xlow = xmid;
  421.       ylow = FNevChebP(xlow, t, n);
  422.     }
  423.   }
  424. /* Error if np roots have not been found */
  425.   if (nf != np) {
  426.     printf("nWARNING: pc2lsf failed to find all lsf nf=%ld np=%ldn", nf, np);
  427.     return(0);
  428.   }
  429.   return(1);
  430. }
  431. /**---------------------------------------------------------------------------- Telecommunications & Signal Processing Lab ---------------
  432. *                             McGill University
  433. *
  434. * Module:
  435. *  float FNevChebP(float x,  float c[], long N)
  436. *
  437. * Purpose:
  438. *  Evaluate a series expansion in Chebyshev polynomials
  439. *
  440. * Description:
  441. *  The series expansion in Chebyshev polynomials is defined as
  442. *
  443. *              N-1
  444. *       Y(x) = SUM c(i) T(i,x) ,
  445. *              i=0
  446. *
  447. *  where N is the order of the expansion, c(i) is the coefficient for the i'th
  448. *  Chebyshev polynomial, and T(i,x) is the i'th order Chebyshev polynomial
  449. *  evaluated at x.
  450. *
  451. *  The Chebyshev polynomials satisfy the recursion
  452. *    T(i,x) = 2x T(i-1,x) - T(i-2,x),
  453. *  with the initial conditions T(0,x)=1 and T(1,x)=x.  This routine evaluates
  454. *  the expansion using a backward recursion.
  455. *
  456. * Parameters:
  457. *  <-  float
  458. *  FNevChebP - Resulting value
  459. *  ->  float
  460. *  x - Input value
  461. *  ->  float []
  462. *  c - Array of coefficient values.  c[i] is the coefficient of the
  463. * i'th order Chebyshev polynomial.
  464. *  ->  long
  465. *  N - Number of coefficients
  466. *
  467. * Author / revision:
  468. *  P. Kabal
  469. *  $Revision: 1.2 $  $Date: 2002/05/13 15:52:07 $
  470. *
  471. -------------------------------------------------------------------------*/
  472. float FNevChebP( /* result */
  473. float  x, /* input : value */
  474. const float c[], /* input : Array of coefficient values */
  475. long n /* input : Number of coefficients */
  476. )
  477. {
  478.   long i;
  479.   float b0, b1, b2;
  480. /*****************
  481. *   Consider the backward recursion
  482. *     b(i,x) = 2xb(i+1,x) - b(i+2,x) + c(i),
  483. *   with initial conditions b(n,x)=0 and b(n+1,x)=0.  Then dropping the
  484. *   dependence on x,
  485. *     c(i) = b(i) - 2xb(i+1) + b(i+2).
  486. *
  487. *          n-1
  488. *   Y(x) = SUM c(i) T(i)
  489. *          i=0
  490. *
  491. *          n-1
  492. *        = SUM [b(i)-2xb(i+1)+b(i+2)] T(i)
  493. *          i=0
  494. *                                             n-1
  495. *        = b(0)T(0) + b(1)T(1) - 2xb(1)T(0) + SUM b(i) [T(i)-2xT(i-1)+T(i-2)] 
  496. *                                             i=2
  497. * The term inside the sum is zero because of the recursive relationship
  498. * satisfied by the Chebyshev polynomials.  Then substituting the values T(0)=1
  499. * and T(1)=x, Y(x) is expressed in terms of the diff. between b(0) and b(2)
  500. * (errors in b(0) and b(2) tend to cancel),
  501. *   Y(x) = b(0)-xb(1) = [b(0)-b(2)+c(0)] / 2
  502. *******************
  503. */
  504.   b1 = (float)0.0;
  505.   b0 = (float)0.0;
  506.   for (i = n - 1; i >= 0; --i) {
  507.     b2 = b1;
  508.     b1 = b0;
  509.     b0 = (float)2.0 * x * b1 - b2 + c[i];
  510.   }
  511.   return ((float)0.5 * (b0 - b2 + c[0]));
  512. }