mdct.c
上传用户:bjsgzm
上传日期:2007-01-08
资源大小:256k
文件大小:7k
源码类别:

mpeg/mp3

开发平台:

Visual C++

  1. /*
  2. (c) Copyright 1998, 1999 - Tord Jansson
  3. =======================================
  4. This file is part of the BladeEnc MP3 Encoder, based on
  5. ISO's reference code for MPEG Layer 3 compression, and might
  6. contain smaller or larger sections that are directly taken
  7. from ISO's reference code.
  8. All changes to the ISO reference code herein are either
  9. copyrighted by Tord Jansson (tord.jansson@swipnet.se)
  10. or sublicensed to Tord Jansson by a third party.
  11. BladeEnc is free software; you can redistribute this file
  12. and/or modify it under the terms of the GNU Lesser General Public
  13. License as published by the Free Software Foundation; either
  14. version 2.1 of the License, or (at your option) any later version.
  15. */
  16. /**********************************************************************
  17.  * ISO MPEG Audio Subgroup Software Simulation Group (1996)
  18.  * ISO 13818-3 MPEG-2 Audio Encoder - Lower Sampling Frequency Extension
  19.  *
  20.  * $Id: mdct.c,v 1.1 1996/02/14 04:04:23 rowlands Exp $
  21.  *
  22.  * $Log: mdct.c,v $
  23.  * Revision 1.1  1996/02/14 04:04:23  rowlands
  24.  * Initial revision
  25.  *
  26.  * Received from Mike Coleman
  27.  **********************************************************************/
  28. #include "common.h"
  29. #include "l3side.h"
  30. #include "mdct.h"
  31. double ca[8], cs[8];
  32. /*
  33.   This is table B.9: coefficients for aliasing reduction
  34. */
  35. static double c[8] = { -0.6,-0.535,-0.33,-0.185,-0.095,-0.041,-0.0142, -0.0037 };
  36. int fInit_mdct_sub;
  37. void mdct_sub( L3SBS (*sb_sample), double (*mdct_freq)[2][576], int stereo, III_side_info_t *l3_side, int mode_gr )
  38. {
  39.   gr_info *cod_info;
  40.   double mdct_in[36];
  41.   int ch,gr,band,k,j;
  42.   double bu,bd;
  43.   int block_type;
  44.   double (*mdct_enc)[2][32][18] = (double (*)[2][32][18]) mdct_freq;
  45.     
  46.   if ( fInit_mdct_sub == 0 )
  47.   {
  48. /* prepare the aliasing reduction butterflies */
  49. for ( k = 0; k < 8; k++ )
  50. {
  51. double sq;
  52. sq = sqrt( 1.0 + c[k] * c[k] );
  53. ca[k] = c[k] / sq;
  54. cs[k] = 1.0 / sq;
  55. }
  56. fInit_mdct_sub++;
  57. }
  58.     
  59.   for ( gr = 0; gr < mode_gr; gr++ )
  60. for ( ch = 0; ch < stereo; ch++ )
  61. {
  62. cod_info = (gr_info *) &(l3_side->gr[gr].ch[ch]) ;
  63. block_type = cod_info->block_type;
  64.     
  65. /* Compensate for inversion in the analysis filter */
  66. for ( band = 0; band < 32; band++ )
  67. for ( k = 0; k < 18; k++ )
  68. if ( (band & 1) && (k & 1) )
  69. (*sb_sample)[ch][gr+1][k][band] *= -1.0;
  70.     
  71. /*
  72. Perform imdct of 18 previous subband samples
  73. + 18 current subband samples
  74. */
  75. for ( band = 0; band < 32; band++ )
  76. {
  77. for ( k = 0; k < 18; k++ )
  78. {
  79. mdct_in[k]    = (*sb_sample)[ch][ gr ][k][band];
  80. mdct_in[k+18] = (*sb_sample)[ch][gr+1][k][band];
  81. }
  82. if ( cod_info->mixed_block_flag && (band < 2) )
  83. block_type = 0;
  84. mdct( mdct_in, &mdct_enc[gr][ch][band][0], block_type );
  85.     }
  86.     
  87.     /*
  88.       Perform aliasing reduction butterfly
  89.       on long blocks
  90.     */
  91. if ( block_type != 2 )
  92. for ( band = 0; band < 31; band++ )
  93. for ( k = 0; k < 8; k++ )
  94. {
  95. bu = mdct_enc[gr][ch][band][17-k] * cs[k] + mdct_enc[gr][ch][band+1][k] * ca[k];
  96. bd = mdct_enc[gr][ch][band+1][k] * cs[k] - mdct_enc[gr][ch][band][17-k] * ca[k];
  97. mdct_enc[gr][ch][band][17-k] = bu;
  98. mdct_enc[gr][ch][band+1][k]  = bd;
  99.     }
  100.     
  101. }
  102.     
  103.     /*
  104.       Save latest granule's subband samples to be used in
  105.       the next mdct call
  106.     */
  107.     
  108. for ( ch = 0; ch < stereo; ch++ )
  109. for ( j = 0; j < 18; j++ )
  110. for ( band = 0; band < 32; band++ )
  111. (*sb_sample)[ch][0][j][band] = (*sb_sample)[ch][mode_gr][j][band];
  112. }
  113. int fInit_mdct;
  114. void mdct( double *in, double *out, int block_type )
  115. {
  116. /*-------------------------------------------------------------------*/
  117. /*                                                                   */
  118. /*   Function: Calculation of the MDCT                               */
  119. /*   In the case of long blocks ( block_type 0,1,3 ) there are       */
  120. /*   36 coefficents in the time domain and 18 in the frequency       */
  121. /*   domain.                                                         */
  122. /*   In the case of short blocks (block_type 2 ) there are 3         */
  123. /*   transformations with short length. This leads to 12 coefficents */
  124. /*   in the time and 6 in the frequency domain. In this case the     */
  125. /*   results are stored side by side in the vector out[].            */
  126. /*                                                                   */
  127. /*   New layer3                                                      */
  128. /*                                                                   */
  129. /*-------------------------------------------------------------------*/
  130.   int l,k,i,m,N;
  131.   double sum;
  132.   static double win[4][36];
  133.   static double cos_s[6][12], cos_l[18][36];
  134.   if ( fInit_mdct == 0 )
  135.   {
  136.     /* type 0 */
  137.     for ( i = 0; i < 36; i++ )
  138.       win[0][i] = sin( PI/36 * (i + 0.5) );
  139.     /* type 1*/
  140.     for ( i = 0; i < 18; i++ ) 
  141.       win[1][i] = sin( PI/36 * (i + 0.5) );
  142.     for ( i = 18; i < 24; i++ )
  143.       win[1][i] = 1.0;
  144.     for ( i = 24; i < 30; i++ )
  145.       win[1][i] = sin( PI/12 * ( i + 0.5 - 18) );
  146.     for ( i = 30; i < 36; i++ )
  147.       win[1][i] = 0.0;
  148.     /* type 3*/
  149.     for ( i = 0; i < 6; i++ )
  150.       win[3][i] = 0.0;
  151.     for ( i = 6; i < 12; i++ ) 
  152.       win[3][i] = sin( PI/12 * (i + 0.5 - 6) );
  153.     for ( i = 12; i < 18; i++ )
  154.       win[3][i] = 1.0;
  155.     for ( i = 18; i < 36; i++ )
  156.       win[3][i] = sin( PI/36 * (i + 0.5) );
  157.     /* type 2*/
  158.     for ( i = 0; i < 12; i++ )
  159.     win[2][i] = sin( PI/12 * (i + 0.5) );
  160.     for ( i = 12; i < 36; i++ )
  161.       win[2][i] = 0.0;
  162.     N = 12;
  163.     for ( m = 0; m < N / 2; m++ )
  164.       for ( k = 0; k < N; k++ )
  165.         cos_s[m][k] = cos( (PI /(2 * N)) * (2 * k + 1 + N / 2) *
  166.                      (2 * m + 1) ) / (N / 4);
  167.     N = 36;
  168.     for ( m = 0; m < N / 2; m++ )
  169.       for ( k = 0; k < N; k++ )
  170.         cos_l[m][k] = cos( (PI / (2 * N)) * (2 * k + 1 + N / 2) *
  171.                      (2 * m + 1) ) / (N / 4);
  172.     fInit_mdct++;
  173.   }
  174.   if ( block_type == 2 )
  175.   {
  176.     N = 12;
  177.     for ( l = 0; l < 3; l++ )
  178.     {
  179.       for ( m = 0; m < N / 2; m++ )
  180.       {
  181.         for ( sum = 0.0, k = 0; k < N; k++ )
  182.           sum += win[block_type][k] * in[k + 6 * l + 6] * cos_s[m][k];
  183.         out[ 3 * m + l] = sum;
  184.       }
  185.     }
  186.   }
  187.   else
  188.   {
  189.     N = 36;
  190.     for ( m = 0; m < N / 2; m++ )
  191.     {
  192.       for ( sum = 0.0, k = 0; k < N; k++ )
  193.         sum += win[block_type][k] * in[k] * cos_l[m][k];
  194.       out[m] = sum;
  195.     }
  196.   }
  197. }