From 0bcfb0f81588aae19ee64d389dad2a75c2389dc1 Mon Sep 17 00:00:00 2001 From: Monty Date: Mon, 31 Jul 2000 19:41:00 +0000 Subject: Incermental commit during tuning Monty svn path=/branches/monty_branch_20000724/vorbis/; revision=538 --- lib/masking.h | 14 ++-- lib/psy.c | 253 ++++++++++++++++++++++++++++++++-------------------------- lib/psytune.c | 100 ++++++++++++++++------- 3 files changed, 221 insertions(+), 146 deletions(-) (limited to 'lib') diff --git a/lib/masking.h b/lib/masking.h index e1c3680e..6837a12b 100644 --- a/lib/masking.h +++ b/lib/masking.h @@ -12,7 +12,7 @@ ******************************************************************** function: masking curve data for psychoacoustics - last mod: $Id: masking.h,v 1.3.4.2 2000/07/29 13:27:57 xiphmont Exp $ + last mod: $Id: masking.h,v 1.3.4.3 2000/07/31 19:41:00 xiphmont Exp $ ********************************************************************/ @@ -69,14 +69,18 @@ double tone_250_60dB_SL[EHMER_MAX]={ -900,-900,-900,-900,-900,-900,-900,-900}; double tone_250_80dB_SL[EHMER_MAX]={ -900,-900,-900,-900,-900,-900,-900, -10, 10, 17, 24, 30, 37, 41, 48, 49, - 60, /* minor hack */ - - 53, 54, 53, 53, 54, 55, 57, 57, 57, 58, 59, 60, 58, 57, 58, + 50, 53, 54, 53, 53, 54, 55, 57, 57, 57, 58, 59, 60, 58, 57, 58, 59, 58, 57, 54, 52, 50, 49, 47, 46, 47, 46, 44, 43, 42, 41, 40, 38, 32, 27, 22, 17, 11, 6, 0}; +/* no data, just interpolated from 80 */ +double tone_250_100dB_SL[EHMER_MAX]={ +-900,-900,-900,-900,-900,-900,-900, -10, 15, 25, 34, 40, 50, 56, 60, 70, + 70, 73, 74, 73, 73, 74, 75, 77, 77, 77, 78, 79, 80, 78, 77, 78, + 79, 78, 77, 74, 72, 70, 69, 67, 66, 67, 66, 64, 63, 62, 61, 60, + 58, 52, 47, 42, 37, 31, 26, 20}; double tone_500_40dB_SL[EHMER_MAX]={ --900,-900,-900,-900,-900,-900,-900, -10, -26, -20, -14, -8, -2, 4, 10, 17, +-900,-900,-900,-900,-900,-900,-900, -40, -26, -20, -14, -8, -2, 4, 10, 17, 23, 16, 12, 9, 6, 3, 0, -3, -7, -10, -13, -16, -20, -23, -26, -30, -900,-900,-900,-900,-900,-900,-900,-900, -900,-900,-900,-900,-900,-900,-900,-900, -900,-900,-900,-900,-900,-900,-900,-900}; diff --git a/lib/psy.c b/lib/psy.c index 9ab8f371..8a0af7f6 100644 --- a/lib/psy.c +++ b/lib/psy.c @@ -12,7 +12,7 @@ ******************************************************************** function: psychoacoustics not including preecho - last mod: $Id: psy.c,v 1.23.4.4 2000/07/29 13:27:57 xiphmont Exp $ + last mod: $Id: psy.c,v 1.23.4.5 2000/07/31 19:41:00 xiphmont Exp $ ********************************************************************/ @@ -80,7 +80,7 @@ static void attenuate_curve(double *c,double att){ static void linear_curve(double *c){ int i; for(i=0;i=0;i--){ + for(i=P_LEVELS-1;i>0;i--){ for(j=0;jath=malloc(n*sizeof(double)); p->octave=malloc(n*sizeof(int)); @@ -148,104 +184,99 @@ void _vp_psy_init(vorbis_look_psy *p,vorbis_info_psy *vi,int n,long rate){ for(i=0;iath[i]=fromdB(p->ath[i]); for(i=0;ibark[i]=toBARK(rate/(2*n)*i); + p->bark[i]=toBARK(rate/(2*n)*i); for(i=0;i7)oc=7; + if(oc>=P_BANDS)oc=P_BANDS-1; p->octave[i]=oc; } - p->tonecurves=malloc(8*sizeof(double **)); - p->noiseatt=malloc(8*sizeof(double **)); - p->peakatt=malloc(8*sizeof(double *)); - for(i=0;i<8;i++){ - p->tonecurves[i]=malloc(9*sizeof(double *)); - p->noiseatt[i]=malloc(5*sizeof(double)); - p->peakatt[i]=malloc(5*sizeof(double)); + p->tonecurves=malloc(P_BANDS*sizeof(double **)); + p->noiseatt=malloc(P_BANDS*sizeof(double **)); + p->peakatt=malloc(P_BANDS*sizeof(double *)); + for(i=0;itonecurves[i]=malloc(P_LEVELS*sizeof(double *)); + p->noiseatt[i]=malloc(P_LEVELS*sizeof(double)); + p->peakatt[i]=malloc(P_LEVELS*sizeof(double)); } - for(i=0;i<8;i++) - for(j=0;j<9;j++){ + for(i=0;itonecurves[i][j]=malloc(EHMER_MAX*sizeof(double)); } /* OK, yeah, this was a silly way to do it */ - memcpy(p->tonecurves[0][2],tone_125_40dB_SL,sizeof(double)*EHMER_MAX); - memcpy(p->tonecurves[0][4],tone_125_60dB_SL,sizeof(double)*EHMER_MAX); - memcpy(p->tonecurves[0][6],tone_125_80dB_SL,sizeof(double)*EHMER_MAX); - memcpy(p->tonecurves[0][8],tone_125_100dB_SL,sizeof(double)*EHMER_MAX); - - memcpy(p->tonecurves[1][2],tone_125_40dB_SL,sizeof(double)*EHMER_MAX); - memcpy(p->tonecurves[1][4],tone_125_60dB_SL,sizeof(double)*EHMER_MAX); - memcpy(p->tonecurves[1][6],tone_125_80dB_SL,sizeof(double)*EHMER_MAX); - memcpy(p->tonecurves[1][8],tone_125_100dB_SL,sizeof(double)*EHMER_MAX); - - memcpy(p->tonecurves[2][2],tone_250_40dB_SL,sizeof(double)*EHMER_MAX); - memcpy(p->tonecurves[2][4],tone_250_60dB_SL,sizeof(double)*EHMER_MAX); - memcpy(p->tonecurves[2][6],tone_250_80dB_SL,sizeof(double)*EHMER_MAX); - memcpy(p->tonecurves[2][8],tone_250_80dB_SL,sizeof(double)*EHMER_MAX); - - memcpy(p->tonecurves[3][2],tone_500_40dB_SL,sizeof(double)*EHMER_MAX); - memcpy(p->tonecurves[3][4],tone_500_60dB_SL,sizeof(double)*EHMER_MAX); - memcpy(p->tonecurves[3][6],tone_500_80dB_SL,sizeof(double)*EHMER_MAX); - memcpy(p->tonecurves[3][8],tone_500_100dB_SL,sizeof(double)*EHMER_MAX); - - memcpy(p->tonecurves[4][2],tone_1000_40dB_SL,sizeof(double)*EHMER_MAX); - memcpy(p->tonecurves[4][4],tone_1000_60dB_SL,sizeof(double)*EHMER_MAX); - memcpy(p->tonecurves[4][6],tone_1000_80dB_SL,sizeof(double)*EHMER_MAX); - memcpy(p->tonecurves[4][8],tone_1000_100dB_SL,sizeof(double)*EHMER_MAX); - - memcpy(p->tonecurves[5][2],tone_2000_40dB_SL,sizeof(double)*EHMER_MAX); - memcpy(p->tonecurves[5][4],tone_2000_60dB_SL,sizeof(double)*EHMER_MAX); - memcpy(p->tonecurves[5][6],tone_2000_80dB_SL,sizeof(double)*EHMER_MAX); - memcpy(p->tonecurves[5][8],tone_2000_100dB_SL,sizeof(double)*EHMER_MAX); - - memcpy(p->tonecurves[6][2],tone_4000_40dB_SL,sizeof(double)*EHMER_MAX); - memcpy(p->tonecurves[6][4],tone_4000_60dB_SL,sizeof(double)*EHMER_MAX); - memcpy(p->tonecurves[6][6],tone_4000_80dB_SL,sizeof(double)*EHMER_MAX); - memcpy(p->tonecurves[6][8],tone_4000_100dB_SL,sizeof(double)*EHMER_MAX); - - memcpy(p->tonecurves[7][2],tone_8000_40dB_SL,sizeof(double)*EHMER_MAX); - memcpy(p->tonecurves[7][4],tone_8000_60dB_SL,sizeof(double)*EHMER_MAX); - memcpy(p->tonecurves[7][6],tone_8000_80dB_SL,sizeof(double)*EHMER_MAX); - memcpy(p->tonecurves[7][8],tone_8000_100dB_SL,sizeof(double)*EHMER_MAX); - - setup_curve(p->tonecurves[0],0,vi->toneatt_125Hz); - setup_curve(p->tonecurves[1],0,vi->toneatt_125Hz); - setup_curve(p->tonecurves[2],1,vi->toneatt_250Hz); - setup_curve(p->tonecurves[3],2,vi->toneatt_500Hz); - setup_curve(p->tonecurves[4],3,vi->toneatt_1000Hz); - setup_curve(p->tonecurves[5],4,vi->toneatt_2000Hz); - setup_curve(p->tonecurves[6],5,vi->toneatt_4000Hz); - setup_curve(p->tonecurves[7],6,vi->toneatt_8000Hz); - - /*for(i=6;i>0;i--) - for(j=0;j<9;j++){ - min_curve(p->tonecurves[i][j], - p->tonecurves[i-1][j]); - }*/ - - for(i=0;i<5;i++){ - p->peakatt[0][i]=fromdB(p->vi->peakatt_125Hz[i]); - p->peakatt[1][i]=fromdB(p->vi->peakatt_125Hz[i]); - p->peakatt[2][i]=fromdB(p->vi->peakatt_250Hz[i]); - p->peakatt[3][i]=fromdB(p->vi->peakatt_500Hz[i]); - p->peakatt[4][i]=fromdB(p->vi->peakatt_1000Hz[i]); - p->peakatt[5][i]=fromdB(p->vi->peakatt_2000Hz[i]); - p->peakatt[6][i]=fromdB(p->vi->peakatt_4000Hz[i]); - p->peakatt[7][i]=fromdB(p->vi->peakatt_8000Hz[i]); - - p->noiseatt[0][i]=fromdB(p->vi->noiseatt_125Hz[i]); - p->noiseatt[1][i]=fromdB(p->vi->noiseatt_125Hz[i]); - p->noiseatt[2][i]=fromdB(p->vi->noiseatt_250Hz[i]); - p->noiseatt[3][i]=fromdB(p->vi->noiseatt_500Hz[i]); - p->noiseatt[4][i]=fromdB(p->vi->noiseatt_1000Hz[i]); - p->noiseatt[5][i]=fromdB(p->vi->noiseatt_2000Hz[i]); - p->noiseatt[6][i]=fromdB(p->vi->noiseatt_4000Hz[i]); - p->noiseatt[7][i]=fromdB(p->vi->noiseatt_8000Hz[i]); - } + memcpy(p->tonecurves[0][4],tone_125_40dB_SL,sizeof(double)*EHMER_MAX); + memcpy(p->tonecurves[0][6],tone_125_60dB_SL,sizeof(double)*EHMER_MAX); + memcpy(p->tonecurves[0][8],tone_125_80dB_SL,sizeof(double)*EHMER_MAX); + memcpy(p->tonecurves[0][10],tone_125_100dB_SL,sizeof(double)*EHMER_MAX); + + memcpy(p->tonecurves[2][4],tone_125_40dB_SL,sizeof(double)*EHMER_MAX); + memcpy(p->tonecurves[2][6],tone_125_60dB_SL,sizeof(double)*EHMER_MAX); + memcpy(p->tonecurves[2][8],tone_125_80dB_SL,sizeof(double)*EHMER_MAX); + memcpy(p->tonecurves[2][10],tone_125_100dB_SL,sizeof(double)*EHMER_MAX); + + memcpy(p->tonecurves[4][4],tone_250_40dB_SL,sizeof(double)*EHMER_MAX); + memcpy(p->tonecurves[4][6],tone_250_60dB_SL,sizeof(double)*EHMER_MAX); + memcpy(p->tonecurves[4][8],tone_250_80dB_SL,sizeof(double)*EHMER_MAX); + memcpy(p->tonecurves[4][10],tone_250_100dB_SL,sizeof(double)*EHMER_MAX); + + memcpy(p->tonecurves[6][4],tone_500_40dB_SL,sizeof(double)*EHMER_MAX); + memcpy(p->tonecurves[6][6],tone_500_60dB_SL,sizeof(double)*EHMER_MAX); + memcpy(p->tonecurves[6][8],tone_500_80dB_SL,sizeof(double)*EHMER_MAX); + memcpy(p->tonecurves[6][10],tone_500_100dB_SL,sizeof(double)*EHMER_MAX); + + memcpy(p->tonecurves[8][4],tone_1000_40dB_SL,sizeof(double)*EHMER_MAX); + memcpy(p->tonecurves[8][6],tone_1000_60dB_SL,sizeof(double)*EHMER_MAX); + memcpy(p->tonecurves[8][8],tone_1000_80dB_SL,sizeof(double)*EHMER_MAX); + memcpy(p->tonecurves[8][10],tone_1000_100dB_SL,sizeof(double)*EHMER_MAX); + + memcpy(p->tonecurves[10][4],tone_2000_40dB_SL,sizeof(double)*EHMER_MAX); + memcpy(p->tonecurves[10][6],tone_2000_60dB_SL,sizeof(double)*EHMER_MAX); + memcpy(p->tonecurves[10][8],tone_2000_80dB_SL,sizeof(double)*EHMER_MAX); + memcpy(p->tonecurves[10][10],tone_2000_100dB_SL,sizeof(double)*EHMER_MAX); + + memcpy(p->tonecurves[12][4],tone_4000_40dB_SL,sizeof(double)*EHMER_MAX); + memcpy(p->tonecurves[12][6],tone_4000_60dB_SL,sizeof(double)*EHMER_MAX); + memcpy(p->tonecurves[12][8],tone_4000_80dB_SL,sizeof(double)*EHMER_MAX); + memcpy(p->tonecurves[12][10],tone_4000_100dB_SL,sizeof(double)*EHMER_MAX); + + memcpy(p->tonecurves[14][4],tone_8000_40dB_SL,sizeof(double)*EHMER_MAX); + memcpy(p->tonecurves[14][6],tone_8000_60dB_SL,sizeof(double)*EHMER_MAX); + memcpy(p->tonecurves[14][8],tone_8000_80dB_SL,sizeof(double)*EHMER_MAX); + memcpy(p->tonecurves[14][10],tone_8000_100dB_SL,sizeof(double)*EHMER_MAX); + + memcpy(p->tonecurves[16][4],tone_8000_40dB_SL,sizeof(double)*EHMER_MAX); + memcpy(p->tonecurves[16][6],tone_8000_60dB_SL,sizeof(double)*EHMER_MAX); + memcpy(p->tonecurves[16][8],tone_8000_80dB_SL,sizeof(double)*EHMER_MAX); + memcpy(p->tonecurves[16][10],tone_8000_100dB_SL,sizeof(double)*EHMER_MAX); + + /* interpolate curves between */ + for(i=1;itonecurves[i][j],p->tonecurves[i-1][j],EHMER_MAX*sizeof(double)); + /*interp_curve(p->tonecurves[i][j], + p->tonecurves[i-1][j], + p->tonecurves[i+1][j],.5);*/ + } + + for(i=0;itonecurves[i][j],p->tonecurves[i+1][j]); + + /* set up the final curves */ + for(i=0;itonecurves[i],i,vi->toneatt[i]); + + /* set up attenuation levels */ + for(i=0;ipeakatt[i][j]=fromdB(p->vi->peakatt[i][j]); + p->noiseatt[i][j]=fromdB(p->vi->noiseatt[i][j]); + } + } void _vp_psy_clear(vorbis_look_psy *p){ @@ -254,8 +285,8 @@ void _vp_psy_clear(vorbis_look_psy *p){ if(p->ath)free(p->ath); if(p->octave)free(p->octave); if(p->tonecurves){ - for(i=0;i<8;i++){ - for(j=0;j<9;j++){ + for(i=0;itonecurves[i][j]); } free(p->noiseatt[i]); @@ -313,9 +344,9 @@ static int seed_curve(double *flr, double *curve; /* make this attenuation adjustable */ - int choice=(int)((todB(amp)-specmax+specatt)/10.-1.5); + int choice=(int)((todB(amp)-specmax+specatt)/10.+.5); choice=max(choice,0); - choice=min(choice,8); + choice=min(choice,P_LEVELS-1); for(i=maxEH;i>=0;i--) if(((x*_eights[i])>>12)>12; /* make this attenuation adjustable */ - int choice=rint((todB(amp)-specmax+specatt)/20.)-1; + int choice=rint((todB(amp)-specmax+specatt)/10.+.5); if(choice<0)choice=0; - if(choice>4)choice=4; + if(choice>=P_LEVELS)choice=P_LEVELS-1; if(prevxmax_curve_dB)/20.)-1; + int choice=rint((todB(f[i])-specmax+vi->max_curve_dB)/10.+.5); double lin; if(choice<0)choice=0; - if(choice>4)choice=4; + if(choice>=P_LEVELS)choice=P_LEVELS-1; lin=att[p->octave[i]][choice]*f[i]; if(flr[i]