📄 l3mdct.c
字号:
#include <math.h>#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[4][36];static double cos_s[6][12];static double cos_l[18][36];void L3_mdct_initialise(){ int i,m,k,N; double sq;/* prepare the aliasing reduction butterflies */ for (i=0;i<8;i++) { sq = sqrt(1.0 + c[i]*c[i]); ca[i] = c[i] / sq; cs[i] = 1.0 / sq; } /* type 0 */ for(i=0; i < 36; i++ ) win[0][i] = sin( PI/36 * (i + 0.5) ); /* type 1*/ for(i=0; i < 18; i++ ) win[1][i] = sin( PI/36 * (i + 0.5) ); for(i=18; i < 24; i++ ) win[1][i] = 1.0; for(i=24; i < 30; i++ ) win[1][i] = sin( PI/12 * ( i + 0.5 - 18) ); for(i=30; i < 36; i++ ) win[1][i] = 0.0; /* type 3*/ for(i= 0; i < 6; i++ ) win[3][i] = 0.0; for(i= 6; i < 12; i++ ) win[3][i] = sin( PI/12 * (i + 0.5 - 6) ); for(i= 12; i < 18; i++ ) win[3][i] = 1.0; for(i= 18; i < 36; i++ ) win[3][i] = sin( PI/36 * (i + 0.5) ); /* type 2*/ for(i=0; i < 12; i++ ) win[2][i] = sin( PI/12 * (i + 0.5) ); for(i=12; i < 36; i++ ) win[2][i] = 0.0; N = 12; for (m = 0; m < N / 2; m++ ) for (k = 0; k < N; k++ ) cos_s[m][k] = cos( (PI /(2 * N)) * (2 * k + 1 + N / 2) * (2 * m + 1) ) / (N / 4); N = 36; for (m = 0; m < N / 2; m++ ) for (k = 0; k < N; k++ ) cos_l[m][k] = cos( (PI / (2 * N)) * (2 * k + 1 + N / 2) * (2 * m + 1) ) / (N / 4);}static void mdct( double *in, double *out, int block_type )/*-------------------------------------------------------------------*//* 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. *//* In the case of short blocks (block_type 2 ) there are 3 *//* transformations with short length. This leads to 12 coefficents *//* in the time and 6 in the frequency domain. In this case the *//* results are stored side by side in the vector out[]. *//*-------------------------------------------------------------------*/{ int l,k,m,N; double sum; if(block_type==2) { N=12; for(l=0;l<3;l++) for(m=0;m<N/2;m++) { sum=0.0; for(k=0;k<N;k++) sum += win[block_type][k] * in[k + 6 * l + 6] * cos_s[m][k]; out[ 3 * m + l] = sum; } } else { N=36; for(m=0;m<N/2;m++) { sum=0.0; for(k=0;k<N;k++) sum += win[block_type][k] * in[k] * cos_l[m][k]; out[m] = sum; } }}void L3_mdct_sub(double sb_sample[2][3][18][SBLIMIT], double (*mdct_freq)[2][576], L3_side_info_t *side_info){ double (*mdct_enc)[2][32][18] = (double (*)[2][32][18]) mdct_freq; int ch,gr,band,k,j; int block_type; gr_info *cod_info; double mdct_in[36]; double bu,bd; for(gr=0;gr<config.mpeg.mode_gr;gr++) for(ch=0;ch<config.wave.channels;ch++) { cod_info = (gr_info*) &(side_info->gr[gr].ch[ch]) ; block_type = cod_info->block_type; /* Compensate for inversion in the analysis filter */ for(band=0;band<32;band++) for(k=0;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=0;band<32;band++) { for(k=0;k<18;k++) { mdct_in[k] = sb_sample[ch][ gr ][k][band]; mdct_in[k+18] = sb_sample[ch][gr+1][k][band]; } if(cod_info->mixed_block_flag && (band<2)) block_type=0; mdct(mdct_in,&mdct_enc[gr][ch][band][0],block_type); } /* Perform aliasing reduction butterfly on long blocks */ if(block_type!=2) for(band=0;band<31;band++) for(k=0;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=0;ch<config.wave.channels;ch++) for(j=0;j<18;j++) for(band=0;band<32;band++) sb_sample[ch][0][j][band] = sb_sample[ch][config.mpeg.mode_gr][j][band];}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -