coder.c
上传用户:shenggui01
上传日期:2022-01-16
资源大小:54k
文件大小:5k
源码类别:

mpeg/mp3

开发平台:

C/C++

  1. /*
  2.  * coder.c
  3.  *
  4.  * 22/02/01
  5.  * Calculation of coefficient tables for sub band windowing
  6.  * analysis filters and mdct.
  7.  */
  8. #include "types.h"
  9. #include "table1.h"
  10. long int
  11.   x[2][HAN_SIZE],
  12.   z[512];
  13. /*
  14.  * L3_window_filter_subband:
  15.  * -------------------------
  16.  * Overlapping window on PCM samples
  17.  * 32 16-bit pcm samples are scaled to fractional 2's complement and
  18.  * concatenated to the end of the window buffer #x#. The updated window
  19.  * buffer #x# is then windowed by the analysis window #enwindow# to produce
  20.  * the windowed sample #z#
  21.  * The windowed samples #z# is filtered by the digital filter matrix #filter#
  22.  * to produce the subband samples #s#. This done by first selectively
  23.  * picking out values from the windowed samples, and then multiplying
  24.  * them by the filter matrix, producing 32 subband samples.
  25.  */
  26. void L3_window_filter_subband(unsigned long **buffer, long s[SBLIMIT] , int k)
  27. {
  28.   static int off[2];
  29.   long y[64],s1,s2;
  30.   int i,j;
  31.   /* replace 32 oldest samples with 32 new samples */
  32.   /* data format depends on mode */
  33.   if(config.mpeg.channels == 1)
  34.     if(config.wave.channels == 2)
  35.     { /* mono from stereo, sum upper and lower */
  36.       for (i=31;i>=0;i--)
  37.       {
  38.         x[k][i+off[k]] = (((**buffer) >> 16) + (((**buffer) << 16)>>16)) << 15;
  39.         (*buffer)++;
  40.       }
  41.     }
  42.     else
  43.     { /* mono data, use upper then lower */
  44.       for (i=15;i>=0;i--)
  45.       {
  46.         x[k][(2*i)+off[k]+1] = (**buffer) << 16;
  47.         x[k][(2*i)+off[k]] = ((*(*buffer)++) >> 16) << 16;
  48.       }
  49.     }
  50.   else if(k)
  51.   { /* stereo left, use upper */
  52.     for (i=31;i>=0;i--)
  53.       x[k][i+off[k]] = (*(*buffer)++) & 0xffff0000;
  54.   }
  55.   else
  56.   { /* stereo right, use lower */
  57.     for (i=31;i>=0;i--)
  58.       x[k][i+off[k]] = (*(*buffer)++) << 16;
  59.   }
  60.   /* shift samples into proper window positions, and window data */
  61.   for (i=HAN_SIZE; i--; )
  62.     z[i] = mul(x[k][(i+off[k])&(HAN_SIZE-1)],ew[i]);
  63.   off[k] = (off[k] + 480) & (HAN_SIZE-1); /* offset is modulo (HAN_SIZE)*/
  64.   /* sub sample the windowed data */
  65.   for (i=64; i--; )
  66.     for (j=8, y[i] = 0; j--; )
  67.       y[i] += z[i+(j<<6)];
  68.   /* combine sub samples for the simplified matrix calculation */
  69.   for (i=0; i<16; i++)
  70.     y[i+17] += y[15-i];
  71.   for (i=0; i<15; i++)
  72.     y[i+33] -= y[63-i];
  73.   /* simlplified polyphase filter matrix multiplication */
  74.   for (i=16; i--; )
  75.     for (j=0, s[i]= 0, s[31-i]=0; j<32; j += 2)
  76.     {
  77.       s1 = mul(fl[i][j],y[j+16]);
  78.       s2 = mul(fl[i][j+1],y[j+17]);
  79.       s[i] += s1 + s2;
  80.       s[31-i] += s1 - s2;
  81.     }
  82. }
  83. /*
  84.  * L3_mdct_sub:
  85.  * ------------
  86.  */
  87. void L3_mdct_sub(long sb_sample[2][3][18][SBLIMIT],
  88.                  long mdct_freq[2][2][samp_per_frame2])
  89. {
  90.   /* note. we wish to access the array 'mdct_freq[2][2][576]' as
  91.    * [2][2][32][18]. (32*18=576),
  92.    */
  93.   long (*mdct_enc)[18];
  94.   int  ch,gr,band,j,k;
  95.   long mdct_in[36];
  96.   long bu,bd,*m;
  97.   for(gr=0; gr<config.mpeg.granules; gr++)
  98.     for(ch=config.mpeg.channels; ch--; )
  99.     {
  100.       /* set up pointer to the part of mdct_freq we're using */
  101.       mdct_enc = (long (*)[18]) mdct_freq[gr][ch];
  102.       /* Compensate for inversion in the analysis filter
  103.        * (every odd index of band AND k)
  104.        */
  105.       for(band=1; band<=31; band+=2 )
  106.         for(k=1; k<=17; k+=2 )
  107.           sb_sample[ch][gr+1][k][band] *= -1;
  108.       /* Perform imdct of 18 previous subband samples + 18 current subband samples */
  109.       for(band=32; band--; )
  110.       {
  111.         for(k=18; k--; )
  112.         {
  113.           mdct_in[k]    = sb_sample[ch][ gr ][k][band];
  114.           mdct_in[k+18] = sb_sample[ch][gr+1][k][band];
  115.         }
  116.         /* Calculation of the MDCT
  117.          * In the case of long blocks ( block_type 0,1,3 ) there are
  118.          * 36 coefficients in the time domain and 18 in the frequency
  119.          * domain.
  120.          */
  121.         for(k=18; k--; )
  122.         {
  123.           m = &mdct_enc[band][k];
  124.           for(j=36, *m=0; j--; )
  125.             *m += mul(mdct_in[j],cos_l[k][j]);
  126.         }
  127.       }
  128.       /* Perform aliasing reduction butterfly */
  129.       for(band=31; band--; )
  130.         for(k=8; k--; )
  131.         {
  132.           /* must left justify result of multiplication here because the centre
  133.            * two values in each block are not touched.
  134.            */
  135.           bu = muls(mdct_enc[band][17-k],cs[k]) + muls(mdct_enc[band+1][k],ca[k]);
  136.           bd = muls(mdct_enc[band+1][k],cs[k]) - muls(mdct_enc[band][17-k],ca[k]);
  137.           mdct_enc[band][17-k] = bu;
  138.           mdct_enc[band+1][k]  = bd;
  139.         }
  140.     }
  141.   /* Save latest granule's subband samples to be used in the next mdct call */
  142.   for(ch=config.mpeg.channels ;ch--; )
  143.     for(j=18; j--; )
  144.       for(band=32; band--; )
  145.         sb_sample[ch][0][j][band] = sb_sample[ch][config.mpeg.granules][j][band];
  146. }