LFE.C
上传用户:njqiyou
上传日期:2007-01-08
资源大小:574k
文件大小:6k
源码类别:

mpeg/mp3

开发平台:

C/C++

  1. /**********************************************************************
  2.  * ISO MPEG Audio Subgroup Software Simulation Group (1996)
  3.  * ISO 13818-3 MPEG-2 Audio Multichannel Encoder
  4.  *
  5.  * $Id: lfe.c,v 1.4 1996/02/12 07:13:35 rowlands Exp $
  6.  *
  7.  * $Log: lfe.c,v $
  8.  * Revision 1.4  1996/02/12 07:13:35  rowlands
  9.  * Release following Munich meeting
  10.  *
  11.  * Revision 1.1  1995/11/06  04:19:12  rowlands
  12.  * Received from Uwe Felderhoff (IRT)
  13.  *
  14.  **********************************************************************/
  15. #include "common.h"
  16. #include "encoder.h"
  17. static double a[17] = {
  18.   0.750000000, 0.625000000, 0.875000000, 0.562500000, 0.937500000,
  19.   0.968750000, 0.984375000, 0.992187500, 0.996093750, 0.998046875,
  20.   0.999023438, 0.999511719, 0.999755859, 0.999877930, 0.999938965,
  21.   0.999969482, 0.999984741 };
  22.  
  23. static double b[17] = {
  24.   -0.250000000, -0.375000000, -0.125000000, -0.437500000, -0.062500000,
  25.   -0.031250000, -0.015625000, -0.007812500, -0.003906250, -0.001953125,
  26.   -0.000976563, -0.000488281, -0.000244141, -0.000122070, -0.000061035,
  27.   -0.000030518, -0.000015259 };
  28.  
  29. /************************************************************************
  30. /*
  31. /* encode_lfe  
  32. /*
  33. /************************************************************************/
  34. void lf_scalefactor(
  35.     double lfe_sample[12], 
  36.     unsigned int *lfe_scalar)
  37. {
  38.   int  j;
  39.   double s;
  40.     for(j=1, s = mod(lfe_sample[0]); j<12; j++)
  41.       if (mod(lfe_sample[j]) > s)
  42.          s = mod(lfe_sample[j]);
  43.     for(j=SCALE_RANGE-1, *lfe_scalar = 0; j>=0; j--)
  44.       if (s <= multiple[j]){
  45.          *lfe_scalar = j;
  46.          break;
  47.       }
  48.    
  49. }
  50. void II_encode_lfe_scale(
  51. unsigned int lfe_scalar, 
  52. Bit_stream_struc *bs)
  53. {
  54.       putbits(bs,lfe_scalar,6);
  55. }
  56. void lfe_allocation(
  57.     unsigned int *lfe_alloc, 
  58.     int *adb)                   /* 70 */
  59. {
  60.     int nbal, bspl, bscf;
  61.  /*   *lfe_alloc = 4          /* index (Lay II bit alloc tabel) */
  62.     nbal = 4;                 /* 4 bits  (nbal) */
  63.     bscf = 6;                 /* bits for scale factor */
  64.     bspl = 12 * 5;            /* bits used for quantization*/
  65.     *adb -= nbal + bscf + bspl;
  66. }
  67. void II_lfe_quantisation(
  68. unsigned int lfe_scalar, 
  69. double lfe_samples[12], 
  70. unsigned int lfe_alloc, 
  71. unsigned int sbband[12], 
  72. frame_params *fr_ps)
  73. {
  74.    int i, j, s, qnt, n, sig;
  75.    unsigned int stps;
  76.    double d;
  77.    al_table *alloc = fr_ps->alloc;
  78.    for (s=0;s<12;s++)
  79.    {
  80.           d = lfe_samples[s] / multiple[lfe_scalar];
  81.           if (mod(d) > 1.0)
  82.             printf("In LFE, not scaled properly  %d  %12.10en",s,d);
  83.           qnt = (*alloc)[0][lfe_alloc].quant;
  84.           d = d * a[qnt] + b[qnt];
  85.           /* extract MSB N-1 bits from the floating point sample */
  86.           if (d >= 0) sig = 1;
  87.           else { sig = 0; d += 1.0; }
  88.           n = 0;
  89. #ifndef MS_DOS
  90.           stps = (*alloc)[0][lfe_alloc].steps;
  91.           while ((1L<<n) < stps) n++;
  92. #else
  93.           while  ( ( (unsigned long)(1L<<(long)n) <
  94.                    ((unsigned long) ((*alloc)[i][bit_alloc[k][i]].steps)
  95.                    & 0xffff)
  96.                    ) && ( n< 16)
  97.                   ) n++;
  98. #endif
  99.           n--;
  100.           sbband[s] = (unsigned int) (d * (double) (1L<<n));
  101.           /* tag the inverted sign bit to sbband at position N */
  102.           /* The bit inversion is a must for grouping with 3,5,9 steps
  103.              so it is done for all subbands */
  104.           if (sig) sbband[s] |= 1<<n;
  105.         }
  106. }
  107. void II_encode_lfe_alloc(
  108. unsigned int lfe_alloc, 
  109. frame_params *fr_ps, 
  110. Bit_stream_struc *bs)
  111. {
  112.     al_table *alloc = fr_ps->alloc;
  113.     putbits(bs, lfe_alloc, (*alloc)[0][0].bits);
  114. }
  115. void II_lfe_sample_encoding(
  116.     unsigned int lfe_sbband[12], 
  117.     unsigned int lfe_alloc, 
  118.     frame_params *fr_ps, 
  119.     Bit_stream_struc *bs)
  120. {
  121.    unsigned int s, j;
  122.    al_table *alloc = fr_ps->alloc;
  123.    for (s=0;s<12;s++)
  124.      if ((*alloc)[0][lfe_alloc].group == 3){
  125.        putbits(bs, lfe_sbband[s], (*alloc)[0][lfe_alloc].bits);
  126.      }
  127. }
  128. /***********************************************************************
  129.  *
  130.  *
  131.  * filter()
  132.  *
  133.  * A lf-filter to produce the LFE signal
  134.  *
  135.  **********************************************************************/
  136.  void lfe_filter(
  137. double  **buffer, 
  138. double lfe_sample[12])
  139.  {
  140.     static double c;
  141.     static double d[8];
  142.     static double w1[8], w2[8], v0[8], v1[8], v2[8];
  143.     static double a0[8], a1[8], a2[8], b0[8], b1[8], b2[8];
  144.     static double A0[8], B0[8], B1[8], B2[8];
  145.     static int fa, fg;
  146.     static int init = 0;
  147.     int i, j, k;
  148.     double sambuf[1152];
  149.     if(init == 0){
  150.       for(i=0;i<8;i++)
  151.         w1[i] = w2[i] =
  152.         v0[i] = v1[i] = v2[i] = 0.0;
  153.       fg = 125;                  /* cutoff-frequency */
  154.       fa = 48000;                /* sampling-frequency */
  155.       /* filter coefficients */
  156.       for (i = 0; i < 8; i++){
  157.         A0[i]=B0[i]=B2[i]=1.0;
  158.         B1[i]=2*cos((2*i+1)*PI/(4*8));
  159.       }
  160.       c = 1/tan(PI * fg /fa);
  161.       for (i = 0; i < 8; i++){
  162.         d[i] = (B0[i] + (B1[i] * c) + (B2[i] * c * c));
  163.         a0[i] = A0[i] / d[i];
  164.         a1[i] = 2 * A0[i] / d[i];
  165.         a2[i] = A0[i] / d[i];
  166.         b0[i] = 1;
  167.         b1[i] = 2 * (B0[i] - (B2[i] * c * c)) / d[i];
  168.         b2[i] = (B0[i] - (B1[i] * c) + (B2[i] * c * c)) / d[i];
  169.       }
  170.       init = 1;
  171.     }
  172.     j = 0;
  173.     for(i = 0; i < 1152; i++){
  174.       sambuf[i] = **buffer ;
  175.       for(k = 0; k < 8; k++){
  176.         v0[k] = sambuf[i];
  177.         sambuf[i] = v0[k] * a0[k] + v1[k] * a1[k] + v2[k] * a2[k] - w1[k] * b1[k
  178. ] - w2[k] * b2[k];
  179.         v2[k] = v1[k]; v1[k] = v0[k];
  180.         w2[k] = w1[k]; w1[k] = sambuf[i];
  181.       }
  182.       (*buffer)++;
  183.     }
  184.     i = 0;
  185.     for (j = 0; j < 12; j++){
  186.       lfe_sample[j] = sambuf[i]/SCALE;
  187.       i += 96;
  188.     }
  189.  }