www.pudn.com > shine.zip > l3subband.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 "tables.h" #include "l3subband.h" static off[2] = {0,0}; static double x[2][HAN_SIZE]; static double filter[SBLIMIT][64]; void subband_initialise() { int i,j,k; for(i=2; i-- ; ) for(j=HAN_SIZE; j--; ) x[i][j] = 0; /* create_ana_filter */ /************************************************************************ * PURPOSE: Calculates the analysis filter bank coefficients * SEMANTICS: * Calculates the analysis filterbank coefficients and rounds to the * 9th decimal place accuracy of the filterbank tables in the ISO * document. The coefficients are stored in #filter# ************************************************************************/ for (i=32; i--; ) for (k=64; k--; ) { if ((filter[i][k] = 1e9*cos((double)((2*i+1)*(16-k)*PI64))) >= 0) modf(filter[i][k]+0.5, &filter[i][k]); else modf(filter[i][k]-0.5, &filter[i][k]); filter[i][k] *= 1e-9; } } void window_subband(short **buffer, double z[HAN_SIZE], int k) /************************************************************************ * PURPOSE: Overlapping window on PCM samples * SEMANTICS: * 32 16-bit pcm samples are scaled to fractional 2's complement and * concatenated to the end of the window buffer #x#. The updated window * buffer #x# is then windowed by the analysis window #enwindow# to produce the * windowed sample #z# ************************************************************************/ { int i; /* replace 32 oldest samples with 32 new samples */ for (i=0;i<32;i++) x[k][31-i+off[k]] = (double)*(*buffer)++/SCALE; /* shift samples into proper window positions */ for (i=HAN_SIZE; i--; ) z[i] = x[k][(i+off[k])&(HAN_SIZE-1)] * enwindow[i]; off[k] += 480; /* offset is modulo (HAN_SIZE)*/ off[k] &= HAN_SIZE-1; } void filter_subband(double z[HAN_SIZE], double s[SBLIMIT]) /************************************************************************ * PURPOSE: Calculates the analysis filter bank coefficients * SEMANTICS: * The windowed samples #z# is filtered by the digital filter matrix #filter# * to produce the subband samples #s#. This done by first selectively * picking out values from the windowed samples, and then multiplying * them by the filter matrix, producing 32 subband samples. * ************************************************************************/ { double y[64]; int i,j; for (i=64; i--; ) for (j=8, y[i] = 0; j--; ) y[i] += z[i+(j<<6)]; for (i=SBLIMIT; i--; ) for (j=64, s[i]= 0; j--; ) s[i] += filter[i][j] * y[j]; }