lpc_lib.c
上传用户:luckfish
上传日期:2021-12-16
资源大小:77k
文件大小:13k
源码类别:

语音压缩

开发平台:

Visual C++

  1. /*
  2. 2.4 kbps MELP Proposed Federal Standard speech coder
  3. version 1.2
  4. Copyright (c) 1996, Texas Instruments, Inc.  
  5. Texas Instruments has intellectual property rights on the MELP
  6. algorithm.  The Texas Instruments contact for licensing issues for
  7. commercial and non-government use is William Gordon, Director,
  8. Government Contracts, Texas Instruments Incorporated, Semiconductor
  9. Group (phone 972 480 7442).
  10. */
  11. /*
  12.   lpc_lib.c: LPC function library
  13. */
  14. #include <stdio.h>
  15. #include <math.h>
  16. #include "spbstd.h"
  17. #include "lpc.h"
  18. /* 
  19.     Name: lpc_aejw- Compute square of A(z) evaluated at exp(jw)
  20.     Description:
  21.         Compute the magnitude squared of the z-transform of 
  22. <nf>
  23.         A(z) = 1+a(1)z^-1 + ... +a(p)z^-p
  24. </nf>
  25.         evaluated at z=exp(jw)
  26.      Inputs:
  27.         a- LPC filter (a[0] is undefined, a[1..p])
  28.         w- radian frequency
  29.         p- predictor order
  30.      Returns:
  31.         |A(exp(jw))|^2
  32.      See_Also: cos(3), sin(3)
  33.      Includes:
  34.         spbstd.h
  35.         lpc.h
  36.      Systems and Info. Science Lab
  37.      Copyright (c) 1995 by Texas Instruments, Inc.  All rights reserved.
  38. */
  39. float lpc_aejw(float *a,float w,int p)
  40. {
  41.     int i;
  42.     float c_re,c_im;
  43.     float cs,sn,tmp;
  44.     if (p==0)
  45.         return(1.);
  46.     /* use horners method
  47.     A(exp(jw)) = 1+ e(-jw)[a(1)+e(-jw)[a(2)+e(-jw)[a(3)+..
  48.             ...[a(p-1)+e(-jw)a(p)]]]]
  49.     */
  50.     cs = (float)cos((double)w);
  51.     sn = -(float)sin((double)w);
  52.     c_re = cs*a[p];
  53.     c_im = sn*a[p];
  54.     for(i=p-1; i > 0; i--)
  55.     {
  56.         /* add a[i] */
  57.         c_re += a[i];
  58.         /* multiply by exp(-jw) */
  59.         c_im = cs*(tmp=c_im) + sn*c_re;
  60.         c_re = cs*c_re - sn*tmp;
  61.     }
  62.     /* add one */
  63.     c_re += 1.0;
  64.     return(SQR(c_re) + SQR(c_im));
  65. } /* LPC_AEJW */
  66. /*
  67.     Name: lpc_bwex- Move the zeros of A(z) toward the origin.
  68.     Aliases: lpc_bw_expand
  69.     Description:
  70.         Expand the zeros of the LPC filter by gamma, which
  71.         moves each zero radially into the origin.
  72. <nf>
  73.         for j = 1 to p
  74.             aw[j] = a[j]*gamma^j
  75. </nf>
  76.         (Can also be used to perform an exponential windowing procedure).
  77.     Inputs:
  78.         a- lpc vector (order p, a[1..p])
  79.         gamma- the bandwidth expansion factor
  80.         p- order of lpc filter
  81.     Outputs:
  82.         aw- the bandwidth expanded LPC filter
  83.     Returns: NULL
  84.     See_Also: lpc_lagw(3l)
  85.     Includes:
  86.         spbstd.h
  87.         lpc.h
  88.     Systems and Info. Science Lab
  89.     Copyright (c) 1995 by Texas Instruments, Inc.  All rights reserved.
  90. */
  91. int lpc_bwex(float *a, float *aw, float gamma, int p)
  92. {
  93.     int i;
  94.     float gk;
  95.     for(i=1,gk=gamma; i <= p; i++, gk *= gamma)
  96.         aw[i] = a[i]*gk;
  97.     return(0);
  98. }
  99. /*
  100.     Name: lpc_clmp- Sort and ensure minimum separation in LSPs.
  101.     Aliases: lpc_clamp
  102.     Description:
  103.         Ensure that all LSPs are ordered and separated
  104.         by at least delta.  The algorithm isn't guarenteed
  105.         to work, so it prints an error message when it fails
  106.         to sort the LSPs properly.
  107.     Inputs:
  108.         w- lsp vector (order p, w[1..p])
  109.         delta- the clamping factor
  110.         p- order of lpc filter
  111.     Outputs:
  112.         w- the sorted and clamped lsps
  113.     Returns: NULL
  114.     See_Also:
  115.     Includes:
  116.         spbstd.h
  117.         lpc.h
  118.     Bugs: 
  119.         Currently only supports 10 loops, which is too
  120.         complex and perhaps unneccesary.
  121.     Systems and Info. Science Lab
  122.     Copyright (c) 1995 by Texas Instruments, Inc.  All rights reserved.
  123. *
  124. */
  125. #define MAX_LOOPS 10
  126. int lpc_clmp(float *w, float delta, int p)
  127. {
  128.     int i,j,unsorted;
  129.     float tmp,d,step1,step2;
  130.     /* sort the LSPs- for 10 loops, complexity is approximately 150 p */  
  131.     for (j=0,unsorted=TRUE; unsorted && (j < MAX_LOOPS); j++)
  132.     {
  133.         for(i=1,unsorted=FALSE; i < p; i++)
  134.             if (w[i] > w[i+1])
  135.             {
  136.                 tmp = w[i+1];
  137. w[i+1] = w[i];
  138. w[i] = tmp;
  139.                 unsorted = TRUE;
  140.     }
  141.     }
  142.     /* ensure minimum separation */
  143.     if (!unsorted) 
  144.     {
  145.         for(j=0; j < MAX_LOOPS; j++)
  146.         {
  147.             for(i=1; i < p; i++)
  148.             {
  149.                 if ((d = w[i+1]-w[i]) < delta)
  150.                 {
  151.                     step1 = step2 = (delta-d)/2.0;
  152.                     if (i==1 && (w[i] < delta))
  153.                     {
  154.                         step1 = w[i]/2.0;
  155.             }
  156.                     else if (i > 1)
  157.                     {
  158.                         if ((tmp = w[i] - w[i-1]) < delta)
  159.                             step1 = 0;
  160.                         else if (tmp < 2*delta)
  161.                             step1 = (tmp-delta)/2.0;
  162.     }
  163.                     if (i==(p-1) && (w[i+1] > (1.0-delta)))
  164.                     {
  165.                         step2 = (1-w[i+1])/2.0;
  166.     }
  167.                     else if (i < (p-1))
  168.                     {
  169.                         if ((tmp = w[i+2] - w[i+1]) < delta)
  170.                             step2 = 0;
  171.                         else if (tmp < 2*delta)
  172.                             step2 = (tmp-delta)/2.0;
  173.     }
  174.                     w[i] -= step1;
  175.     w[i+1] += step2;
  176.         }
  177.     }
  178.         }
  179.     }
  180.     /* Debug: check if the minimum separation rule was met */
  181.     for(j=1; j < p; j++)
  182.       if ((w[j+1]-w[j]) < 0.99*delta)
  183.           (void)fprintf(stderr,"%s: LSPs not separated by enough (line %d)n",
  184.               __FILE__,__LINE__);
  185.     if (unsorted)
  186.         (void)fprintf(stderr,"%s: LSPs still unsorted (line %d)n",
  187.       __FILE__,__LINE__);
  188.     return(0);
  189. }
  190. /*
  191.     Name: lpc_schr- Schur recursion (autocorrelations to refl coef)
  192.     Aliases: lpc_schur
  193.     Description:
  194.         Compute reflection coefficients from autocorrelations
  195.         based on schur recursion.  Will also compute predictor
  196.         parameters by calling lpc_refl2pred(3l) if necessary.
  197.     Inputs:
  198.         r- autocorrelation vector (r[0..p]).
  199.         p- order of lpc filter.
  200.     Outputs:
  201.         a-     predictor parameters    (can be NULL)
  202.         k_tmp- reflection coefficients (can be NULL)
  203.     Returns:
  204.         alphap- the minimum residual energy
  205.     Includes:
  206.         spbstd.h
  207.         lpc.h
  208.     See_Also:
  209.         lpc_refl2pred(3l) in lpc.h or lpc(3l)
  210. */
  211. float lpc_schr(float *r, float *a, float *k_tmp, int p)
  212. {
  213.     int i,j;
  214.     float temp,alphap,*y1,*y2,*k;
  215.     MEM_ALLOC(MALLOC,y1,p+2,float);
  216.     MEM_ALLOC(MALLOC,y2,p+2,float);
  217.     if (k_tmp == NULL)
  218.     {
  219.         MEM_ALLOC(MALLOC,k,p+1,float);
  220.     }
  221.     else
  222.         k = k_tmp;
  223.     k[1] = -r[1]/r[0];
  224.     alphap = r[0]*(1-SQR(k[1]));
  225.     y2[1] = r[1];
  226.     y2[2] = r[0]+k[1]*r[1];
  227.     for(i=2; i <= p; i++)
  228.     {
  229.         y1[1] = temp = r[i];
  230.         for(j=1; j < i; j++)
  231.         {
  232.             y1[j+1] = y2[j] + k[j]*temp;
  233.             temp += k[j]*y2[j];
  234.             y2[j] = y1[j];
  235.         }
  236.         k[i] = -temp/y2[i];
  237.         y2[i+1] = y2[i]+k[i]*temp;
  238.         y2[i] = y1[i];
  239.         alphap *= 1-SQR(k[i]);
  240.     }
  241.     if (a != NULL)
  242.     {
  243.         (void)lpc_refl2pred(k,a,p);
  244.     }
  245.     if (k_tmp == NULL)
  246.     {
  247.         MEM_FREE(FREE,k);
  248.     }
  249.     MEM_FREE(FREE,y2);
  250.     MEM_FREE(FREE,y1);
  251.     return(alphap);
  252. }
  253. /* minimum LSP separation-- a global variable */
  254. float lsp_delta = 0.0;
  255. /* private functions */
  256. static float lsp_g(float x,float *c,int p2);
  257. static int   lsp_roots(float *w,float **c,int p2);
  258. #define DELTA  0.00781250
  259. #define BISECTIONS 4
  260.     
  261. /* LPC_PRED2LSP
  262.       get LSP coeffs from the predictor coeffs
  263.       Input:
  264.          a- the predictor coefficients
  265.          p- the predictor order
  266.       Output:
  267.          w- the lsp coefficients
  268.    Reference:  Kabal and Ramachandran
  269. */
  270. int lpc_pred2lsp(float *a,float *w,int p)
  271. {
  272.     int i,p2;
  273.     float **c;
  274.     p2 = p/2;
  275.     MEM_2ALLOC(MALLOC,c,2,p2+1,float);
  276.     c[0][p2] = c[1][p2] = 1.0;
  277.     for(i=1; i <= p2; i++)
  278.     {
  279.         c[0][p2-i] = (a[i] + a[p+1-i] - c[0][p2+1-i]);
  280.         c[1][p2-i] = c[1][p2+1-i] + a[i] - a[p+1-i];
  281.     }
  282.     c[0][0] /= 2.0;
  283.     c[1][0] /= 2.0;
  284.     i = lsp_roots(w,c,p2);
  285.     if (i)
  286.     {
  287.         for(i=1; i <= p; i++)
  288.             (void)fprintf(stderr,"%11.7f ",a[i]);
  289.         (void)fprintf(stderr,"n");
  290.     }
  291.     /* ensure minimum separation and sort */
  292.     (void)lpc_clamp(w,lsp_delta,p);
  293.     MEM_2FREE(FREE,c);
  294.     return(i);
  295. } /* LPC_PRED2LSP */
  296. /* LPC_PRED2REFL
  297.       get refl coeffs from the predictor coeffs
  298.       Input:
  299.          a- the predictor coefficients
  300.          p- the predictor order
  301.       Output:
  302.          k- the reflection coefficients
  303.    Reference:  Markel and Gray, Linear Prediction of Speech
  304. */
  305. int lpc_pred2refl(float *a,float *k,int p)
  306. {
  307.     float *b,*b1,e;
  308.     int   i,j;
  309.     MEM_ALLOC(MALLOC,b,p+1,float);
  310.     MEM_ALLOC(MALLOC,b1,p+1,float);
  311.     /* equate temporary variables (b = a) */
  312.     for(i=1; i <= p; i++)
  313.         b[i] = a[i];
  314.     /* compute reflection coefficients */
  315.     for(i=p; i > 0; i--)
  316.     {
  317.         k[i] = b[i];
  318.         e = 1 - SQR(k[i]);
  319.         for(j=1; j < i; j++)
  320.             b1[j] = b[j];
  321.         for(j=1; j < i; j++)
  322.             b[j] = (b1[j] - k[i]*b1[i-j])/e;
  323.     }
  324.     MEM_FREE(FREE,b1);
  325.     MEM_FREE(FREE,b);
  326.     return(0);
  327. }
  328. /* LPC_LSP2PRED
  329.       get predictor coefficients from the LSPs
  330.    Synopsis: lpc_lsp2pred(w,a,p)
  331.       Input:
  332.          w- the LSPs
  333.          p- the predictor order
  334.       Output:
  335.          a- the predictor coefficients
  336.    Reference:  Kabal and Ramachandran
  337. */
  338. int lpc_lsp2pred(float *w,float *a,int p)
  339. {
  340.     int i,j,k,p2;
  341.     float **f,c[2];
  342.     /* ensure minimum separation and sort */
  343.     (void)lpc_clamp(w,lsp_delta,p);
  344.     p2 = p/2;
  345.     MEM_2ALLOC(MALLOC,f,2,p2+1,float);
  346.     f[0][0] = f[1][0] = 1.0;
  347.     f[0][1] = (float)-2.0*cos((double)w[1]*M_PI);
  348.     f[1][1] = (float)-2.0*cos((double)w[2]*M_PI);
  349.     k = 3;
  350.     for(i=2; i <= p2; i++)
  351.     {
  352.         c[0] = (float)-2.0*cos((double)w[k++]*M_PI);
  353.         c[1] = (float)-2.0*cos((double)w[k++]*M_PI);
  354.         f[0][i] = f[0][i-2];
  355.         f[1][i] = f[1][i-2];
  356.         for(j=i; j >= 2; j--)
  357.         {
  358.             f[0][j] += c[0]*f[0][j-1]+f[0][j-2];
  359.             f[1][j] += c[1]*f[1][j-1]+f[1][j-2];
  360.         }
  361.         f[0][1] += c[0]*f[0][0];
  362.         f[1][1] += c[1]*f[1][0];
  363.     }
  364.     for(i=p2; i > 0; i--)
  365.     {
  366.         f[0][i] += f[0][i-1];
  367.         f[1][i] -= f[1][i-1];
  368.         a[i] = 0.50*(f[0][i]+f[1][i]);
  369.         a[p+1-i] = 0.50*(f[0][i]-f[1][i]);
  370.     }
  371.     MEM_2FREE(FREE,f);
  372.     return(0);
  373. }
  374. /* LPC_REFL2PRED
  375.       get predictor coefficients from the reflection coeffs
  376.       Input:
  377.          k- the reflection coeffs
  378.          p- the predictor order
  379.       Output:
  380.          a- the predictor coefficients
  381.    Reference:  Markel and Gray, Linear Prediction of Speech
  382. */
  383. int lpc_refl2pred(float *k,float *a,int p)
  384. {
  385.     int   i,j;
  386.     float *a1;
  387.     MEM_ALLOC(MALLOC,a1,p+1,float);
  388.     for(i=1; i <= p; i++)
  389.     {
  390.         /* refl to a recursion */
  391.         a[i] = k[i];
  392.         for(j=1; j < i; j++)
  393.             a1[j] = a[j];
  394.         for(j=1; j < i; j++)
  395.             a[j] = a1[j] + k[i]*a1[i-j];
  396.     }
  397.     MEM_FREE(FREE,a1);
  398.     return(0);
  399. } /* LPC_REFL2PRED */
  400. /* G - compute the value of the Chebychev series
  401.                 sum c_k T_k(x) = x b_1(x) - b_2(x) + c_0
  402.                 b_k(x) = 2x b_{k+1}(x) - b_{k+2}(x) + c_k */
  403. static float lsp_g(float x,float *c,int p2)
  404. {
  405.     int i;
  406.     float b[3];
  407.     b[1] = b[2] = 0.0;
  408.     for(i=p2; i > 0; i--)
  409.     {
  410.         b[0] = 2.0*x*b[1] - b[2] + c[i];
  411.         b[2] = b[1];
  412.         b[1] = b[0];
  413.     }
  414.     b[0] = x*b[1]-b[2]+c[0];
  415.     return(b[0]);
  416. } /* G */
  417. /* LSP_ROOTS
  418.         - find the roots of the two polynomials G_1(x) and G_2(x)
  419.           the first root corresponds to G_1(x)
  420.           compute the inverse cos (and these are the LSFs) */
  421. static int lsp_roots(float *w,float **c,int p2)
  422. {
  423.     int i,k;
  424.     float x,x0,x1,y,*ptr,g0,g1;
  425.     w[0] = 0.0;
  426.     ptr = c[0];
  427.     x = 1.0;
  428.     g0 = lsp_g(x,ptr,p2);
  429.     for(k=1,x = 1.0-DELTA; x > -DELTA-1.0; x -= DELTA)
  430.     {
  431.         /* Search for a zero crossing */
  432.         if (g0*(g1 = lsp_g(x,ptr,p2)) <= 0.0)
  433.         {
  434.             /* Search Incrementally using bisection */
  435.             x0 = x+DELTA;
  436.             x1 = x;
  437.             for(i=0; i < BISECTIONS; i++)
  438.             {
  439.                 x = (x0+x1)/2.0;
  440.                 y = lsp_g(x,ptr,p2);
  441.                 if(y*g0 < 0.0)
  442.                 {
  443.                     x1 = x;
  444.                     g1 = y;
  445.                 }
  446.                 else
  447.                 {
  448.                     x0 = x;
  449.                     g0 = y;
  450.                 }
  451.             }
  452.             /* Linear interpolate */
  453.             x = (g1*x0-g0*x1)/(g1-g0);
  454.             /* Evaluate the LSF */
  455.             w[k] = (float)acos((double)x)/M_PI;
  456.             ptr = c[k % 2];
  457.             k++;
  458.             if (k > 2*p2)
  459.                 return(0);
  460.             g1 = lsp_g(x,ptr,p2);
  461.         }
  462.         g0 = g1;
  463.     }
  464.     (void)fprintf(stderr,"n Error(lsp_roots): LSPs Not All Foundn");
  465.     return(1);
  466. } /* LSP_ROOTS */
  467. /*
  468.     Name: lpc_syn- LPC synthesis filter.
  469.     Aliases: lpc_synthesis
  470.     Description:
  471.         LPC all-pole synthesis filter
  472. <nf>
  473.         for j = 0 to n-1
  474.             y[j] = x[j] - sum(k=1 to p) y[j-k] a[k]
  475. </nf>
  476.     Inputs:
  477.         x- input vector (n samples, x[0..n-1])
  478.         a- lpc vector (order p, a[1..p])
  479.         p- order of lpc filter
  480.         n- number of elements in vector which is to be filtered
  481.         y[-p..-1]- filter memory (past outputs)
  482.     Outputs:
  483.         y- output vector (n samples, y[0..n-1])
  484.     Returns: NULL
  485.     Includes:
  486.         spbstd.h
  487.         lpc.h
  488.     Systems and Info. Science Lab
  489.     Copyright (c) 1995 by Texas Instruments, Inc.  All rights reserved.
  490. */
  491. int lpc_syn(float *x,float *y,float *a,int p,int n)
  492. {
  493.     int i,j;
  494.     for(j=0; j < n; j++)
  495.     {
  496.         for(i=p,y[j]=x[j]; i > 0; i--)
  497.             y[j] -= y[j-i]*a[i];
  498.     }
  499.     return(0);
  500. }