filters.c
上传用户:touchwatch
上传日期:2007-01-06
资源大小:168k
文件大小:6k
源码类别:

语音压缩

开发平台:

Unix_Linux

  1. /*************************************************************************/
  2. /*                                                                       */
  3. /*                            LD-CELP  G.728                             */
  4. /*                                                                       */
  5. /*    Low-Delay Code Excitation Linear Prediction speech compression.    */
  6. /*                                                                       */
  7. /*    Code edited by Michael Concannon.                                  */
  8. /*    Based on code written by Alex Zatsman, Analog Devices 1993         */
  9. /*                                                                       */
  10. /*************************************************************************/
  11. /********************************* Perceptual Weighting Filter **/
  12. #include "common.h"
  13. #include "parm.h"
  14. #include "fast.h"
  15. #include "prototyp.h"
  16. /* Filter Memory in reverse order, i.e. firmem[0] is the most recent */
  17. static real firmem[LPCW+IDIM];
  18. static real iirmem[LPCW+IDIM];
  19. void pwfilter2(real QMEM input[], real output[])
  20. {
  21.     int k;
  22.     real out;
  23.     RSHIFT(firmem, LPCW, IDIM);
  24.     for(k=0; k<IDIM; k++)
  25. firmem[k] = input[IDIM-1-k];
  26.     RSHIFT(iirmem, LPCW, IDIM);
  27.     for (k=0; k<IDIM; k++) {
  28. out = firmem[IDIM-1-k]; /* pwf_z_coeff[0] is always 1.0 */
  29. out += DOTPROD(firmem+IDIM-k, pwf_z_coeff+1, LPCW);
  30. out -= DOTPROD(iirmem+IDIM-k, pwf_p_coeff+1, LPCW);
  31. iirmem[IDIM-1-k] = out;
  32. output[k] = out;
  33.     }
  34. }
  35. /*  Synthesis and Perceptual Weighting Filter. */
  36. #define STATE_MEM
  37. #define ZF_MEM   
  38. #define ZI_MEM   
  39. real STATE_MEM statelpc[LPC+IDIM];
  40. real ZF_MEM    zirwfir[LPCW];
  41. real ZI_MEM    zirwiir[LPCW];
  42. /** Updateable coefficients **/
  43. void sf_zresp(real []);
  44. void pwf_zresp(real [], real[]);
  45. void sf_zresp(real output[])
  46. {
  47.   int k,j;
  48. #if PIPELINE
  49.   for(j=LPC-1; j>=0; j--)
  50.       statelpc[j+IDIM] = statelpc[j];
  51. {
  52.     real STATE_MEM * sjpk = statelpc + LPC+IDIM-1; 
  53.     real out = 0.0;
  54.     for (k=0; k<IDIM; k++) {
  55.       real COEFF_MEM *ajp = sf_coeff+LPC;
  56.       real sj, aj;
  57.       real STATE_MEM *sjp;
  58.       out = 0.0;
  59.       sjp = sjpk;
  60.       sj = *sjp--;
  61.       aj = *ajp--;
  62.       for (j=LPC-2; j>=0; j--) {
  63.   out -= sj*aj;
  64.   sj = *sjp--;
  65.   aj = *ajp--;
  66.       }
  67.       output[k] = out - sj*aj;
  68.       *sjp--= output[k];
  69.       sjpk--;
  70.   }
  71. }
  72. #else
  73. /** This is un-pipelined version of the above. Kept for reference **/
  74.     for(j=LPC-1; j>=0; j--)
  75.       statelpc[j+IDIM] = statelpc[j];
  76.   for (k=0; k<IDIM; k++) {
  77.       real out = 0.0, sj, aj;
  78.       sj = statelpc[LPC+IDIM-k-1];
  79.       aj = sf_coeff[LPC];
  80.       for (j=LPC-2; j>=1; j--) {
  81.   out -= sj*aj;
  82.   sj = statelpc[IDIM-k+j];
  83.   aj = sf_coeff[j+1];
  84.       }
  85.       output[k] = out - sj*aj-statelpc[IDIM-k] * sf_coeff[1];
  86.       statelpc[IDIM-1-k] = output[k];
  87.   }
  88. return;
  89. #endif
  90. }
  91. void
  92. pwf_zresp(real input[], real output[])
  93. {
  94.    int j,k;
  95.    real tmp;
  96. #if PIPELINE
  97.    for (k=0; k<IDIM; k++) {
  98.     tmp = input[k];
  99.     for (j=LPCW-1; j>=1; j--) {
  100.        input[k] += zirwfir[j] * pwf_z_coeff[j+1];
  101.        zirwfir[j] = zirwfir[j-1];
  102.     }
  103. input[k] += zirwfir[0] * pwf_z_coeff[1];
  104.     zirwfir[0] = tmp;
  105.     for (j=LPCW-1; j>=1; j--) {
  106.         input[k] -= zirwiir[j] * pwf_p_coeff[j+1];
  107.         zirwiir[j] = zirwiir[j-1];
  108.     }
  109.     output[k] = input[k] - zirwiir[0] * pwf_p_coeff[1];
  110.     zirwiir[0] = output[k];
  111.    }
  112. #else
  113.    /** Un-pipelined version, kept for reference **/
  114.    for (k=0; k<IDIM; k++) {
  115.     tmp = input[k];
  116.     for (j=LPCW-1; j>=1; j--) {
  117.        input[k] += zirwfir[j] * pwf_z_coeff[j+1];
  118.        zirwfir[j] = zirwfir[j-1];
  119.     }
  120. input[k] += zirwfir[0] * pwf_z_coeff[1];
  121.     zirwfir[0] = tmp;
  122.     for (j=LPCW-1; j>=1; j--) {
  123.         input[k] -= zirwiir[j] * pwf_p_coeff[j+1];
  124.         zirwiir[j] = zirwiir[j-1];
  125.     }
  126.     output[k] = input[k] - zirwiir[0] * pwf_p_coeff[1];
  127.     zirwiir[0] = output[k];
  128.    }
  129. #endif   
  130. }
  131. void zresp(real output[])
  132. {
  133.     real temp[IDIM];
  134.     sf_zresp(temp);
  135.     pwf_zresp(temp, output);
  136. }
  137. void mem_update (real input[], real output[])
  138. {
  139.     int i,k;
  140.     real temp[IDIM], a0, a1, a2;
  141.     real STATE_MEM *t2 = zirwfir;
  142.     t2[0] = temp[0] = input[0];
  143.     for (k=1; k<IDIM; k++) {
  144. a0 = input[k];
  145. a1 = a2 = 0.0;
  146. for (i=k; i>= 1; i--) {
  147.     t2[i] = t2[i-1];
  148.     temp[i] = temp[i-1];
  149.     a0 -=   sf_coeff[i] * t2[i];
  150.     a1 += pwf_z_coeff[i] * t2[i];
  151.     a2 -= pwf_p_coeff[i] * temp[i];
  152. }
  153. t2[0] = a0;
  154. temp[0] = a0+a1+a2;
  155.     }
  156.     
  157.     for (k=0; k<IDIM; k++) {
  158.     statelpc[k] += t2[k];
  159.     if (statelpc[k] > Max)
  160.     statelpc[k] = Max;
  161.         else if (statelpc[k] < Min)
  162.     statelpc[k] = Min;
  163.         zirwiir[k] += temp[k];
  164.     }
  165.     for (i=0; i<LPCW; i++)
  166.     zirwfir[i] = statelpc[i];
  167.     for (k=0; k<IDIM; k++)
  168. output[k] = statelpc[IDIM-1-k];
  169.     return;
  170. }
  171. #include <math.h>
  172. # define LOG10(X) log10(X)
  173. # define EXP10(X) pow(10,X)
  174. /*********************************************** The Gain Predictor */
  175. extern real COEFF_MEM gp_coeff[];
  176. static real gain_input[LPCLG];
  177. static real log_rms(real input[])
  178. {
  179.     real etrms=0.0;
  180.     int k;
  181.     for(k=0; k<IDIM; k++)
  182. etrms += input[k]*input[k];
  183.     etrms /= IDIM;
  184.     if (etrms<1.0)
  185. etrms = 1.0;
  186.     etrms = 10.0*log10(etrms);
  187.     return (etrms);
  188. }
  189. real predict_gain()
  190. {
  191.   int i;
  192.   real new_gain = GOFF;
  193.   real temp;
  194.   for (i=1;i<=LPCLG;i++)
  195.     {
  196.       temp = gp_coeff[i] * gain_input[LPCLG-i];
  197.       new_gain -= temp;
  198.     }
  199.   if (new_gain <  0.0) new_gain = 0.0;
  200.   if (new_gain > 60.0) new_gain = 60.0;
  201.   new_gain = EXP10(0.05*new_gain);
  202.   return (new_gain);
  203. }
  204. void update_gain(real input[], real *lgp)
  205. {
  206.     int i;
  207.     *lgp = log_rms(input) - GOFF;
  208.     for (i=0; i<LPCLG-1; i++)
  209.       gain_input[i] = gain_input[i+1];
  210.     gain_input[LPCLG-1] = *lgp;
  211. }
  212. void init_gain_buf()
  213. {
  214.   int i;
  215.   for(i=0;i<LPCLG;i++)
  216.     gain_input[i] = -GOFF;
  217.   for(i=0;i<QSIZE/IDIM;i++)
  218.     log_gains[i] = -GOFF;
  219. }