ref: 6ae311389e77dd9d979760170be967b4559d9d57
parent: fc2a0b223565a46e642d762e659e2c589624eb13
author: menno <menno>
date: Wed Feb 23 08:26:21 EST 2000
Removed winswitch.c
--- a/Makefile
+++ b/Makefile
@@ -9,7 +9,7 @@
DESTDIR =
-SOURCE=aac_qc.c aac_se_enc.c bitstream.c enc_tf.c encoder.c is.c mc_enc.c ms.c psych.c pulse.c tns.c transfo.c fastfft.c nok_ltp_enc.c nok_pitch.c winswitch.c rateconv.c faac.c
+SOURCE=aac_qc.c aac_se_enc.c bitstream.c enc_tf.c encoder.c is.c mc_enc.c ms.c psych.c pulse.c tns.c transfo.c fastfft.c nok_ltp_enc.c nok_pitch.c rateconv.c faac.c
OBJ = $(SOURCE:.c=.o)
--- a/enc_tf.c
+++ b/enc_tf.c
@@ -15,10 +15,8 @@
#include "all.h"
#include "aac_se_enc.h"
#include "nok_ltp_enc.h"
-#include "winswitch.h"
#include "transfo.h"
-#define SQRT2 C_SQRT2
/* AAC tables */
@@ -172,7 +170,6 @@
/* initialize psychoacoustic module */
EncTf_psycho_acoustic_init();
-// winSwitchInit(max_ch);
/* initialize spectrum processing */
/* initialize quantization and coding */
@@ -340,39 +337,7 @@
* block_switch processing
*
******************************************************************************************************************************/
-#if 0
- /* Window switching taken from the NTT source code in the MPEG4 VM. */
{
- static int ntt_InitFlag = 1;
- static double *sig_tmptmp, *sig_tmp;
- int ismp, i_ch, top;
- /* initialize */
- if (ntt_InitFlag){
- sig_tmptmp = malloc(max_ch*block_size_samples*3*sizeof(double));
- sig_tmp = sig_tmptmp + block_size_samples * max_ch;
- for (i_ch=0; i_ch<max_ch; i_ch++){
- top = i_ch * block_size_samples;
- for (ismp=0; ismp<block_size_samples; ismp++){
- sig_tmp[ismp+top] = DTimeSigBuf[i_ch][ismp];
- }
- }
- }
- for (i_ch=0; i_ch<max_ch; i_ch++){
- top = i_ch * block_size_samples;
- for (ismp=0; ismp<block_size_samples; ismp++){
- sig_tmp[ismp+block_size_samples*max_ch+top] =
- DTimeSigLookAheadBuf[i_ch][ismp];
- }
- }
- /* automatic switching module */
- winSwitch(sig_tmp, &block_type[0], ntt_InitFlag);
- for (ismp=0; ismp<block_size_samples*2*max_ch; ismp++){
- sig_tmp[ismp-block_size_samples*max_ch] = sig_tmp[ismp];
- }
- ntt_InitFlag = 0;
- }
-#else
- {
int chanNum;
for (chanNum=0;chanNum<max_ch;chanNum++) {
/* A few definitions: */
@@ -400,7 +365,6 @@
desired_block_type[chanNum]=next_desired_block_type[chanNum];
}
}
-#endif
// printf("%d\t\n", block_type[0]);
// block_type[0] = ONLY_LONG_WINDOW;
--- a/faac.dsp
+++ b/faac.dsp
@@ -108,6 +108,10 @@
# End Source File
# Begin Source File
+SOURCE=.\faac.c
+# End Source File
+# Begin Source File
+
SOURCE=.\fastfft.c
# End Source File
# Begin Source File
@@ -149,14 +153,6 @@
# Begin Source File
SOURCE=.\transfo.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\winswitch.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\faac.c
# End Source File
# End Group
# End Target
--- a/faac_dll.dsp
+++ b/faac_dll.dsp
@@ -112,6 +112,10 @@
# End Source File
# Begin Source File
+SOURCE=.\faac.c
+# End Source File
+# Begin Source File
+
SOURCE=.\fastfft.c
# End Source File
# Begin Source File
@@ -153,14 +157,6 @@
# Begin Source File
SOURCE=.\transfo.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\winswitch.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\faac.c
# End Source File
# End Group
# Begin Group "Resource Files"
--- a/winswitch.c
+++ /dev/null
@@ -1,333 +1,0 @@
-
-/*
- * Window switching module
- * Most of this has been taken from NTT source code in the MPEG-4
- * Verification Model.
- *
- * TODO:
- * - better multi-channel support
- */
-
-#include <math.h>
-#include "tf_main.h"
-#include "winswitch.h"
-
-#define ntt_N_SUP_MAX 2
-
-int num_channel;
-
-
-int winSwitch(/* Input */
- double sig[], /* input signal */
- /* Output */
- enum WINDOW_TYPE *w_type, /* code index for block type */
- /* Control */
- int InitFlag)/* initialization flag */
-{
- /*--- Variables ---*/
- int s_attack;
- int ratio;
-
- /*--- A.Jin 1997.10.19 ---*/
- ratio = checkAttack(sig, &s_attack, InitFlag);
-
- getWindowType( s_attack, w_type, InitFlag );
- return ratio;
-}
-
-
-void getWindowType(int flag, /* Input : trigger for short block length */
- enum WINDOW_TYPE *w_type, /* Output : code index for block type */
- int InitFlag ) /* Control : initialization flag */
-{
- static int w_type_pre;
- static int flag_pre;
-
- if ( InitFlag ){
- flag_pre = 0;
- w_type_pre = ONLY_LONG_WINDOW;
- }
-
- if (InitFlag){
- if (flag) *w_type = ONLY_SHORT_WINDOW;
- else *w_type = ONLY_LONG_WINDOW;
- }
- else{
- switch( w_type_pre ){
- case ONLY_LONG_WINDOW:
- if ( flag ) *w_type = LONG_SHORT_WINDOW;
- else *w_type = ONLY_LONG_WINDOW;
- break;
- case LONG_SHORT_WINDOW:
- *w_type = ONLY_SHORT_WINDOW;
- break;
- case SHORT_LONG_WINDOW:
- if ( flag ) *w_type = LONG_SHORT_WINDOW;
- else *w_type = ONLY_LONG_WINDOW;
- break;
- case ONLY_SHORT_WINDOW:
- if (flag || flag_pre) *w_type = ONLY_SHORT_WINDOW;
- else *w_type = SHORT_LONG_WINDOW;
- }
- }
- w_type_pre = *w_type;
- flag_pre = flag;
-}
-
-
-#define ST_CHKATK (BLOCK_LEN_LONG/2+BLOCK_LEN_SHORT/2)
-
-#define N_BLK_MAX 4096
-#define N_SFT_MAX 256
-#define N_LPC_MAX 2
-
-__inline void ZeroMem(int n, double xx[])
-{
- int i = n;
- while(i-- != 0)
- *(xx++) = 0.0;
-}
-
-void LagWindow(/* Output */
- double wdw[], /* lag window data */
- /* Input */
- int n, /* dimension of wdw[.] */
- double h) /* ratio of window half value band width to sampling frequency */
-{
- int i;
- double pi=3.14159265358979323846264338327959288419716939;
- double a,b,w;
- if(h<=0.0) for(i=0;i<=n;i++) wdw[i]=1.0;
- else
- {
- a=log(0.5)*0.5/log(cos(0.5*pi*h));
- a=(double)((int)a);
- w=1.0; b=a; wdw[0]=1.0;
- for(i=1;i<=n;i++)
- {
- b+=1.0; w*=a/b; wdw[i]=w; a-=1.0;
- }
- }
-}
-
-void HammingWindow(/* Output */
- double wdw[], /* Hamming window data */
- int n) /* window length */
-{
- int i;
- double d,pi=3.14159265358979323846264338327950288419716939;
- if(n>0)
- {
- d=2.0*pi/n;
- for(i=0;i<n;i++)
- wdw[i]=0.54-0.46*cos(d*i);
- }
-}
-
-__inline void ntt_cutfr(int st, /* Input --- Start point */
- int len, /* Input --- Block length */
- int ich, /* Input --- Channel number */
- double frm[], /* Input --- Input frame */
- double buf[]) /* Output --- Output data buffer */
-{
- /*--- Variables ---*/
- int stb, sts, edb, nblk, iblk, ibuf, ifrmb, ifrms;
-
- stb = (st/BLOCK_LEN_LONG)*num_channel + ich; /* start block */
- sts = st % BLOCK_LEN_LONG; /* start sample */
- edb = ((st+len)/BLOCK_LEN_LONG)*num_channel + ich; /* end block */
- nblk = (edb-stb)/num_channel; /* number of overflow */
-
- ibuf=0; ifrmb=stb; ifrms=sts;
- for ( iblk=0; iblk<nblk; iblk++ ){
- while( ifrms < BLOCK_LEN_LONG ) buf[ibuf++] = frm[(ifrms++)+ifrmb*BLOCK_LEN_LONG];
- ifrms = 0;
- ifrmb += num_channel;
- }
- while( ibuf < len )
- buf[ibuf++] = frm[(ifrms++)+ifrmb*BLOCK_LEN_LONG];
-}
-
-__inline void CopyMem(int n, double xx[], double yy[])
-{
- int i = n;
- if (i <= 0)
- return;
- do {
- *(yy++) = *(xx++);
- } while(--i);
-}
-
-__inline double DotProd(/* Input */
- int n, /* dimension of data */
- double xx[],
- double yy[])
-{
- int i;
- double s;
- s=0.0;
- for(i=0;i<n;i++)
- s+=xx[i]*yy[i];
- return(s);
-}
-
-__inline void ntt_mulddd(/* Input */
- int n, /* dimension of data */
- double xx[],
- double yy[],
- /* Output */
- double zz[])
-{
- int i;
- for (i=0; i<n; i++ )
- zz[i] = xx[i]*yy[i];
-}
-
-__inline void AutoCorr(double *sig, /* Input : signal sample sequence */
- int n, /* Input : length of sample sequence*/
- double *_pow,/* Output : power */
- double cor[],/* Output : autocorrelation coefficients */
- int p)
-{
- int k;
- register double sqsum,c, dsqsum;
-
- if (n>0) {
- sqsum = DotProd(n, sig, sig)+1.e-35;
- dsqsum = 1./sqsum;
- k=p;
- do {
- c = DotProd(n-k, sig, sig+k);
- cor[k] = c*dsqsum;
- }while(--k);
- }
- *_pow = (sqsum-1.e-35)/(double)n;
-}
-
-__inline void Corr2Ref(int p, /* Input : LPC analysis order */
- double cor[], /* Input : correlation coefficients */
- double alf[], /* Output : linear predictive coefficients */
- double ref[], /* Output : reflection coefficients */
- double *resid_) /* Output : normalized residual power */
-{
- int i,j,k;
- double resid,r,a;
- if(p>0) {
- ref[1]=cor[1];
- alf[1]= -ref[1];
- resid=(1.0-ref[1])*(1.0+ref[1]);
- for(i=2;i<=p;i++) {
- r=cor[i];
- for(j=1;j<i;j++)
- r+=alf[j]*cor[i-j];
- alf[i]= -(ref[i]=(r/=resid));
- j=0; k=i;
- while(++j<=--k) {
- a=alf[j];
- alf[j]-=r*alf[k];
- if(j<k) alf[k]-=r*a;
- }
- resid*=(1.0-r)*(1.0+r);
- }
- *resid_=resid;
- }
- else
- *resid_=1.0;
-}
-
-int checkAttack(double in[], /* Input signal */
- int *flag, /* flag for attack */
- int InitFlag) /* Initialization Flag */
-{
- /*--- Variables ---*/
- int n_div, iblk, ismp, ich;
- double bufin[N_SFT_MAX];
- static double sig[ntt_N_SUP_MAX][N_BLK_MAX+N_LPC_MAX];
- double wsig[N_BLK_MAX];
- static double wdw[N_BLK_MAX];
- static double wlag[N_LPC_MAX+1];
- double cor[N_LPC_MAX+1],ref[N_LPC_MAX+1],alf[N_LPC_MAX+1];
- static double prev_alf[ntt_N_SUP_MAX][N_LPC_MAX+1];
- double resid, wpowfr;
- double long_power;
- double synth, resid2;
- static int N_BLK, N_SFT, S_POW, L_POW, N_LPC;
- double ratio, sum, product;
-
- /*--- Initialization ---*/
- if ( InitFlag ){
- /* Set parameters */
- N_BLK = BLOCK_LEN_LONG;
- N_SFT = BLOCK_LEN_SHORT;
- S_POW = BLOCK_LEN_SHORT;
- L_POW = BLOCK_LEN_LONG;
- N_LPC = 1;
- /* clear buffers */
- for ( ich=0; ich<num_channel; ich++ ){
- ZeroMem( N_LPC+N_BLK, sig[ich] );
- ZeroMem( N_LPC+1, prev_alf[ich] );
- }
- /* set windows */
- LagWindow( wlag, N_LPC, 0.02 );
- HammingWindow( wdw, N_BLK );
- }
-
-
- n_div = BLOCK_LEN_LONG/N_SFT;
- *flag = 0;
- sum=0.0;
- product=1.0;
- for ( ich=0; ich<num_channel; ich++ ){
- for ( iblk=0; iblk<n_div; iblk++ ){
- ntt_cutfr( ST_CHKATK+iblk*N_SFT, N_SFT, ich, in, bufin );
- CopyMem(N_SFT,bufin,&sig[ich][N_LPC+N_BLK-N_SFT]);
- /*--- Calculate long power ---*/
- long_power =
- (DotProd( L_POW, &sig[ich][N_BLK-L_POW], &sig[ich][N_BLK-L_POW] )+0.1)
- / L_POW;
- long_power = sqrt(long_power);
-
- /*--- Calculate alpha parameter ---*/
- ntt_mulddd( N_BLK, &sig[ich][N_LPC], wdw, wsig );
- AutoCorr( wsig, N_BLK, &wpowfr, cor, N_LPC ); cor[0] = 1.0;
- ntt_mulddd( N_LPC+1, cor, wlag, cor );
- Corr2Ref( N_LPC, cor, alf, ref, &resid );
- /*--- Get residual signal and its power ---*/
- resid2 = 0.;
- for ( ismp=N_BLK-S_POW; ismp<N_BLK; ismp++ ){
- synth = sig[ich][ismp]+
- prev_alf[ich][1]*sig[ich][ismp-1];
- resid2 += synth*synth;
- }
- resid2 /= long_power;
- resid2 = sqrt(resid2);
- sum += resid2+0.0001;
- product *= (resid2+0.0001);
-
- CopyMem( N_LPC, &alf[1], &prev_alf[ich][1] );
-
- CopyMem( N_BLK-N_SFT, &sig[ich][N_LPC+N_SFT], &sig[ich][N_LPC] );
- }
- }
-/* ratio = sum/(n_div*num_channel)/pow(product, 1./(double)(n_div*num_channel)); */
- /* This below is a bit different than the commented line above here,
- but I like it better this way, because it gives higher values,
- that are better to tune. */
- ratio = pow(product, 1./(double)(n_div*num_channel));
- ratio = (n_div*num_channel)/ratio;
- ratio = sum/ratio;
-
- if(ratio > 8000) {
- *flag = 1;
- } else {
- *flag = 0;
- }
- return (int)(ratio+0.5);
-}
-
-
-void winSwitchInit(int max_ch)
-{
- num_channel = max_ch;
-}
-
--- a/winswitch.h
+++ /dev/null
@@ -1,24 +1,0 @@
-
-#ifndef _WINSWITCH_H_
-#define _WINSWITCH_H_
-
-void getWindowType(int flag, /* Input : trigger for short block length */
- enum WINDOW_TYPE *w_type, /* Output : code index for block type*/
- int InitFlag ); /* Control : initialization flag */
-
-int checkAttack(double in[], /* Input : input signal */
- int *flag,/* Output : trigger for short block length */
- int InitFlag); /* Control : initialization flag */
-
-
-int winSwitch(/* Input */
- double sig[], /* input signal */
- /* Output */
- enum WINDOW_TYPE *w_type, /* Output : code index for block type*/
- /* Control */
- int InitFlag); /* initialization flag */
-
-void winSwitchInit(int max_ch);
-
-#endif
-