lpc_lib.c
上传用户:csczyc
上传日期:2021-02-19
资源大小:1051k
文件大小:31k
源码类别:

语音压缩

开发平台:

C/C++

  1. #include        <stdio.h>
  2. #include        <stdlib.h>
  3. #include        <math.h>
  4. #include "spbstd.h"
  5. #include "mathhalf.h"
  6. #include "mathdp31.h"
  7. #include "math_lib.h"
  8. #include "wmops.h"
  9. #include "mat.h"
  10. #include "lpc.h"
  11. #include "constant.h"
  12. extern Shortword frames;
  13. extern FILE *fp_outdat;
  14. #define PRINT 1
  15. #define ALMOST_ONE_Q14   16382  
  16. Shortword lagw_cof[10] = {
  17. 32756,32721,32663,32582,32478,32351,32201,32030,31837,31622};
  18. void lpc_acor(Shortword input[],Shortword win_cof[],
  19.       Shortword r[],Shortword hf_correction,
  20.       Shortword lag_win,Shortword order,Shortword npts)
  21. {
  22.     Shortword i,j;
  23.     Longword L_temp;
  24.     Shortword *inputw;
  25.     Shortword norm_var, scale_fact, temp;
  26. Longword L_temp1,L_temp2,L_Prod;
  27. Shortword temp1;
  28.     MEM_ALLOC(MALLOC,inputw,npts,Shortword);
  29.     if (win_cof) {
  30.       for(i=0; i < npts; i++) {
  31.    L_temp1 = _shr2((Longword)(input[i]),(Longword)4);
  32.    L_temp1 = _smpy(win_cof[i],(Shortword)(0x0000ffffL & L_temp1));
  33.    inputw[i] = (Shortword) (0x0000ffffL & (L_temp1 >> 16));
  34.       }
  35.     }
  36.     else {
  37.       v_equ_shr(inputw,input,4,npts);
  38.     }    
  39.    
  40.     L_temp = L_v_magsq(inputw,npts,0,1);
  41.     if (L_temp) {   
  42.       L_temp1 = _norm(L_temp);
  43.   if (L_temp == 0){
  44.   L_temp1 = (Shortword)0;
  45.   } 
  46.   L_temp1 = _shr2(L_temp1,1);
  47.   norm_var = (Shortword)(0x0000ffffL & L_temp1);
  48.   norm_var = sub(4,norm_var);
  49.       if (norm_var < 0)
  50. norm_var = 0;
  51.     }
  52.     else
  53.       norm_var = 0;   
  54.     L_temp = L_v_magsq(inputw,npts,0,1);
  55.     if (L_temp > 0) {
  56.     
  57.       L_temp1 = _norm(L_temp);
  58.   norm_var = (Shortword) (0x0000ffffL & L_temp1);
  59.       norm_var = sub(norm_var,1);
  60.       L_temp = _sshvl(L_temp,norm_var);      
  61.       L_temp = _sadd(L_temp,L_mpy_ls(L_temp,hf_correction));
  62.      
  63.       temp1 = (Shortword) (0x0000ffffL & (L_temp >> 16));
  64.   L_temp1 = (Longword) temp1 << 16;
  65.   L_temp2 = _norm(L_temp1);
  66.   temp = (Shortword) (0x0000ffffL & L_temp2);
  67.   if (L_temp1 == 0){
  68.   temp = (Shortword)0;
  69.   }
  70.   L_temp = _sshvl(L_temp,temp);
  71.   L_temp1 = _sadd2((Longword)norm_var,(Longword)temp);
  72.       norm_var = (Shortword) (0x0000ffffL & L_temp1);
  73.   L_Prod = _sadd(L_temp, 0x00008000L); 
  74.       r[0] = (Shortword)(0x0000ffffL & (L_Prod >> 16));      
  75.       scale_fact = divide_s(ALMOST_ONE_Q14,r[0]);
  76.       L_temp = _sshvl(L_mpy_ls(L_temp,scale_fact),1);
  77.   L_Prod = _sadd(L_temp, 0x00008000L); /* round MSP */
  78.       r[0] = (Shortword)(0x0000ffffL & (L_Prod >> 16));
  79.     }
  80.     else {
  81.       norm_var = 0;   
  82.       r[0] = ONE_Q15;  
  83.       scale_fact = 0;      
  84.     }    
  85.     for(j=1; j <= order; j++)
  86.     {
  87. L_temp = 0; 
  88.         for(i=j; i < npts; i++) {
  89.     L_temp = _sadd(L_temp,_smpy(inputw[i],inputw[i-j]));
  90. }
  91. L_temp = _sshvl(L_temp,norm_var);
  92. L_temp = _sshvl(L_mpy_ls(L_temp,scale_fact),1);
  93. L_temp = L_mpy_ls(L_temp,lagw_cof[j-1]);
  94. L_Prod = _sadd(L_temp, 0x00008000L); 
  95.     r[j] = (Shortword)(0x0000ffffL & (L_Prod >> 16));
  96.     }
  97.     
  98.     MEM_FREE(FREE,inputw);
  99. }
  100. #define LOW_LIMIT 54
  101. Longword lpc_aejw(Shortword *a,Shortword w, Shortword p)
  102. {
  103.     Shortword i;
  104.     Shortword c_re,c_im;
  105.     Shortword cs,sn,temp;
  106.     Shortword temp1,temp2;
  107.     Longword L_temp;
  108. Longword L_temp1;   
  109.     if (p==0)
  110.         return((Longword)ONE_Q19);  
  111.     cs = cos_fxp(w); 
  112.     sn = negate(sin_fxp(w));
  113.     L_temp1 = _smpy(cs,a[p]);
  114.     L_temp1 = _shr2(L_temp1,3);
  115. c_re = (Shortword) (0x0000ffffL & (L_temp1 >> 16));
  116. L_temp1 = _smpy(sn,a[p]);
  117.     L_temp1 = _shr2(L_temp1,3);
  118. c_im = (Shortword) (0x0000ffffL & (L_temp1 >> 16));
  119.     for(i=p-1; i > 0; i--)
  120.     {
  121.            L_temp1 = _shr2((Longword)a[i],3);
  122.    L_temp1 = _sadd2((Longword)c_re,L_temp1);
  123.    c_re = (Shortword) (0x0000ffffL & L_temp1);
  124. temp=c_im;
  125.     L_temp1 = _smpy(cs,temp);
  126. temp1 = (Shortword) (0x0000ffffL & (L_temp1 >> 16));
  127. L_temp1 = _smpy(sn,c_re);
  128. temp2 = (Shortword) (0x0000ffffL & (L_temp1 >> 16));
  129. L_temp1 = _sadd2((Longword)temp1,(Longword)temp2);
  130. c_im = (Shortword) (0x0000ffffL & L_temp1);
  131.     L_temp1 = _smpy(cs,c_re);
  132. temp1 = (Shortword) (0x0000ffffL & (L_temp1 >> 16));
  133. L_temp1 = _smpy(sn,temp);
  134. temp2 = (Shortword) (0x0000ffffL & (L_temp1 >> 16));
  135.         c_re = sub(temp1,temp2);
  136.     }
  137.    
  138. L_temp1 = _sadd2((Longword)c_re,(Longword)ONE_Q9);
  139. c_re = (Shortword) (0x0000ffffL & L_temp1);
  140.      L_temp = _sadd(_smpy(c_re,c_re),_smpy(c_im,c_im));
  141.     
  142.     if (L_temp<LOW_LIMIT)
  143.       L_temp=(Longword)LOW_LIMIT;
  144.     
  145.     return(L_temp);
  146. #undef LOW_LIMIT
  147. Shortword lpc_bwex(Shortword *a, Shortword *aw, Shortword gamma, Shortword p)
  148. {
  149.     Shortword i;
  150.     Shortword gk;
  151. Longword L_temp1,L_temp2;
  152.     gk = gamma;
  153.     for(i=1; i <= p; i++) {  
  154.       L_temp1 = _smpy(a[i],gk);
  155.   aw[i] = (Shortword) (0x0000ffffL & (L_temp1 >> 16));
  156.   L_temp2 = _smpy(gk,gamma);
  157.   gk = (Shortword) (0x0000ffffL & (L_temp2 >> 16));
  158.     }
  159.     return((Shortword)0);
  160. }
  161. #define MAX_LOOPS 10
  162. Shortword lpc_clmp(Shortword *w, Shortword delta, Shortword p)
  163. {
  164.     Shortword i,j,unsorted;
  165.     Shortword temp,d,step1,step2;
  166. Longword L_temp;
  167.     
  168.     for (j=0,unsorted=TRUE; unsorted && (j < MAX_LOOPS); j++)
  169.     {
  170.         for(i=1,unsorted=FALSE; i < p; i++)
  171.             if (w[i] > w[i+1])
  172.             {
  173.                 temp = w[i+1];
  174.                 w[i+1] = w[i];
  175.                 w[i] = temp;
  176.                 unsorted = TRUE;
  177.             }
  178.     }
  179.     
  180.     if (!unsorted) 
  181.     {
  182.         for(j=0; j < MAX_LOOPS; j++)
  183.         {
  184.             for(i=1; i < p; i++)
  185.             {
  186.         /* increment complexity for if statement */
  187. //         compare_nonzero();mark del
  188. d = sub(w[i+1],w[i]);
  189. //      data_move();
  190.                 if (d < delta)
  191.                 {
  192. //     data_move();mark del
  193. //         data_move();mark del
  194.                     step1 = step2 = shr_a(sub(delta,d),1);
  195.     /* increment complexity for if statement */
  196. //     compare_nonzero();    compare_nonzero(); mark del
  197.                     if (i==1 && (w[i] < delta)) {
  198.       step1 = shr_a(w[i],1);
  199. //           data_move();  mark del
  200.     }
  201.                     else {
  202.       /* increment complexity for if statement */
  203. //       compare_nonzero();mark del
  204.       if (i > 1)
  205.       {
  206.         /* increment complexity for if statement */
  207. //         compare_nonzero();mark del
  208. temp = sub(w[i],w[i-1]);
  209.                         if (temp < delta) {
  210.   step1 = 0;   // data_move();mark del
  211. }
  212.                         else {
  213.   /* increment complexity for if statement */
  214. //   compare_nonzero();    compare_nonzero(); mark del
  215.   if (temp < shl_a(delta,1)) {
  216.     step1 = shr_a(sub(temp,delta),1);
  217.   }
  218. }
  219.       }
  220.                     }
  221.     /* increment complexity for if statement */
  222. //     compare_nonzero();    compare_nonzero();  mark del
  223.                     if (i==(p-1) && (w[i+1] > sub(ONE_Q15,delta))) {
  224.                         step2 = shr_a(sub(ONE_Q15,w[i+1]),1);
  225. //                            data_move();mark del
  226.     }
  227.                     else {
  228.       /* increment complexity for if statement */
  229. //       compare_nonzero();mark del
  230.       if (i < (p-1))
  231.       {
  232.         /* increment complexity for if statement */
  233. //         compare_nonzero();mark del
  234. temp = sub(w[i+2],w[i+1]);
  235.                         if (temp < delta) {
  236.   step2 = 0;
  237. //       data_move();
  238. }
  239.                         else {
  240.   /* increment complexity for if statement */
  241. //   compare_nonzero();mark del
  242.   if (temp < shl_a(delta,1)) {
  243.                             step2 = shr_a(sub(temp,delta),1);
  244.   }
  245. }
  246.       }
  247.                     }
  248.                     w[i] = sub(w[i],step1);
  249. //                        data_move();mark del
  250.                    /*  w[i+1] = add(w[i+1],step2); */
  251.     L_temp = _sadd2((Longword)w[i+1],(Longword)step2);
  252.                     w[i+1] = (Shortword) (0x0000ffffL & L_temp);
  253. //                        data_move();mark del
  254.                     
  255.                 }
  256.             }
  257.         }
  258.     }  
  259.     
  260.     /* Debug: check if the minimum separation rule was met */
  261.     /* temp = mult(32440,delta);    temp = 0.99*delta */
  262.   L_temp = _smpy(32440,delta);
  263.   temp = (Shortword) (0x0000ffffL & (L_temp >> 16));
  264.      for(j=1; j < p; j++)                                                       
  265.        if ((w[j+1]-w[j]) < temp)                                                
  266.            (void)fprintf(stderr,"%s: LSPs not separated by enough (line %d)n", 
  267.                __FILE__,__LINE__);                                              
  268.                                                                                 
  269.      if (unsorted)                                                            
  270.        (void)fprintf(stderr,"%s: Fxp LSPs still unsorted (line %d)n",       
  271.                      __FILE__,__LINE__);                                       
  272.     return((Shortword)0);
  273. } /* LPC_CLMP */
  274. /*  
  275.     Name: lpc_schr- Schur recursion (autocorrelations to refl coef)
  276.     Aliases: lpc_schur
  277.     Description:
  278.         Compute reflection coefficients from autocorrelations
  279.         based on schur recursion.  Will also compute predictor
  280.         parameters by calling lpc_refl2pred(3l) if necessary.
  281.     Inputs:
  282.         r- autocorrelation vector (r[0..p]).
  283.         p- order of lpc filter.
  284.     Outputs:
  285.         a-     predictor parameters    (can be NULL)
  286.         k_tmp- reflection coefficients (can be NULL)
  287.     Returns:
  288.         alphap- the minimum residual energy
  289.     Includes:
  290.         spbstd.h
  291.         lpc.h
  292.     See_Also:
  293.         lpc_refl2pred(3l) in lpc.h or lpc(3l)
  294.     Q values:
  295.     r - Q0
  296.     a - Q12
  297.     k_tmp - Q15
  298. */
  299. Shortword lpc_schr(Shortword *r, Shortword *a, Shortword *k_tmp, Shortword p)
  300. {
  301.     Shortword i,j;
  302.     Shortword shift,alphap,*k;
  303.     Longword L_temp, *y1, *y2;
  304.     Shortword n_temp,n_y2,nr1,nr0;
  305. Longword L_temp1;
  306. Shortword temp;
  307.     
  308.  
  309.     MEM_ALLOC(MALLOC,y1,p+2,Longword);
  310.     MEM_ALLOC(MALLOC,y2,p+2,Longword);
  311.     if (k_tmp == NULL)
  312.   MEM_ALLOC(MALLOC,k,p+1,Shortword);
  313.     else
  314. k = k_tmp;
  315.  /*    nr1 = abs_s(r[1]);         */
  316. /*        data_move();mark del */
  317. /*     nr0 = abs_s(r[0]);         */
  318. //        data_move();mark del
  319.       L_temp1 = _abs2((Longword)r[1]);
  320.       nr1 = (Shortword) (0x0000ffffL & L_temp1);
  321.       L_temp1 = _abs2((Longword)r[0]);    
  322.   nr0 = (Shortword) (0x0000ffffL & L_temp1);
  323.     k[1] = divide_s(nr1,nr0);
  324. //        data_move();mark del
  325.     /* increment complexity for if statement */
  326. //    logic(); compare_zero();mark del
  327.     /* if (((r[1] < 0) && (r[0] < 0)) || ((r[1] > 0) && (r[0] > 0))) */
  328.     if ((r[1] ^ r[0]) >= 0)
  329.     {
  330.       k[1] = negate(k[1]);
  331.  //         data_move();mark del
  332.     }
  333.    /*  alphap = mult(r[0],sub(ONE_Q15,mult(k[1],k[1])));  */
  334.      L_temp1 = _smpy(k[1],k[1]);
  335.  temp = (Shortword) (0x0000ffffL & (L_temp1 >> 16));
  336.  temp = sub(ONE_Q15,temp);
  337.  L_temp1 = _smpy(r[0],temp);
  338.  alphap = (Shortword) (0x0000ffffL & (L_temp1 >> 16));
  339. //       data_move();mark del
  340.     /* y2[1] = L_deposit_h(r[1]); */
  341.    /*  y2[2] = L_add(L_deposit_h(r[0]),L_mult(k[1],r[1])); */
  342.     y2[1] = (Longword) r[1] << 16 ;
  343. L_temp1 = (Longword) r[0] << 16 ;
  344. y2[2] = _sadd(L_temp1,_smpy(k[1],r[1]));
  345.     for(i=2; i <= p; i++)
  346.     {
  347. /* y1[1] = L_deposit_h(r[i]);  */
  348. /*  L_temp = L_deposit_h(r[i]);    */
  349.       y1[1] = (Longword) r[i] << 16;
  350.   L_temp = (Longword) r[i] << 16;
  351.         for(j=1; j < i; j++)
  352.         {  
  353.     y1[j+1] = _sadd(y2[j], L_mpy_ls(L_temp, k[j])); 
  354. //        L_data_move();mark del
  355.     L_temp = _sadd(L_temp, L_mpy_ls(y2[j], k[j]));
  356.     y2[j] = y1[j];   
  357. //      L_data_move();mark del
  358. }
  359.         /* k[i] = -temp/y2[i]; */
  360.         if (L_temp > y2[i]) {
  361.   for (j = i; j <= p; j++)
  362.     k[j] = 0;
  363. #if (PRINT)
  364.   printf("nERROR: numerator bigger than denominator in lpc_schrn");
  365.   printf("Reflection coefficients used in frame %d:n",frames);
  366.   for (i = 1; i <= p; i++) {
  367.     printf(" %5.8f ",(float)k[i]/(1<<15));
  368.   }
  369.   printf("n");
  370. #endif
  371.   break;
  372. }
  373. /*  shift = norm_l(y2[i]);                             */
  374. /*  n_temp = abs_s(extract_h(L_shl(L_temp,shift)));    */
  375.     L_temp1 = _norm(y2[i]);
  376. if (y2[i] == 0){
  377.   L_temp1 = (Longword)0;
  378. }
  379. shift = (Shortword) (0x0000ffffL & L_temp1);
  380.     L_temp1 = _sshvl(L_temp,shift);
  381. L_temp1 = _abs2(L_temp1);
  382. n_temp = (Shortword) (0x0000ffffL & (L_temp1 >> 16));
  383. //     data_move();mark del
  384. /* n_y2 = abs_s(extract_h(L_shl(y2[i],shift))); */
  385. L_temp1 = _sshvl(y2[i],shift);
  386. L_temp1 = _abs2(L_temp1);
  387. n_y2 = (Shortword) (0x0000ffffL & (L_temp1 >> 16));
  388. //     data_move();mark del
  389. k[i] = divide_s(n_temp,n_y2);
  390. //     data_move();mark del
  391. /* increment complexity for if statement */
  392. // L_logic(); compare_zero();mark del
  393. if ((L_temp ^ y2[i]) >= 0)
  394. {
  395.     k[i] = negate(k[i]); 
  396. //        data_move();mark del
  397. }
  398. y2[i+1] = _sadd(y2[i], L_mpy_ls(L_temp, k[i]));
  399. //     L_data_move();mark del
  400. y2[i] = y1[i];   
  401. //  L_data_move();mark del
  402. /*  alphap = mult(alphap,sub(ONE_Q15,mult(k[i],k[i])));    */
  403.     L_temp1 = _smpy(k[i],k[i]);
  404. temp = (Shortword) (0x0000ffffL & (L_temp1 >> 16));
  405. temp = sub(ONE_Q15,temp);
  406. L_temp1 = _smpy(alphap,temp);
  407. alphap = (Shortword) (0x0000ffffL & (L_temp1 >> 16));
  408. //   data_move();mark del
  409.     }
  410.     
  411.     if (a != NULL)
  412.     {
  413. lpc_refl2pred(k,a,p);
  414.     }
  415.     if (k_tmp == NULL) 
  416. MEM_FREE(FREE,k);
  417.     MEM_FREE(FREE,y2);
  418.     MEM_FREE(FREE,y1);
  419.     
  420.     return(alphap);   /* alphap in Q15 */
  421. } /* LPC_SCHR */
  422. /* LPC_REFL2PRED
  423.       get predictor coefficients from the reflection coeffs
  424.    Synopsis: lpc_refl2pred(k,a,p)
  425.       Input:
  426.          k- the reflection coeffs
  427.          p- the predictor order
  428.       Output:
  429.          a- the predictor coefficients
  430.    Reference:  Markel and Gray, Linear Prediction of Speech
  431.    Q values:
  432.    k - Q15
  433.    a - Q12
  434. */
  435. Shortword lpc_refl2pred(Shortword *k,Shortword *a,Shortword p)
  436. {
  437.     Shortword i,j;
  438.     Shortword *a1;
  439. Longword L_temp,swRnd;
  440. Shortword temp;
  441.     MEM_ALLOC(MALLOC,a1,p+1,Shortword);
  442.     for(i=1; i <= p; i++)
  443.     {
  444.         /* refl to a recursion */
  445.        /*   a[i] = shift_r(k[i],-3);       a in Q12   */ 
  446.     L_temp = _shr2((Longword)k[i],2);
  447.     swRnd = L_temp & (Longword)0x1;
  448.     L_temp = _shr2((Longword)k[i],3);          
  449.   L_temp = _sadd2(L_temp,swRnd);       
  450.   a[i] = (Shortword) (0x0000ffffL & L_temp);   
  451. //          data_move();mark del
  452.         for(j=1; j < i; j++) {
  453.   a1[j] = a[j];    
  454. //   data_move();mark del
  455. }
  456.         for(j=1; j < i; j++) {
  457.            /*  a[j] = add(a1[j],mult(k[i],a1[i-j]));  */
  458.    L_temp = _smpy(k[i],a1[i-j]);
  459.    temp = (Shortword) (0x0000ffffL & (L_temp >> 16));
  460.    L_temp = _sadd2((Longword)a1[j],(Longword)temp);
  461.    a[j] = (Shortword) (0x0000ffff & L_temp);
  462. //               data_move();mark del
  463. }
  464.     }
  465.     MEM_FREE(FREE,a1);
  466.     return((Shortword)0);
  467. } /* LPC_REFL2PRED */
  468. /* minimum LSP separation-- a global variable */
  469. Shortword lsp_delta = 0;
  470. /* LPC_PRED2LSP
  471.       get LSP coeffs from the predictor coeffs
  472.       Input:
  473.          a- the predictor coefficients
  474.          p- the predictor order
  475.       Output:
  476.          w- the lsp coefficients
  477.       This function uses a DFT to evaluate the P and Q polynomials,
  478.       and is hard-coded to work only for 10th order LPC.
  479.    Q values:
  480.    a - Q12
  481.    w - Q15
  482. */
  483. static void lsp_to_freq(Shortword lsp[restrict], Shortword w[restrict], Shortword order);
  484. #define LPC_ORD 10
  485. Shortword lpc_pred2lsp(Shortword *restrict a,Shortword *restrict w,Shortword p)
  486. {
  487.     Shortword i,j;
  488.     Shortword p_cof[LPC_ORD+1], q_cof[LPC_ORD+1],
  489.               p_freq[LPC_ORD+1], q_freq[LPC_ORD+1];
  490.     Longword L_p_cof[LPC_ORD+1], L_q_cof[LPC_ORD+1];
  491.     Longword L_ai,L_api,L_temp;
  492. Longword L_temp1,L_Prod;
  493.     /* Generate P' and Q' polynomials   */
  494.     L_p_cof[0] = (Longword)ONE_Q26;
  495.     L_q_cof[0] = (Longword)ONE_Q26;
  496.     for ( i = 1; i <= p; i++ ) {
  497.         /* temp = sub(a[i],a[p+1-i]); */     /* temp in Q12 */
  498.        /*  L_ai = L_shr(L_deposit_h(a[i]),2); */
  499.            L_ai =(Longword)(a[i] << 16);
  500.            L_ai = _sshvr(L_ai,2); 
  501. //             L_data_move();mark del
  502. /* L_api = L_shr(L_deposit_h(a[p+1-i]),2); */
  503.  L_api = (Longword) (a[p+1-i] << 16);
  504.  L_api = _sshvr(L_api,2);
  505. //      L_data_move();  mark del
  506. /*  L_temp = L_sub(L_ai,L_api);        L_temp in Q26 */                     
  507. /*         L_p_cof[i] = L_add(L_temp,L_p_cof[i-1]);       L_p_cof in Q26 */ 
  508.     L_temp = _ssub(L_ai,L_api);
  509. L_p_cof[i] = _sadd(L_temp,L_p_cof[i-1]);
  510. /* temp = add(a[i],a[p+1-i]); */
  511. /*  L_temp = L_add(L_ai,L_api);                                               */
  512. /*         L_q_cof[i] = L_sub(L_temp,L_q_cof[i-1]);       L_q_cof in Q26 */ 
  513.      L_temp = _sadd(L_ai,L_api);
  514.         L_q_cof[i] = _ssub(L_temp,L_q_cof[i-1]);      /* L_q_cof in Q26 */
  515.     }
  516.     /* Convert p_cof and q_cof to short */
  517.     for ( i = 0; i <= p; i++ ) {
  518.      /*  p_cof[i] = round(L_p_cof[i]);      p_cof in Q10 */ 
  519.   L_Prod = _sadd(L_p_cof[i], 0x00008000L); /* round MSP */
  520.       p_cof[i] = (Shortword) (0x0000ffffL & (L_Prod >> 16));
  521.       /* q_cof[i] = round(L_q_cof[i]);      q_cof in Q10 */ 
  522.   L_temp1 = _sadd(L_q_cof[i], 0x00008000L); /* round MSP */
  523.       q_cof[i] = (Shortword) (0x0000ffffL & (L_temp1 >> 16));
  524.     }
  525.     /* Find root frequencies of LSP polynomials */
  526.     lsp_to_freq(p_cof,p_freq,p);
  527.     lsp_to_freq(q_cof,q_freq,p);
  528.     /* Combine frequencies into single array    */
  529.     w[0] = 0;
  530.     j = 1;
  531.     for (i = 0; i < (shr_a(p,1)); i++) {
  532.         w[j++] = q_freq[i];      
  533. //        data_move();mark del
  534.         w[j++] = p_freq[i];   
  535. //           data_move();mark del
  536.     }
  537.     return((Shortword)0);
  538. } /* LPC_PRED2LSP */
  539. /*                                                              */
  540. /*      Subroutine LSP_TO_FREQ: Calculate Line Spectrum Pair    */
  541. /*      root frequencies from LSP polynomial.                   */
  542. /*                                                              */
  543. /* Q values:
  544.    lsp - Q10
  545.    w - Q15 
  546. */
  547. #define DFTLENGTH       512
  548. #define DFTLENGTH_D2    (DFTLENGTH/2)
  549. #define DFTLENGTH_D4    (DFTLENGTH/4)
  550. static void lsp_to_freq(Shortword lsp[restrict], Shortword w[restrict], Shortword p)
  551. {
  552.     Shortword i;
  553.     Shortword p2, count, prev_less, j;
  554.     static Shortword firstcall = 1;
  555.     Longword mag0, mag1, mag2;
  556.     Shortword s_mag0, s_mag1, s_mag2;
  557.     Shortword *p_cos, *p_endlsp, *p_lsp, *p_begcos, *p_endcos;
  558.     Shortword temp1, temp2;
  559.     Longword L_temp1, L_temp2;
  560. Longword L_temp;
  561.     static Shortword lsp_cos[DFTLENGTH];    /* cosine table */
  562.     static Shortword default_w, default_w0;
  563.     static Shortword cos_tab[129] =
  564.     { 
  565.         32767, 32766, 32758, 32746, 32729, 32706, 32679, 32647, 32610,
  566.         32568, 32522, 32470, 32413, 32352, 32286, 32214, 32138, 32058,
  567.         31972, 31881, 31786, 31686, 31581, 31471, 31357, 31238, 31114,
  568.         30986, 30853, 30715, 30572, 30425, 30274, 30118, 29957, 29792,
  569.         29622, 29448, 29269, 29086, 28899, 28707, 28511, 28311, 28106,
  570.         27897, 27684, 27467, 27246, 27020, 26791, 26557, 26320, 26078,
  571.         25833, 25583, 25330, 25073, 24812, 24548, 24279, 24008, 23732,
  572.         23453, 23170, 22884, 22595, 22302, 22006, 21706, 21403, 21097,
  573.         20788, 20475, 20160, 19841, 19520, 19195, 18868, 18538, 18205,
  574.         17869, 17531, 17190, 16846, 16500, 16151, 15800, 15447, 15091,
  575.         14733, 14373, 14010, 13646, 13279, 12910, 12540, 12167, 11793,
  576.         11417, 11039, 10660, 10279,  9896,  9512,  9127,  8740,  8351,
  577.         7962,   7571,  7180,  6787,  6393,  5998,  5602,  5205,  4808,
  578.         4410,   4011,  3612,  3212,  2811,  2411,  2009,  1608,  1206,
  579.         804,     402,     0
  580.     };
  581.     if (firstcall) {
  582.         /* Initialization: fill cosine table */
  583.         firstcall = 0;
  584. /* for (i = 0; i < DFTLENGTH; i++ )
  585.      lsp_cos[i] = cos(i*(TWOPI / DFTLENGTH)); */
  586. for (i = 0; i < DFTLENGTH_D4; i++) {
  587.   lsp_cos[i] = cos_tab[i];
  588.   lsp_cos[i+DFTLENGTH_D4] = -cos_tab[DFTLENGTH_D4-i];
  589.   lsp_cos[i+2*DFTLENGTH_D4] = -cos_tab[i];
  590.   lsp_cos[i+3*DFTLENGTH_D4] = cos_tab[DFTLENGTH_D4-i];
  591. }
  592. /* compute default values for w[] */
  593. /* (1./p2) in Q15 */
  594. default_w = divide_s(ONE_Q11,shl_a(p,10));
  595. /* w[0] = (0.5/p2) in Q15 */
  596. /*  default_w0 = shr(default_w,1);   */
  597.     L_temp = _shr2((Longword)default_w,1);
  598.     default_w0 = (Shortword) (0x0000ffffL & L_temp);
  599.     }
  600.     prev_less = 1;
  601.     mag0 = (Longword)0x7fffffff; 
  602. //         L_data_move();mark del
  603.     mag1 = (Longword)0x7fffffff; 
  604. //         L_data_move();mark del
  605.     s_mag0 = (Shortword)0x7fff;  
  606. //        data_move();mark del
  607.     s_mag1 = (Shortword)0x7fff;
  608. //          data_move();mark del
  609.    /* p2 = shr(p,1);       p/2 */
  610.    L_temp = _shr2((Longword)p,1);
  611.    p2 = (Shortword) (0x0000ffffL & L_temp);
  612.     count = 0;      
  613. //    data_move(); mark del
  614.     p_begcos = &lsp_cos[0];
  615.     p_endcos = &lsp_cos[DFTLENGTH-1];
  616.     p_endlsp = &lsp[p2];
  617.     /*  Search all frequencies for minima of Pc(w) */
  618.     for (i = 0; i <= DFTLENGTH_D2; i++ ) {
  619.         p_lsp = p_endlsp;
  620.         p_cos = p_begcos++;
  621. /* mag2 = 0.5 * *(p_lsp--); */
  622. /*  mag2 = L_mult(*(p_lsp--),(Shortword)X05_Q14);      mag2 in Q25 */    
  623.       mag2 = _smpy(*(p_lsp--),(Shortword)X05_Q14);     /* mag2 in Q25 */
  624.         for (j = p2 - 1; j >= 0; j-- ) {
  625.   /*   L_temp1 = L_shr(L_mult(*(p_lsp--),*(p_cos)),1); */
  626. /*             mag2 = L_add(mag2,L_temp1);                 */
  627.             L_temp1 = _sshvr(_smpy(*(p_lsp--),*(p_cos)),1);
  628.             mag2 = _sadd(mag2,L_temp1);
  629. //     complexity -= 4; mark del   /* this can be done with MAC on TMS320C5x */
  630.             p_cos += i;
  631.             if (p_cos > p_endcos)
  632.                 p_cos -= DFTLENGTH;
  633.         }
  634. /* s_mag2 = extract_h(mag2); */
  635. /*         mag2 = L_abs(mag2);   */
  636.      s_mag2 = (Shortword) (0x0000ffffL & (mag2 >> 16));
  637.         mag2 = _abs(mag2);
  638. // L_compare_nonzero();  mark del
  639.         if (mag2 < mag1) {
  640.     prev_less = 1;      
  641. //     data_move();mark del
  642. }
  643.         else {
  644.             if (prev_less) {
  645.       /* check for sign change */
  646. //       logic();    compare_zero();mark del
  647.       if ((s_mag0 ^ s_mag2) < 0) {
  648. /* Minimum frequency found */
  649. /*w[count] = i - 1 + (0.5 *
  650.              (mag0 - mag2) / (mag0 + mag2 - 2*mag1) );
  651.      w[count] *= (2. / DFTLENGTH) ;*/
  652. L_temp1 = _sshvr(L_sub(mag0,mag2),1);
  653. L_temp2 = _ssub(mag0,L_shl(mag1,1));
  654. L_temp2 = _sadd(L_temp2,mag2);
  655. temp1 = L_divider2(L_temp1,L_temp2,0,0);  /* temp1 in Q15 */
  656. /*  temp1 = shr(temp1,9);     Q6 */  
  657.     L_temp = _shr2((Longword)temp1,9);
  658. temp1 = (Shortword) (0x0000ffffL & L_temp);
  659. temp2 = sub(i,1);
  660. temp1 = add(shl_a(temp2,6),temp1);
  661. w[count] = divide_s(temp1,shl_a(DFTLENGTH,5));
  662. //       data_move();mark del
  663. /*  count = add(count,1);  */
  664.     L_temp = _sadd2((Longword)count,(Longword)1);
  665. count = (Shortword) (0x0000ffffL & L_temp);
  666.       }
  667.     }
  668.     prev_less = 0;      
  669. //     data_move();mark del
  670.         }
  671.         mag0 = mag1;      
  672. //        L_data_move();mark del
  673.         mag1 = mag2; 
  674. //             L_data_move();mark del
  675. s_mag0 = s_mag1;     
  676. //  data_move();mark del
  677. s_mag1 = s_mag2;     
  678. //  data_move();mark del
  679.     }
  680.     
  681.     /*  Verify that all roots were found                */
  682.     if (count != p2) {
  683. #if (PRINT)
  684.         printf("ERROR: couldn't find LSP frequencies in frame %d.n",frames);
  685.         printf(" Found were ");
  686.         for (i = 0; i < count; i++) 
  687.             printf(" %10.4f ",(float)w[i]/(1<<15));
  688.         printf("n");
  689. #endif
  690.         /* use default values */
  691.         w[0] = default_w0;
  692.         for (i = 1; i < p2; i++) {
  693.             w[i] = w[i-1] + default_w;
  694.         }
  695.     }
  696. } /* LSP_TO_FREQ */
  697. #undef  DFTLENGTH
  698. #undef  DFTLENGTH_D2
  699. #undef  DFTLENGTH_D4
  700. /* LPC_PRED2REFL
  701.       get refl coeffs from the predictor coeffs
  702.       Input:
  703.          a- the predictor coefficients
  704.          p- the predictor order
  705.       Output:
  706.          k- the reflection coefficients
  707.       Returns:
  708.          energy - energy of residual signal
  709.    Reference:  Markel and Gray, Linear Prediction of Speech
  710.    Q values:
  711.    *a - Q12
  712.    *k - Q15
  713.    energy - Q15
  714. */
  715. Shortword lpc_pred2refl(Shortword *a,Shortword *k,Shortword p)
  716. {
  717.     Shortword *b,*b1, e;
  718.     Shortword energy = ONE_Q15;
  719.     Shortword i,j;
  720.     Shortword shift;
  721.     Shortword temp, n_temp, n_e;
  722. Longword L_temp,L_shift;
  723. Shortword temp1;
  724.     MEM_ALLOC(MALLOC,b,p+1,Shortword);
  725.     MEM_ALLOC(MALLOC,b1,p+1,Shortword);
  726.     /* equate temporary variables (b = a) */
  727.     for(i=1; i <= p; i++) {
  728.       b[i] = a[i]; 
  729. //           data_move();mark del
  730.     }
  731.     /* compute reflection coefficients */
  732.     for(i=p; i > 0; i--)
  733.     {
  734.         k[i] = shl_a(b[i],3);     /* Q12 -> Q15 */
  735.         /* e = sub(ONE_Q15,mult(k[i],k[i])); */
  736. /*         energy = mult(energy,e);          */
  737.          L_temp = _smpy(k[i],k[i]);
  738.  temp1 = (Shortword) (0x0000ffffL & (L_temp >> 16));
  739.  e = sub(ONE_Q15,temp1);
  740.  L_temp = _smpy(energy,e);
  741.  energy = (Shortword) (0x0000ffffL & (L_temp >> 16));
  742.         for(j=1; j < i; j++) {
  743.             b1[j] = b[j];   
  744. //               data_move();mark del
  745. }
  746.         for(j=1; j < i; j++) {
  747.     /* b[j] = (b1[j] - k[i]*b1[i-j])/e; */
  748.    /*  temp = mult(k[i],b1[i-j]);     temp in Q12  */
  749.      L_temp = _smpy(k[i],b1[i-j]);
  750.  temp = (Shortword) (0x0000ffffL & (L_temp >> 16));
  751.     temp = sub(b1[j],temp);
  752.     /* check signs of temp and e before division */
  753.    /*  n_temp = abs_s(temp); */
  754. /*      n_e = abs_s(e);          */
  755. /*      shift = norm_s(n_e);     */
  756.         L_temp = _abs2((Longword)temp);
  757. n_temp = (Shortword) (0x0000ffffL & L_temp);
  758. L_temp = _abs2((Longword)e);
  759. n_e = (Shortword) (0x0000ffffL & L_temp);
  760. L_temp = (Longword)n_e << 16;
  761. L_shift = _norm(L_temp);
  762. if (L_temp == 0){
  763.   L_shift = (Longword)0;
  764. }
  765. shift = (Shortword) (0x0000ffffL & L_shift);
  766.     n_e = shl(n_e,shift);
  767.     if (n_temp > n_e) {
  768.       /* n_temp = shr(n_temp,1); */
  769. /*        shift = add(shift,1);      */
  770.           L_temp = _shr2((Longword)n_temp,1);
  771.   n_temp = (Shortword) (0x0000ffffL & L_temp);
  772.   L_shift = _sadd2((Longword)shift,(Longword)1);
  773.   shift = (Shortword) (0x0000ffffL & L_shift);
  774.     }
  775.     b[j] = shl(divide_s(n_temp,n_e),shift);    /* b[j] in Q12 */
  776.     if ((temp ^ e) < 0)
  777.       b[j] = negate(b[j]);
  778. }
  779.     }
  780.     MEM_FREE(FREE,b1);
  781.     MEM_FREE(FREE,b);
  782.     return(energy);
  783. } /* LPC_PRED2REFL */
  784. /* LPC_LSP2PRED
  785.       get predictor coefficients from the LSPs
  786.    Synopsis: lpc_lsp2pred(w,a,p)
  787.       Input:
  788.          w- the LSPs
  789.          p- the predictor order
  790.       Output:
  791.          a- the predictor coefficients
  792.    Reference:  Kabal and Ramachandran
  793. */
  794. /* Q values:
  795.    w - Q15
  796.    a - Q12
  797.    f - Q25
  798.    c - Q14 */
  799. Shortword lpc_lsp2pred(Shortword *w,Shortword *a,Shortword p)
  800. {
  801.     Shortword i,j,k,p2;
  802.     Shortword c[2];
  803.     Longword **f;
  804.     Longword L_temp;
  805. Longword L_temp1;
  806. Shortword temp;
  807.     /* ensure minimum separation and sort */
  808.     (void)lpc_clmp(w,lsp_delta,p);
  809.     /* p2 = p/2 */
  810.     p2 = shr_a(p,1);
  811. //         data_move();mark del
  812.     MEM_2ALLOC(MALLOC,f,2,p2+1,Longword);
  813.     /* f is Q25 */
  814.     f[0][0] = f[1][0] = (Longword)ONE_Q25;
  815. //        L_data_move();    L_data_move();mark del
  816.     /* -2.0*cos((double)w[1]*M_PI) */
  817.    /*  f[0][1] = L_shr(L_deposit_h(negate(cos_fxp(w[1]))),5); */
  818.      temp = negate(cos_fxp(w[1]));
  819.  L_temp1 = (Longword)temp << 16;
  820.      f[0][1] = _sshvr(L_temp1,5);
  821. //      L_data_move();mark del
  822.    /*  f[1][1] = L_shr(L_deposit_h(negate(cos_fxp(w[2]))),5); */
  823.      temp = negate(cos_fxp(w[2]));
  824.  L_temp1 = (Longword)temp << 16;
  825.      f[1][1] = _sshvr(L_temp1,5);
  826. //      L_data_move();mark del
  827.     k = 3;
  828.     for(i=2; i <= p2; i++)
  829.       { 
  830.         /* c is Q14 */
  831.         /* multiply by 2 is considered as Q15->Q14 */
  832.         c[0] = negate(cos_fxp(w[k++]));
  833. //            data_move();mark del
  834.         c[1] = negate(cos_fxp(w[k++]));
  835. //            data_move();mark del
  836.        
  837.         f[0][i] = f[0][i-2];
  838. //            L_data_move();mark del
  839.         f[1][i] = f[1][i-2]; 
  840. //           L_data_move();mark del
  841.         for(j=i; j >= 2; j--)
  842.           {
  843.     /* f[0][j] += c[0]*f[0][j-1]+f[0][j-2] */
  844.     L_temp = L_mpy_ls(f[0][j-1],c[0]);
  845.     /* L_temp = L_add(L_shl(L_temp,1),f[0][j-2]); */
  846. /*             f[0][j] = L_add(f[0][j],L_temp);       */
  847.         L_temp = _sadd(_sshvl(L_temp,1),f[0][j-2]); 
  848.              f[0][j] = _sadd(f[0][j],L_temp);     
  849.         
  850.  //               L_data_move();mark del
  851.             /* f[1][j] += c[1]*f[1][j-1]+f[1][j-2] */
  852.     L_temp = L_mpy_ls(f[1][j-1],c[1]);
  853.    /*  L_temp = L_add(L_shl(L_temp,1),f[1][j-2]); */
  854. /*             f[1][j] = L_add(f[1][j],L_temp);       */
  855.          L_temp = _sadd(_sshvl(L_temp,1),f[1][j-2]);
  856.             f[1][j] = _sadd(f[1][j],L_temp);
  857. //                L_data_move();mark del
  858.           }
  859.        /*  f[0][1] = L_add(f[0][1],L_shl(L_mpy_ls(f[0][0],c[0]),1)); */
  860. /*         f[1][1] = L_add(f[1][1],L_shl(L_mpy_ls(f[1][0],c[1]),1)); */
  861.          f[0][1] = _sadd(f[0][1],_sshl(L_mpy_ls(f[0][0],c[0]),1));
  862.          f[1][1] = _sadd(f[1][1],_sshl(L_mpy_ls(f[1][0],c[1]),1));
  863.       }
  864.     for(i=p2; i > 0; i--)
  865.       {
  866.         /* short f (f is a Q14) */
  867.        /*  f[0][i] = L_add(f[0][i],f[0][i-1]); */
  868. /*         f[1][i] = L_sub(f[1][i],f[1][i-1]); */
  869.           f[0][i] = _sadd(f[0][i],f[0][i-1]);
  870.           f[1][i] = _ssub(f[1][i],f[1][i-1]);
  871.         /* a is Q12 */
  872.         /* a[i] = 0.50*(f[0][i]+f[1][i]) */
  873. /* a[p+1-i] = 0.50*(f[0][i]-f[1][i]) */
  874. /* Q25 -> Q27 -> Q12 */
  875.        /*  a[i] = extract_h(L_shl(L_add(f[0][i],f[1][i]),2));     */
  876. /*         a[p+1-i] = extract_h(L_shl(L_sub(f[0][i],f[1][i]),2)); */
  877.         L_temp1 = _sshl(_sadd(f[0][i],f[1][i]),2);
  878.         a[i] = (Shortword) (0x0000ffffL & (L_temp1 >> 16));
  879. L_temp1 = _sshl(_ssub(f[0][i],f[1][i]),2);
  880. a[p+1-i] = (Shortword) (0x0000ffffL & (L_temp1 >> 16));
  881.     }
  882.     MEM_2FREE(FREE,f);
  883.     return((Shortword)0);
  884. } /* LPC_LSP2PRED */
  885. /*
  886.     Name: lpc_syn- LPC synthesis filter.
  887.     Aliases: lpc_synthesis
  888.     Description:
  889.         LPC all-pole synthesis filter
  890.         for j = 0 to n-1
  891.             y[j] = x[j] - sum(k=1 to p) y[j-k] a[k]
  892.     Inputs:
  893.         x- input vector (n samples, x[0..n-1])
  894.         a- lpc vector (order p, a[1..p])
  895.         p- order of lpc filter
  896.         n- number of elements in vector which is to be filtered
  897.         y[-p..-1]- filter memory (past outputs)
  898.     Outputs:
  899.         y- output vector (n samples, y[0..n-1])
  900.     Returns: NULL
  901.     Includes:
  902.         spbstd.h
  903.         lpc.h
  904.     Systems and Info. Science Lab
  905.     Copyright (c) 1995 by Texas Instruments, Inc.  All rights reserved.
  906. */
  907. Shortword lpc_syn(Shortword *x,Shortword *y,Shortword *a,Shortword p,
  908.   Shortword n)
  909. {
  910.     Shortword i,j;
  911.     Longword accum;
  912. Longword L_temp,L_Prod;
  913.     for(j=0; j < n; j++) {
  914.         /* accum = L_shr(L_deposit_h(x[j]),3); */
  915. L_temp = (Longword)(x[j]) << 16;
  916. accum = _sshvr(L_temp,3);
  917. for(i=p; i > 0; i--)
  918.     accum = L_msu(accum,y[j-i],a[i]);
  919. /* Round off output */
  920. /* accum = L_shl(accum,3); */
  921. /* y[j] = round(accum); */
  922.   accum = _sshl(accum,3);
  923.   L_Prod = _sadd(accum, 0x00008000L); /* round MSP */
  924.       y[j] = (Shortword)(0x0000ffffL & (L_Prod >> 16));
  925.     }
  926.     return((Shortword)0);
  927. }