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

语音压缩

开发平台:

C/C++

  1. /*
  2. **
  3. ** File:    lsp.c
  4. **
  5. ** Description: Functions that implement line spectral pair 
  6. **      (LSP) operations.  
  7. **
  8. ** Functions:
  9. **
  10. **  Converting between linear predictive coding (LPC) coefficients
  11. **  and LSP frequencies:
  12. **
  13. **      AtoLsp()
  14. **      LsptoA()
  15. **
  16. **  Vector quantization (VQ) of LSP frequencies:
  17. **
  18. **      Lsp_Qnt()
  19. **      Lsp_Svq()
  20. **      Lsp_Inq()
  21. **
  22. **  Interpolation of LSP frequencies:
  23. **
  24. **      Lsp_Int()
  25. */
  26. /*
  27.     ITU-T G.723 Speech Coder   ANSI-C Source Code     Version 5.00
  28.     copyright (c) 1995, AudioCodes, DSP Group, France Telecom,
  29.     Universite de Sherbrooke.  All rights reserved.
  30. */
  31. #include <stdio.h>
  32. #include "typedef.h"
  33. #include "basop.h"
  34. #include "cst_lbc.h"
  35. #include "tab_lbc.h"
  36. #include "lsp.h"
  37. /*
  38. **
  39. ** Function:            AtoLsp()
  40. **
  41. ** Description:     Transforms 10 LPC coefficients to the 10
  42. **          corresponding LSP frequencies for a subframe.
  43. **          This transformation is done once per frame,
  44. **          for subframe 3 only.  The transform algorithm
  45. **          generates sum and difference polynomials from
  46. **          the LPC coefficients.  It then evaluates the
  47. **          sum and difference polynomials at uniform
  48. **          intervals of pi/256 along the unit circle.
  49. **          Intervals where a sign change occurs are
  50. **          interpolated to find the zeros of the
  51. **          polynomials, which are the LSP frequencies.
  52. **
  53. ** Links to text:   Section 2.5
  54. **
  55. ** Arguments:       
  56. **
  57. **  Word16 *LspVect     Empty Buffer
  58. **  Word16 Lpc[]        Unquantized LPC coefficients (10 words)
  59. **  Word16 PrevLsp[]    LSP frequencies from the previous frame (10 words)
  60. **
  61. ** Outputs:
  62. **
  63. **  Word16 LspVect[]    LSP frequencies for the current frame (10 words)
  64. **
  65. ** Return value:        None
  66. **
  67. **/
  68. void AtoLsp( Word16 *LspVect, Word16 *Lpc, Word16 *PrevLsp )
  69. {
  70.     int   i,j,k ;
  71.     Word32   Lpq[LpcOrder+2] ;
  72.     Word16   Spq[LpcOrder+2] ;
  73.     Word16   Exp   ;
  74.     Word16   LspCnt ;
  75.     Word32   PrevVal,CurrVal   ;
  76.     Word32   Acc0,Acc1   ;
  77.  /*
  78.   * Perform a bandwidth expansion on the LPC coefficients.  This
  79.   * scales the poles of the LPC synthesis filter by a factor of
  80.   * 0.994.
  81.   */
  82.     for ( i = 0 ; i < LpcOrder ; i ++ )
  83.         LspVect[i] = mult_r( Lpc[i], BandExpTable[i] ) ;
  84.  /*
  85.   * Compute the sum and difference polynomials with the roots at z =
  86.   * -1 (sum) or z = +1 (difference) removed.  Let these polynomials
  87.   * be P(z) and Q(z) respectively, and let their coefficients be
  88.   * {p_i} amd {q_i}.  The coefficients are stored in the array Lpq[]
  89.   * as follows: p_0, q_0, p_1, q_1, ..., p_5, q_5.  There is no need
  90.   * to store the other coefficients because of symmetry.
  91.   */
  92.  /*
  93.   * Set p_0 = q_0 = 1.  The LPC coefficients are already scaled by
  94.   *  1/4.  P(z) and Q(z) are scaled by an additional scaling factor of
  95.   *  1/16, for an overall factor of 1/64 = 0x02000000L.
  96.   */
  97.     Lpq[0] = Lpq[1] = (Word32) 0x02000000L ;
  98.  /*
  99.   * This loop computes the coefficients of P(z) and Q(z).  The long
  100.   * division (to remove the real zeros) is done recursively.
  101.   */
  102.     for ( i = 0 ; i < LpcOrder/2 ; i ++ ) {
  103.         /* P(z) */
  104.         Acc0 = L_negate( Lpq[2*i+0] ) ;
  105.         Acc1 = L_deposit_h( LspVect[i] ) ;
  106.         Acc1 = L_shr( Acc1, (Word16) 4 ) ;
  107.         Acc0 = L_sub( Acc0, Acc1 ) ;
  108.         Acc1 = L_deposit_h( LspVect[LpcOrder-1-i] ) ;
  109.         Acc1 = L_shr( Acc1, (Word16) 4 ) ;
  110.         Acc0 = L_sub( Acc0, Acc1 ) ;
  111.         Lpq[2*i+2] = Acc0 ;
  112.         /* Q(z) */
  113.         Acc0 = Lpq[2*i+1] ;
  114.         Acc1 = L_deposit_h( LspVect[i] ) ;
  115.         Acc1 = L_shr( Acc1, (Word16) 4 ) ;
  116.         Acc0 = L_sub( Acc0, Acc1 ) ;
  117.         Acc1 = L_deposit_h( LspVect[LpcOrder-1-i] ) ;
  118.         Acc1 = L_shr( Acc1, (Word16) 4 ) ;
  119.         Acc0 = L_add( Acc0, Acc1 ) ;
  120.         Lpq[2*i+3] = Acc0 ;
  121.     }
  122.  /*
  123.   * Divide p_5 and q_5 by 2 for proper weighting during polynomial
  124.   * evaluation.
  125.   */
  126.     Lpq[LpcOrder+0] = L_shr( Lpq[LpcOrder+0], (Word16) 1 ) ;
  127.     Lpq[LpcOrder+1] = L_shr( Lpq[LpcOrder+1], (Word16) 1 ) ;
  128.  /*
  129.   * Normalize the polynomial coefficients and convert to shorts
  130.   */
  131.     /* Find the maximum */
  132.     Acc1 = L_abs( Lpq[0] ) ;
  133.     for ( i = 1 ; i < LpcOrder+2 ; i ++ ) {
  134.         Acc0 = L_abs( Lpq[i] ) ;
  135.         if ( Acc0 > Acc1 )
  136.             Acc1 = Acc0 ;
  137.     }
  138.     /* Compute the normalization factor */
  139.     Exp = norm_l( Acc1 ) ;
  140.     /* Normalize and convert to shorts */
  141.     for ( i = 0 ; i < LpcOrder+2 ; i ++ ) {
  142.         Acc0 = L_shl( Lpq[i], Exp ) ;
  143.         Spq[i] = round( Acc0 ) ;
  144.     }
  145.  /*
  146.   * Initialize the search loop
  147.   */
  148.  /*
  149.   * The variable k is a flag that indicates which polynomial (sum or
  150.   * difference) the algorithm is currently evaluating.  Start with
  151.   * the sum.
  152.   */
  153.     k = 0 ;
  154.     /* Evaluate the sum polynomial at frequency zero */
  155.     PrevVal = (Word32) 0 ;
  156.     for ( j = 0 ; j <= LpcOrder/2 ; j ++ )
  157.         PrevVal = L_mac( PrevVal, Spq[2*j], CosineTable[0] ) ;
  158.  /*
  159.   * Search loop.  Evaluate P(z) and Q(z) at uniform intervals of
  160.   * pi/256 along the unit circle.  Check for zero crossings.  The
  161.   * zeros of P(w) and Q(w) alternate, so only one of them need by
  162.   * evaluated at any given step.
  163.   */
  164.     LspCnt = (Word16) 0 ;
  165.     for ( i = 1 ; i < CosineTableSize/2 ; i ++ ) {
  166.         /* Evaluate the selected polynomial */
  167.         CurrVal = (Word32) 0 ;
  168.         for ( j = 0 ; j <= LpcOrder/2 ; j ++ )
  169.             CurrVal = L_mac( CurrVal, Spq[LpcOrder-2*j+k],
  170.                                     CosineTable[i*j%CosineTableSize] ) ;
  171.         /* Check for a sign change, indicating a zero crossing */
  172.         if ( (CurrVal ^ PrevVal) < (Word32) 0 ) {
  173.  /*
  174.   * Interpolate to find the bottom 7 bits of the
  175.   * zero-crossing frequency
  176.   */
  177.             Acc0 = L_abs( CurrVal ) ;
  178.             Acc1 = L_abs( PrevVal ) ;
  179.             Acc0 = L_add( Acc0, Acc1 ) ;
  180.             /* Normalize the sum */
  181.             Exp = norm_l( Acc0 ) ;
  182.             Acc0 = L_shl( Acc0, Exp ) ;
  183.             Acc1 = L_shl( Acc1, Exp ) ;
  184.             Acc1 = L_shr( Acc1, (Word16) 8 ) ;
  185.             LspVect[LspCnt] = div_l( Acc1, extract_h( Acc0 ) ) ;
  186.  /*
  187.   * Add the upper part of the zero-crossing frequency,
  188.   * i.e. bits 7-15
  189.   */
  190.             Exp = shl( (Word16) (i-1), (Word16) 7 ) ;
  191.             LspVect[LspCnt] = add( LspVect[LspCnt], Exp ) ;
  192.             LspCnt ++ ;
  193.             /* Check if all zeros have been found */
  194.             if ( LspCnt == (Word16) LpcOrder )
  195.                 break ;
  196.  /*
  197.   * Switch the pointer between sum and difference polynomials
  198.   */
  199.             k ^= 1 ;
  200.  /*
  201.   * Evaluate the new polynomial at the current frequency
  202.   */
  203.             CurrVal = (Word32) 0 ;
  204.             for ( j = 0 ; j <= LpcOrder/2 ; j ++ )
  205.                 CurrVal = L_mac( CurrVal, Spq[LpcOrder-2*j+k],
  206.                                     CosineTable[i*j%CosineTableSize] ) ;
  207.         }
  208.         /* Update the previous value */
  209.         PrevVal = CurrVal ;
  210.     }
  211.  /*
  212.   * Check if all 10 zeros were found.  If not, ignore the results of
  213.   * the search and use the previous frame's LSP frequencies instead.
  214.   */
  215.     if ( LspCnt != (Word16) LpcOrder ) {
  216.         for ( j = 0 ; j < LpcOrder ; j ++ )
  217.             LspVect[j] = PrevLsp[j] ;
  218.     }
  219.     return ;
  220. }
  221. /*
  222. **
  223. ** Function:            Lsp_Qnt()
  224. **
  225. ** Description:     Vector quantizes the LSP frequencies.  The LSP
  226. **          vector is divided into 3 sub-vectors, or
  227. **          bands, of dimension 3, 3, and 4.  Each band is
  228. **          quantized separately using a different VQ
  229. **          table.  Each table has 256 entries, so the
  230. **          quantization generates three indices of 8 bits
  231. **          each.  (Only the LSP vector for subframe 3 is
  232. **          quantized per frame.)
  233. **
  234. ** Links to text:   Section 2.5
  235. **
  236. ** Arguments:       
  237. **
  238. **  Word16 CurrLsp[]    Unquantized LSP frequencies for the current frame (10 words)
  239. **  Word16 PrevLsp[]    LSP frequencies from the previous frame (10 words)
  240. **
  241. ** Outputs:             Quantized LSP frequencies for the current frame (10 words)
  242. **
  243. ** Return value:
  244. **
  245. **  Word32      Long word packed with the 3 VQ indices.  Band 0
  246. **          corresponds to bits [23:16], band 1 corresponds
  247. **          to bits [15:8], and band 2 corresponds to bits [7:0].
  248. **          (Bit 0 is the least significant.)
  249. **
  250. */
  251. Word32   Lsp_Qnt( Word16 *CurrLsp, Word16 *PrevLsp )
  252. {
  253.     int   i ;
  254.     Word16   Wvect[LpcOrder] ;
  255.     Word16   Tmp0,Tmp1   ;
  256.     Word16   Exp   ;
  257.  /*
  258.   * Compute the VQ weighting vector.  The weights assign greater
  259.   * precision to those frequencies that are closer together.
  260.   */
  261.     /* Compute the end differences */
  262.     Wvect[0] = sub( CurrLsp[1], CurrLsp[0] ) ;
  263.     Wvect[LpcOrder-1] = sub( CurrLsp[LpcOrder-1], CurrLsp[LpcOrder-2] ) ;
  264.     /* Compute the rest of the differences */
  265.     for ( i = 1 ; i < LpcOrder-1 ; i ++ ) {
  266.         Tmp0 = sub( CurrLsp[i+1], CurrLsp[i] ) ;
  267.         Tmp1 = sub( CurrLsp[i], CurrLsp[i-1] ) ;
  268.         if ( Tmp0 > Tmp1 )
  269.             Wvect[i] = Tmp1 ;
  270.         else
  271.             Wvect[i] = Tmp0 ;
  272.     }
  273.     /* Invert the differences */
  274.     Tmp0 = (Word16) 0x0020 ;
  275.     for ( i = 0 ; i < LpcOrder ; i ++ ) {
  276.         if ( Wvect[i] > Tmp0 )
  277.             Wvect[i] = div_s( Tmp0, Wvect[i] ) ;
  278.         else
  279.             Wvect[i] = MAX_16 ;
  280.     }
  281.     /* Normalize the weight vector */
  282.     Tmp0 = (Word16) 0 ;
  283.     for ( i = 0 ; i < LpcOrder ; i ++ )
  284.         if ( Wvect[i] > Tmp0 )
  285.             Tmp0 = Wvect[i] ;
  286.     Exp = norm_s( Tmp0 ) ;
  287.     for ( i = 0 ; i < LpcOrder ; i ++ )
  288.         Wvect[i] = shl( Wvect[i], Exp ) ;
  289.  /*
  290.   * Compute the VQ target vector.  This is the residual that remains
  291.   * after subtracting both the DC and predicted
  292.   * components.
  293.   */
  294.  /*
  295.   * Subtract the DC component from both the current and previous LSP
  296.   * vectors.
  297.   */
  298.     for ( i = 0 ; i < LpcOrder ; i ++ ) {
  299.         CurrLsp[i] = sub( CurrLsp[i], LspDcTable[i] ) ;
  300.         PrevLsp[i] = sub( PrevLsp[i], LspDcTable[i] ) ;
  301.     }
  302.  /*
  303.   * Generate the prediction vector and subtract it.  Use a constant
  304.   * first-order predictor based on the previous (DC-free) LSP
  305.   * vector.
  306.   */
  307.     for ( i = 0 ; i < LpcOrder ; i ++ ) {
  308.         Tmp0 = mult_r( PrevLsp[i], (Word16) LspPrd0 ) ;
  309.         CurrLsp[i] = sub( CurrLsp[i], Tmp0 ) ;
  310.     }
  311.  /*
  312.   * Add the DC component back to the previous LSP vector.  This
  313.   * vector is needed in later routines.
  314.   */
  315.     for ( i = 0 ; i < LpcOrder ; i ++ )
  316.         PrevLsp[i] = add( PrevLsp[i], LspDcTable[i] ) ;
  317.  /*
  318.   * Do the vector quantization for all three bands
  319.   */
  320.     return Lsp_Svq( CurrLsp, Wvect ) ;
  321. }
  322. /*
  323. **
  324. ** Function:            Lsp_Svq()
  325. **
  326. ** Description:     Performs the search of the VQ tables to find
  327. **          the optimum LSP indices for all three bands.
  328. **          For each band, the search finds the index which 
  329. **          minimizes the weighted squared error between 
  330. **          the table entry and the target.
  331. **
  332. ** Links to text:   Section 2.5
  333. **
  334. ** Arguments:       
  335. **
  336. **  Word16 Tv[]     VQ target vector (10 words)
  337. **  Word16 Wvect[]      VQ weight vector (10 words)
  338. **
  339. ** Outputs:         None
  340. **
  341. ** Return value:    
  342. **
  343. **  Word32      Long word packed with the 3 VQ indices.  Band 0
  344. **          corresponds to bits [23:16], band 1 corresponds
  345. **          to bits [15:8], and band 2 corresponds to bits [7:0].
  346. **              
  347. */
  348. Word32   Lsp_Svq( Word16 *Tv, Word16 *Wvect )
  349. {
  350.     int   i,j,k ;
  351.     Word32   Rez,Indx    ;
  352.     Word32   Acc0,Acc1   ;
  353.     Word16   Tmp[LpcOrder] ;
  354.     Word16  *LspQntPnt  ;
  355.  /*
  356.   * Initialize the return value
  357.   */
  358.     Rez = (Word32) 0 ;
  359.  /*
  360.   * Quantize each band separately
  361.   */
  362.     for ( k = 0 ; k < LspQntBands ; k ++ ) {
  363.  /*
  364.   * Search over the entire VQ table to find the index that
  365.   * minimizes the error.
  366.   */
  367.         /* Initialize the search */
  368.         Acc1 = (Word32) -1 ;
  369.         Indx = (Word32) 0 ;
  370.         LspQntPnt = BandQntTable[k] ;
  371.         for ( i = 0 ; i < LspCbSize ; i ++ ) {
  372.  /*
  373.   * Generate the metric, which is the negative error with the
  374.   * constant component removed.
  375.   */
  376.             for ( j = 0 ; j < BandInfoTable[k][1] ; j ++ )
  377.                 Tmp[j] = mult_r( Wvect[BandInfoTable[k][0]+j],
  378.                                                             LspQntPnt[j] ) ;
  379.             Acc0 = (Word32) 0 ;
  380.             for ( j = 0 ; j < BandInfoTable[k][1] ; j ++ )
  381.                 Acc0 = L_mac( Acc0, Tv[BandInfoTable[k][0]+j], Tmp[j] ) ;
  382.             Acc0 = L_shl( Acc0, (Word16) 1 ) ;
  383.             for ( j = 0 ; j < BandInfoTable[k][1] ; j ++ )
  384.                 Acc0 = L_msu( Acc0, LspQntPnt[j], Tmp[j] ) ;
  385.             LspQntPnt += BandInfoTable[k][1] ;
  386.  /*
  387.   * Compare the metric to the previous maximum and select the
  388.   * new index
  389.   */
  390.             if ( Acc0 > Acc1 ) {
  391.                 Acc1 = Acc0 ;
  392.                 Indx = (Word32) i ;
  393.             }
  394.         }
  395.  /*
  396.   * Pack the result with the optimum index for this band
  397.   */
  398.         Rez = L_shl( Rez, (Word16) LspCbBits ) ;
  399.         Rez = L_add( Rez, Indx ) ;
  400.     }
  401.     return Rez ;
  402. }
  403. /*
  404. **
  405. ** Function:            Lsp_Inq()
  406. **
  407. ** Description:     Performs inverse vector quantization of the
  408. **          LSP frequencies.  The LSP vector is divided
  409. **          into 3 sub-vectors, or bands, of dimension 3,
  410. **          3, and 4.  Each band is inverse quantized
  411. **          separately using a different VQ table.  Each
  412. **          table has 256 entries, so each VQ index is 8
  413. **          bits.  (Only the LSP vector for subframe 3 is
  414. **          quantized per frame.)
  415. **
  416. ** Links to text:   Sections 2.6, 3.2
  417. **
  418. ** Arguments:
  419. **
  420. **  Word16 *Lsp     Empty buffer
  421. **  Word16 PrevLsp[]    Quantized LSP frequencies from the previous frame
  422. **               (10 words)
  423. **  Word32 LspId        Long word packed with the 3 VQ indices.  Band 0
  424. **               corresponds to bits [23:16], band 1 corresponds
  425. **               to bits [15:8], and band 2 corresponds to bits
  426. **               [7:0].
  427. **  Word16 Crc      Frame erasure indicator
  428. **
  429. ** Outputs:
  430. **
  431. **  Word16 Lsp[]        Quantized LSP frequencies for current frame (10
  432. **               words)
  433. **
  434. ** Return value:         None
  435. **
  436. */
  437. void Lsp_Inq( Word16 *Lsp, Word16 *PrevLsp, Word32 LspId, Word16 Crc )
  438. {
  439.     int  i,j   ;
  440.     Word16  *LspQntPnt  ;
  441.     Word16   Scon  ;
  442.     Word16   Lprd  ;
  443.     Word16   Tmp   ;
  444.     Flag     Test  ;
  445.  /*
  446.   * Check for frame erasure.  If a frame erasure has occurred, the
  447.   * resulting VQ table entries are zero.  In addition, a different
  448.   * fixed predictor and minimum frequency separation are used.
  449.   */
  450.     if ( Crc == (Word16) 0 ) {
  451.         Scon = (Word16) 0x0100 ;
  452.         Lprd = LspPrd0 ;
  453.     }
  454.     else {
  455.         LspId = (Word32) 0 ;
  456.         Scon = (Word16) 0x0200 ;
  457.         Lprd = LspPrd1 ;
  458.     }
  459.  /*
  460.   * Inverse quantize the 10th-order LSP vector.  Each band is done
  461.   * separately.
  462.   */
  463.     for ( i = LspQntBands-1; i >= 0 ; i -- ) {
  464.  /*
  465.   * Get the VQ table entry corresponding to the transmitted index
  466.   */
  467.         Tmp = (Word16) ( LspId & (Word32) 0x000000ff ) ;
  468.         LspId >>= 8 ;
  469.         LspQntPnt = BandQntTable[i] ;
  470.         for ( j = 0 ; j < BandInfoTable[i][1] ; j ++ )
  471.             Lsp[BandInfoTable[i][0] + j] =
  472.                                 LspQntPnt[Tmp*BandInfoTable[i][1] + j] ;
  473.     }
  474.  /*
  475.   * Subtract the DC component from the previous frame's quantized
  476.   * vector
  477.   */
  478.     for ( j = 0 ; j < LpcOrder ; j ++ )
  479.         PrevLsp[j] = sub(PrevLsp[j], LspDcTable[j] ) ;
  480.  /*
  481.   * Generate the prediction vector using a fixed first-order
  482.   * predictor based on the previous frame's (DC-free) quantized
  483.   * vector
  484.   */
  485.     for ( j = 0 ; j < LpcOrder ; j ++ ) {
  486.         Tmp = mult_r( PrevLsp[j], Lprd ) ;
  487.         Lsp[j] = add( Lsp[j], Tmp ) ;
  488.     }
  489.  /*
  490.   * Add the DC component back to the previous quantized vector,
  491.   * which is needed in later routines
  492.   */
  493.     for ( j = 0 ; j < LpcOrder ; j ++ ) {
  494.         PrevLsp[j] = add( PrevLsp[j], LspDcTable[j] ) ;
  495.         Lsp[j] = add( Lsp[j], LspDcTable[j] ) ;
  496.     }
  497.  /*
  498.   * Perform a stability test on the quantized LSP frequencies.  This
  499.   * test checks that the frequencies are ordered, with a minimum
  500.   * separation between each.  If the test fails, the frequencies are
  501.   * iteratively modified until the test passes.  If after 10
  502.   * iterations the test has not passed, the previous frame's
  503.   * quantized LSP vector is used.
  504.   */
  505.     for ( i = 0 ; i < LpcOrder ; i ++ ) {
  506.         /* Check the first frequency */
  507.         if ( Lsp[0] < (Word16) 0x180 )
  508.             Lsp[0] = (Word16) 0x180 ;
  509.         /* Check the last frequency */
  510.         if ( Lsp[LpcOrder-1] > (Word16) 0x7e00 )
  511.             Lsp[LpcOrder-1] = (Word16) 0x7e00 ;
  512.         /* Perform the modification */
  513.         for ( j = 1 ; j < LpcOrder ; j ++ ) {
  514.             Tmp = add( Scon, Lsp[j-1] ) ;
  515.             Tmp = sub( Tmp, Lsp[j] ) ;
  516.             if ( Tmp > (Word16) 0 ) {
  517.                 Tmp = shr( Tmp, (Word16) 1 ) ;
  518.                 Lsp[j-1] = sub( Lsp[j-1], Tmp ) ;
  519.                 Lsp[j] = add( Lsp[j], Tmp ) ;
  520.             }
  521.         }
  522.         Test = False ;
  523.  /*
  524.   * Test the modified frequencies for stability.  Break out of
  525.   * the loop if the frequencies are stable.
  526.   */
  527.         for ( j = 1 ; j < LpcOrder ; j ++ ) {
  528.             Tmp = add( Lsp[j-1], Scon ) ;
  529.             Tmp = sub( Tmp, (Word16) 4 ) ;
  530.             Tmp = sub( Tmp, Lsp[j] ) ;
  531.             if ( Tmp > (Word16) 0 )
  532.                 Test = True ;
  533.         }
  534.         if ( Test == False )
  535.             break ;
  536.     }
  537.  /*
  538.   * Return the result of the stability check.  True = not stable,
  539.   * False = stable.
  540.   */
  541.     if ( Test == True) {
  542.         for ( j = 0 ; j < LpcOrder ; j ++ )
  543.             Lsp[j] = PrevLsp[j] ;
  544.     }
  545.     return;
  546. }
  547. /*
  548. **
  549. ** Function:            Lsp_Int()
  550. **
  551. ** Description:     Computes the quantized LPC coefficients for a
  552. **          frame.  First the quantized LSP frequencies
  553. **          for all subframes are computed by linear
  554. **          interpolation.  These frequencies are then
  555. **          transformed to quantized LPC coefficients.
  556. **
  557. ** Links to text:   Sections 2.7, 3.3
  558. **
  559. ** Arguments:
  560. **
  561. **  Word16 *QntLpc      Empty buffer
  562. **  Word16 CurrLsp[]    Quantized LSP frequencies for the current frame,
  563. **               subframe 3 (10 words)
  564. **  Word16 PrevLsp[]    Quantized LSP frequencies for the previous frame,
  565. **               subframe 3 (10 words)
  566. **
  567. ** Outputs:
  568. **
  569. **  Word16 QntLpc[]     Quantized LPC coefficients for current frame, all
  570. **               subframes (40 words)
  571. **
  572. ** Return value:        None
  573. **
  574. */
  575. void  Lsp_Int( Word16 *QntLpc, Word16 *CurrLsp, Word16 *PrevLsp )
  576. {
  577.     int   i,j   ;
  578.     Word16   Tmp   ;
  579.     Word16  *Dpnt  ;
  580.     Word32   Acc0  ;
  581.  /*
  582.   * Initialize the interpolation factor
  583.   */
  584.     Tmp = (Word16) (MIN_16 / SubFrames ) ;
  585.     Dpnt = QntLpc ;
  586.  /*
  587.   * Do for all subframes
  588.   */
  589.     for ( i = 0 ; i < SubFrames ; i ++ ) {
  590.  /*
  591.   * Compute the quantized LSP frequencies by linear interpolation
  592.   * of the frequencies from subframe 3 of the current and
  593.   * previous frames
  594.   */
  595.         for ( j = 0 ; j < LpcOrder ; j ++ ) {
  596.             Acc0 = L_deposit_h( PrevLsp[j] ) ;
  597.             Acc0 = L_mac( Acc0, Tmp, PrevLsp[j] ) ;
  598.             Acc0 = L_msu( Acc0, Tmp, CurrLsp[j] ) ;
  599.             Dpnt[j] = round( Acc0 ) ;
  600.         }
  601.  /*
  602.   * Convert the quantized LSP frequencies to quantized LPC
  603.   * coefficients
  604.   */
  605.         LsptoA( Dpnt ) ;
  606.         Dpnt += LpcOrder ;
  607.         /* Update the interpolation factor */
  608.         Tmp = add( Tmp, (Word16) (MIN_16 / SubFrames ) ) ;
  609.     }
  610. }
  611. /*
  612. **
  613. ** Function:            LsptoA()
  614. **
  615. ** Description:     Converts LSP frequencies to LPC coefficients
  616. **          for a subframe.  Sum and difference
  617. **          polynomials are computed from the LSP
  618. **          frequencies (which are the roots of these
  619. **          polynomials).  The LPC coefficients are then
  620. **          computed by adding the sum and difference
  621. **          polynomials.
  622. **          
  623. ** Links to text:   Sections 2.7, 3.3
  624. **
  625. ** Arguments:       
  626. **
  627. **  Word16 Lsp[]        LSP frequencies (10 words)
  628. **
  629. ** Outputs:
  630. **
  631. **  Word16 Lsp[]        LPC coefficients (10 words)
  632. **
  633. ** Return value:        None
  634. ** 
  635. */
  636. void  LsptoA( Word16 *Lsp )
  637. {
  638.     int   i,j   ;
  639.     Word32   Acc0,Acc1   ;
  640.     Word16   Tmp ;
  641.     Word32   P[LpcOrder/2+1] ;
  642.     Word32   Q[LpcOrder/2+1] ;
  643.  /*
  644.   * Compute the cosines of the LSP frequencies by table lookup and
  645.   * linear interpolation
  646.   */
  647.     for ( i = 0 ; i < LpcOrder ; i ++ ) {
  648.  /*
  649.   * Do the table lookup using bits [15:7] of the LSP frequency
  650.   */
  651.         j = (int) shr( Lsp[i], (Word16) 7 ) ;
  652.         Acc0 = L_deposit_h( CosineTable[j] ) ;
  653.  /*
  654.   * Do the linear interpolations using bits [6:0] of the LSP
  655.   * frequency
  656.   */
  657.         Tmp = sub(CosineTable[j+1], CosineTable[j] ) ;
  658.         Acc0 = L_mac( Acc0, Tmp, add( shl( (Word16)(Lsp[i] & 0x007f) ,
  659.                                 (Word16)8 ), (Word16) 0x0080 ) ) ;
  660.         Acc0 = L_shl( Acc0, (Word16) 1 ) ;
  661.         Lsp[i] = negate( round( Acc0 ) ) ;
  662.     }
  663.  /*
  664.   * Compute the sum and difference polynomials with the real roots
  665.   * removed.  These are computed by polynomial multiplication as
  666.   * follows.  Let the sum polynomial be P(z).  Define the elementary
  667.   * polynomials P_i(z) = 1 - 2cos(w_i) z^{-1} + z^{-2}, for 1<=i<=
  668.   * 5, where {w_i} are the LSP frequencies corresponding to the sum
  669.   * polynomial.  Then P(z) = P_1(z)P_2(z)...P_5(z).  Similarly
  670.   * the difference polynomial Q(z) = Q_1(z)Q_2(z)...Q_5(z).
  671.   */
  672.  /*
  673.   * Initialize the arrays with the coefficients of the product
  674.   * P_1(z)P_2(z) and Q_1(z)Q_2(z).  Scale by 1/8.
  675.   */
  676.     P[0] = (Word32) 0x10000000L ;
  677.     P[1] = L_mult( Lsp[0], (Word16) 0x2000 ) ;
  678.     P[1] = L_mac( P[1], Lsp[2], (Word16) 0x2000 ) ;
  679.     P[2] = L_mult( Lsp[0], Lsp[2] ) ;
  680.     P[2] = L_shr( P[2], (Word16) 1 ) ;
  681.     P[2] = L_add( P[2], (Word32) 0x20000000L ) ;
  682.     Q[0] = (Word32) 0x10000000L ;
  683.     Q[1] = L_mult( Lsp[1], (Word16) 0x2000 ) ;
  684.     Q[1] = L_mac( Q[1], Lsp[3], (Word16) 0x2000 ) ;
  685.     Q[2] = L_mult( Lsp[1], Lsp[3] ) ;
  686.     Q[2] = L_shr( Q[2], (Word16) 1 ) ;
  687.     Q[2] = L_add( Q[2], (Word32) 0x20000000L ) ;
  688.  /*
  689.   * Compute the intermediate polynomials P_1(z)P_2(z)...P_i(z) and
  690.   * Q_1(z)Q_2(z)...Q_i(z), for i = 2, 3, 4.  Each intermediate
  691.   * polynomial is symmetric, so only the coefficients up to i+1 need
  692.   * by computed.  Scale by 1/2 each iteration for a total of 1/8.
  693.   */
  694.     for ( i = 2 ; i < LpcOrder/2 ; i ++ ) {
  695.         /* Compute coefficient (i+1) */
  696.         Acc0 = P[i] ;
  697.         Acc0 = L_mls( Acc0, Lsp[2*i+0] ) ;
  698.         Acc0 = L_add( Acc0, P[i-1] ) ;
  699.         P[i+1] = Acc0 ;
  700.         Acc1 = Q[i] ;
  701.         Acc1 = L_mls( Acc1, Lsp[2*i+1] ) ;
  702.         Acc1 = L_add( Acc1, Q[i-1] ) ;
  703.         Q[i+1] = Acc1 ;
  704.         /* Compute coefficients i, i-1, ..., 2 */
  705.         for ( j = i ; j >= 2 ; j -- ) {
  706.             Acc0 = P[j-1] ;
  707.             Acc0 = L_mls( Acc0, Lsp[2*i+0] ) ;
  708.             Acc0 = L_add( Acc0, L_shr(P[j], (Word16) 1 ) ) ;
  709.             Acc0 = L_add( Acc0, L_shr(P[j-2], (Word16) 1 ) ) ;
  710.             P[j] = Acc0 ;
  711.             Acc1 = Q[j-1] ;
  712.             Acc1 = L_mls( Acc1, Lsp[2*i+1] ) ;
  713.             Acc1 = L_add( Acc1, L_shr(Q[j], (Word16) 1 ) ) ;
  714.             Acc1 = L_add( Acc1, L_shr(Q[j-2], (Word16) 1 ) ) ;
  715.             Q[j] = Acc1 ;
  716.         }
  717.         /* Compute coefficients 1, 0 */
  718.         P[0] = L_shr( P[0], (Word16) 1 ) ;
  719.         Q[0] = L_shr( Q[0], (Word16) 1 ) ;
  720.         Acc0 = L_deposit_h( Lsp[2*i+0] ) ;
  721.         Acc0 = L_shr( Acc0, (Word16) i ) ;
  722.         Acc0 = L_add( Acc0, P[1] ) ;
  723.         Acc0 = L_shr( Acc0, (Word16) 1 ) ;
  724.         P[1] = Acc0 ;
  725.         Acc1 = L_deposit_h( Lsp[2*i+1] ) ;
  726.         Acc1 = L_shr( Acc1, (Word16) i ) ;
  727.         Acc1 = L_add( Acc1, Q[1] ) ;
  728.         Acc1 = L_shr( Acc1, (Word16) 1 ) ;
  729.         Q[1] = Acc1 ;
  730.     }
  731.  /*
  732.   * Convert the sum and difference polynomials to LPC coefficients
  733.   * The LPC polynomial is the sum of the sum and difference
  734.   * polynomials with the real zeros factored in: A(z) = 1/2 {P(z) (1
  735.   * + z^{-1}) + Q(z) (1 - z^{-1})}.  The LPC coefficients are scaled
  736.   * here by 16; the overall scale factor for the LPC coefficients
  737.   * returned by this function is therefore 1/4.
  738.   */
  739.     for ( i = 0 ; i < LpcOrder/2 ; i ++ ) {
  740.         Acc0 = P[i] ;
  741.         Acc0 = L_add( Acc0, P[i+1] ) ;
  742.         Acc0 = L_sub( Acc0, Q[i] ) ;
  743.         Acc0 = L_add( Acc0, Q[i+1] ) ;
  744.         Acc0 = L_shl( Acc0, (Word16) 3 ) ;
  745.         Lsp[i] = negate( round( Acc0 ) ) ;
  746.         Acc1 = P[i] ;
  747.         Acc1 = L_add( Acc1, P[i+1] ) ;
  748.         Acc1 = L_add( Acc1, Q[i] ) ;
  749.         Acc1 = L_sub( Acc1, Q[i+1] ) ;
  750.         Acc1 = L_shl( Acc1, (Word16) 3 ) ;
  751.         Lsp[LpcOrder-1-i] = negate( round( Acc1 ) ) ;
  752.     }
  753. }