www.pudn.com > shine.zip > l3mdct.c


//    Shine is an MP3 encoder 
//    Copyright (C) 1999-2000  Gabriel Bouvigne 
// 
//    This library is free software; you can redistribute it and/or 
//    modify it under the terms of the GNU Library General Public 
//    License as published by the Free Software Foundation; either 
//    version 2 of the License, or (at your option) any later version. 
// 
//    This library is distributed in the hope that it will be useful, 
//    but WITHOUT ANY WARRANTY; without even the implied warranty of 
//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
//    Library General Public License for more details. 
 
 
#include  
 
#include "types.h" 
#include "layer3.h" 
#include "l3mdct.h" 
 
 
/* This is table B.9: coefficients for aliasing reduction */ 
static double c[8] = { -0.6,-0.535,-0.33,-0.185,-0.095,-0.041,-0.0142, -0.0037 }; 
static double ca[8]; 
static double cs[8]; 
 
static double win[36]; 
static double cos_l[18][36]; 
 
 
void mdct_initialise() 
{ 
    int i,m,k; //N; 
    double sq; 
 
/* prepare the aliasing reduction butterflies */ 
    for (i=8; i--; ) 
    { 
        sq = sqrt(1.0 + sq(c[i])); 
        ca[i] = c[i] / sq; 
        cs[i] = 1.0  / sq; 
    } 
 
    for(i=36; i--; ) 
		win[i] = sin( PI36 * (i + 0.5) ); 
 
 
    //N = 36; 
    for (m = 0; m < 18; m++ ) 
      for (k = 0; k < 36; k++ ) 
        cos_l[m][k] = cos( (PI / (72)) * (2 * k +19) * 
                     (2 * m + 1) ) / (9); 
 
} 
 
 
static void mdct( double *in, double *out ) 
/*-------------------------------------------------------------------*/ 
/*   Function: Calculation of the MDCT                               */ 
/*   In the case of long blocks ( block_type 0,1,3 ) there are       */ 
/*   36 coefficents in the time domain and 18 in the frequency       */ 
/*   domain.                                                         */ 
/*-------------------------------------------------------------------*/ 
{ 
    int k,m; 
 
        for(m=18; m--; ) 
        { 
            out[m]= win[35] * in[35] * cos_l[m][35]; 
            for(k=35; k--; ) 
                out[m] += win[k] * in[k] * cos_l[m][k]; 
        } 
} 
 
 
void mdct_sub(double sb_sample[2][3][18][SBLIMIT],  
                 double (*mdct_freq)[2][samp_per_frame2],  
                 side_info_t *side_info) 
{ 
 
    double (*mdct_enc)[2][32][18] = (double (*)[2][32][18]) mdct_freq; 
 
    int      ch,gr,band,k,j; 
    gr_info *cod_info; 
    double   mdct_in[36]; 
    double   bu,bd; 
     
    for(gr=0; gr<2; gr++) 
        for(ch=config.wave.channels; ch--; ) 
        { 
	    cod_info = (gr_info*) &(side_info->gr[gr].ch[ch]) ; 
	     
/* Compensate for inversion in the analysis filter */ 
	    for(band=32; band--; ) 
		for(k=18; k--; ) 
		    if((band&1) && (k&1)) 
				sb_sample[ch][gr+1][k][band] *= -1.0; 
	     
/* Perform imdct of 18 previous subband samples + 18 current subband samples */ 
	   for(band=32; band--; ) 
	    { 
		for(k=18; k--; ) 
		{ 
		    mdct_in[k]    = sb_sample[ch][ gr ][k][band]; 
		    mdct_in[k+18] = sb_sample[ch][gr+1][k][band]; 
		} 
		 
		mdct(mdct_in,&mdct_enc[gr][ch][band][0]); 
	    } 
	     
/* Perform aliasing reduction butterfly*/ 
		for(band=31; band--; ) 
		    for(k=8; k--; ) 
		    { 
			bu = mdct_enc[gr][ch][band][17-k] * cs[k] + mdct_enc[gr][ch][band+1][k] * ca[k]; 
			bd = mdct_enc[gr][ch][band+1][k] * cs[k] - mdct_enc[gr][ch][band][17-k] * ca[k]; 
			mdct_enc[gr][ch][band][17-k] = bu; 
			mdct_enc[gr][ch][band+1][k]  = bd; 
		    } 
	} 
     
/* Save latest granule's subband samples to be used in the next mdct call */ 
    for(ch=config.wave.channels ;ch--; ) 
	for(j=18; j--; ) 
	    for(band=32; band--; ) 
			sb_sample[ch][0][j][band] = sb_sample[ch][2][j][band]; 
}