diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/masking.h | 14 | ||||
| -rw-r--r-- | lib/psy.c | 253 | ||||
| -rw-r--r-- | lib/psytune.c | 100 |
3 files changed, 221 insertions, 146 deletions
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}; @@ -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<EHMER_MAX;i++) - if(c[i]<=-900.) + if(c[i]<=-200.) c[i]=0.; else c[i]=fromdB(c[i]); @@ -93,28 +93,61 @@ static void interp_curve(double *c,double *c1,double *c2,double del){ } static void setup_curve(double **c, - int oc, + int band, double *curveatt_dB){ int i,j; + double ath[EHMER_MAX]; + double tempc[P_LEVELS][EHMER_MAX]; + + memcpy(c[0],c[4],sizeof(double)*EHMER_MAX); + memcpy(c[2],c[4],sizeof(double)*EHMER_MAX); + + /* we add back in the ATH to avoid low level curves falling off to + -infinity and unneccessarily cutting off high level curves in the + curve limiting (last step). But again, remember... a half-band's + settings must be valid over the whole band, and it's better to + mask too little than too much, so be pessimal. */ + + for(i=0;i<EHMER_MAX;i++){ + double oc_min=band*.5-1+(i-EHMER_OFFSET)*.125; + double oc_max=band*.5-1+(i-EHMER_OFFSET+1)*.125; + double bark=toBARK(fromOC(oc_min)); + int ibark=floor(bark); + double del=bark-ibark; + double ath_min,ath_max; + + if(ibark<26) + ath_min=ATH_Bark_dB[ibark]*(1.-del)+ATH_Bark_dB[ibark+1]*del; + else + ath_min=200.; - memcpy(c[0],c[2],sizeof(double)*EHMER_MAX); + bark=toBARK(fromOC(oc_max)); + ibark=floor(bark); + del=bark-ibark; + if(ibark<26) + ath_max=ATH_Bark_dB[ibark]*(1.-del)+ATH_Bark_dB[ibark+1]*del; + else + ath_max=200.; - /* normalize them so the driving amplitude is 0dB */ - for(i=0;i<5;i++){ - attenuate_curve(c[i*2],curveatt_dB[i]); + ath[i]=min(ath_min,ath_max); } /* The c array is comes in as dB curves at 20 40 60 80 100 dB. interpolate intermediate dB curves */ - for(i=0;i<7;i+=2){ - interp_curve(c[i+1],c[i],c[i+2],.5); + for(i=1;i<P_LEVELS;i+=2){ + interp_curve(c[i],c[i-1],c[i+1],.5); + } + + /* normalize curves so the driving amplitude is 0dB */ + /* make temp curves with the ATH overlayed */ + for(i=0;i<P_LEVELS;i++){ + attenuate_curve(c[i],curveatt_dB[i]); + memcpy(tempc[i],ath,EHMER_MAX*sizeof(double)); + attenuate_curve(tempc[i],-i*10.); + max_curve(tempc[i],c[i]); } - /* take things out of dB domain into linear amplitude */ - for(i=0;i<9;i++) - linear_curve(c[i]); - /* Now limit the louder curves. the idea is this: We don't know what the playback attenuation @@ -125,16 +158,19 @@ static void setup_curve(double **c, 20dB down will be in a range ...+80], 40dB down is from ...+60], etc... */ - for(i=8;i>=0;i--){ + for(i=P_LEVELS-1;i>0;i--){ for(j=0;j<i;j++) - min_curve(c[i],c[j]); + min_curve(c[i],tempc[j]); } -} + /* take things out of dB domain into linear amplitude */ + for(i=0;i<P_LEVELS;i++) + linear_curve(c[i]); + +} void _vp_psy_init(vorbis_look_psy *p,vorbis_info_psy *vi,int n,long rate){ long i,j; - double rate2=rate/2.; memset(p,0,sizeof(vorbis_look_psy)); p->ath=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;i<n;i++) p->ath[i]=fromdB(p->ath[i]); for(i=0;i<n;i++) - p->bark[i]=toBARK(rate/(2*n)*i); + p->bark[i]=toBARK(rate/(2*n)*i); for(i=0;i<n;i++){ - int oc=toOC((i+.5)*rate2/n)+1; + int oc=toOC((i+.5)*rate/(2*n))*2.+2; /* half octaves, actually */ if(oc<0)oc=0; - if(oc>7)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;i<P_BANDS;i++){ + p->tonecurves[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;i<P_BANDS;i++) + for(j=0;j<P_LEVELS;j++){ p->tonecurves[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;i<P_BANDS;i+=2) + for(j=4;j<P_LEVELS;j+=2){ + memcpy(p->tonecurves[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;i<P_BANDS-1;i++) + for(j=4;j<P_LEVELS;j+=2) + min_curve(p->tonecurves[i][j],p->tonecurves[i+1][j]); + + /* set up the final curves */ + for(i=0;i<P_BANDS;i++) + setup_curve(p->tonecurves[i],i,vi->toneatt[i]); + + /* set up attenuation levels */ + for(i=0;i<P_BANDS;i++) + for(j=0;j<P_LEVELS;j++){ + p->peakatt[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;i<P_BANDS;i++){ + for(j=0;j<P_LEVELS;j++){ free(p->tonecurves[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)<n)break; @@ -343,9 +374,9 @@ static void seed_peak(double *flr, int prevx=(x*_eights[16])>>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(prevx<n){ double lin=att[choice]; @@ -398,10 +429,10 @@ static void seed_point(vorbis_look_psy *p, for(i=0;i<n;i++){ /* make this attenuation adjustable */ - int choice=rint((todB(f[i])-specmax+vi->max_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]<lin)flr[i]=lin; } diff --git a/lib/psytune.c b/lib/psytune.c index 42af6433..2b5120bb 100644 --- a/lib/psytune.c +++ b/lib/psytune.c @@ -13,7 +13,7 @@ function: simple utility that runs audio through the psychoacoustics without encoding - last mod: $Id: psytune.c,v 1.4.4.1 2000/07/29 13:27:58 xiphmont Exp $ + last mod: $Id: psytune.c,v 1.4.4.2 2000/07/31 19:41:00 xiphmont Exp $ ********************************************************************/ @@ -31,7 +31,7 @@ #include "lpc.h" static vorbis_info_psy _psy_set0={ - 0,/*athp*/ + 1,/*athp*/ 1,/*decayp*/ 1,/*smoothp*/ 1,.2, @@ -39,39 +39,79 @@ static vorbis_info_psy _psy_set0={ -100., -140., + /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 */ + /* x: 63 88 125 175 250 350 500 700 1k 1.4k 2k 2.8k 4k 5.6k 8k 11.5k 16k Hz */ + /* y: 0 10 20 30 40 50 60 70 80 90 100 dB */ + 1,/* tonemaskp */ - {-40.,-40.,-60.,-80.,-100.}, /* remember that el 0,2 is a 80 dB curve */ - {-40.,-40.,-60.,-80.,-100.}, /* remember that el 4 is an 80 dB curve, not 100 */ - {-40.,-40.,-60.,-80.,-100.}, - {-40.,-40.,-60.,-80.,-100.}, - {-40.,-40.,-60.,-80.,-100.}, - {-45.,-45.,-65.,-85.,-105.}, - {-45.,-45.,-65.,-85.,-105.}, - - 1,/* peakattp */ - {-18.,-20.,-22.,-22.,-22.}, - {-18.,-20.,-22.,-22.,-22.}, - {-18.,-20.,-18.,-20.,-22.}, - {-16.,-18.,-18.,-20.,-22.}, - {-16.,-18.,-18.,-20.,-22.}, - {-16.,-18.,-18.,-20.,-22.}, - {-12.,-14.,-16.,-18.,-22.}, + /* 0 10 20 30 40 50 60 70 80 90 100 */ + {{-40.,-40.,-40.,-40.,-40.,-50.,-60.,-70.,-80.,-90.,-100.}, /*63*/ + {-40.,-40.,-40.,-40.,-40.,-50.,-60.,-70.,-80.,-90.,-100.}, /*88*/ + {-40.,-40.,-40.,-40.,-40.,-50.,-60.,-70.,-80.,-90.,-100.}, /*125*/ + {-40.,-40.,-40.,-40.,-40.,-50.,-60.,-70.,-80.,-90.,-100.}, /*175*/ + {-40.,-40.,-40.,-40.,-40.,-50.,-60.,-70.,-80.,-90.,-100.}, /*250*/ + {-40.,-40.,-40.,-40.,-40.,-50.,-60.,-70.,-80.,-90.,-100.}, /*350*/ + {-40.,-40.,-40.,-40.,-40.,-50.,-60.,-70.,-80.,-90.,-100.}, /*500*/ + {-40.,-40.,-40.,-40.,-40.,-50.,-60.,-70.,-80.,-90.,-100.}, /*700*/ + {-40.,-40.,-40.,-40.,-40.,-50.,-60.,-70.,-80.,-90.,-100.}, /*1000*/ + {-40.,-40.,-40.,-40.,-40.,-50.,-60.,-70.,-80.,-90.,-100.}, /*1400*/ + {-40.,-40.,-40.,-40.,-40.,-50.,-60.,-70.,-80.,-90.,-100.}, /*2000*/ + {-40.,-40.,-40.,-40.,-40.,-50.,-60.,-70.,-80.,-90.,-100.}, /*2800*/ + {-40.,-40.,-40.,-40.,-40.,-50.,-60.,-70.,-80.,-90.,-100.}, /*4000*/ + {-40.,-40.,-40.,-40.,-40.,-50.,-60.,-70.,-80.,-90.,-100.}, /*5600*/ + {-40.,-40.,-40.,-40.,-40.,-50.,-60.,-70.,-80.,-90.,-100.}, /*8000*/ + {-40.,-40.,-40.,-40.,-40.,-50.,-60.,-70.,-80.,-90.,-100.}, /*11500*/ + {-40.,-40.,-40.,-40.,-40.,-50.,-60.,-70.,-80.,-90.,-100.}, /*16000*/ + }, + + 0,/* peakattp */ + /* 0 10 20 30 40 50 60 70 80 90 100 */ + {{-14.,-16.,-18.,-19.,-20.,-21.,-22.,-22.,-22.,-22.,-22.}, /*63*/ + {-14.,-16.,-18.,-19.,-20.,-21.,-22.,-22.,-22.,-22.,-22.}, /*88*/ + {-14.,-16.,-18.,-19.,-20.,-21.,-22.,-22.,-22.,-22.,-22.}, /*125*/ + {-14.,-16.,-18.,-19.,-20.,-21.,-22.,-22.,-22.,-22.,-22.}, /*175*/ + {-14.,-16.,-18.,-19.,-20.,-21.,-22.,-22.,-22.,-22.,-22.}, /*250*/ + {-14.,-16.,-18.,-19.,-20.,-20.,-20.,-21.,-22.,-22.,-22.}, /*350*/ + {-14.,-16.,-18.,-18.,-18.,-19.,-20.,-20.,-20.,-22.,-22.}, /*500*/ + {-14.,-16.,-18.,-18.,-18.,-18.,-18.,-19.,-20.,-22.,-22.}, /*700*/ + {-14.,-16.,-16.,-17.,-18.,-18.,-18.,-19.,-20.,-22.,-22.}, /*1000*/ + {-14.,-16.,-16.,-17.,-18.,-18.,-18.,-19.,-20.,-22.,-22.}, /*1400*/ + {-14.,-15.,-18.,-18.,-18.,-18.,-18.,-19.,-20.,-22.,-22.}, /*2000*/ + {-14.,-14.,-18.,-18.,-18.,-18.,-18.,-19.,-20.,-22.,-22.}, /*2800*/ + {-12.,-13.,-16.,-17.,-17.,-17.,-18.,-19.,-20.,-22.,-22.}, /*4000*/ + {-10.,-12.,-14.,-15.,-16.,-16.,-17.,-18.,-20.,-22.,-22.}, /*5600*/ + { -8.,-11.,-12.,-13.,-14.,-15.,-16.,-17.,-18.,-22.,-22.}, /*8000*/ + { -8.,-10.,-12.,-13.,-14.,-15.,-16.,-16.,-16.,-22.,-22.}, /*11500*/ + { -8.,-10.,-12.,-13.,-14.,-15.,-16.,-16.,-16.,-22.,-22.}, /*16000*/ + }, 0,/*noisemaskp */ - {-100.,-100.,-100.,-200.,-200.}, - {-100.,-100.,-100.,-200.,-200.}, - {-100.,-100.,-100.,-200.,-200.}, - {-6.,-6.,-6.,-6.,-6.}, - {-0.,-0.,-0.,-0.,-0.}, - {-0.,-0.,-0.,-2.,-2.}, - { 2., 2., 2., 2., 2.}, + /* 0 10 20 30 40 50 60 70 80 90 100 */ + {{-99.,-99.,-99.,-99.,-99.,-99.,-99.,-199.,-199.,-199.,-199.}, /*63*/ + {-99.,-99.,-99.,-99.,-99.,-99.,-99.,-199.,-199.,-199.,-199.}, /*88*/ + {-99.,-99.,-99.,-99.,-99.,-99.,-99.,-199.,-199.,-199.,-199.}, /*125*/ + {-99.,-99.,-99.,-99.,-99.,-99.,-99.,-199.,-199.,-199.,-199.}, /*175*/ + {-99.,-99.,-99.,-99.,-99.,-99.,-99.,-199.,-199.,-199.,-199.}, /*250*/ + {-99.,-99.,-99.,-99.,-99.,-99.,-99.,-199.,-199.,-199.,-199.}, /*350*/ + {-99.,-99.,-99.,-99.,-99.,-99.,-99.,-199.,-199.,-199.,-199.}, /*500*/ + {-99.,-99.,-99.,-99.,-99.,-99.,-99.,-199.,-199.,-199.,-199.}, /*700*/ + {-99.,-99.,-99.,-99.,-99.,-99.,-99.,-199.,-199.,-199.,-199.}, /*100*/ + {-99.,-99.,-99.,-99.,-99.,-99.,-99.,-199.,-199.,-199.,-199.}, /*1400/ + { -0., -0., -0., -0., -0., -0., -0., -0., -0., -0., -0.}, /*2000*/ + { -0., -0., -0., -0., -0., -0., -0., -0., -0., -0., -0.}, /*2800*/ + { -0., -0., -0., -0., -0., -0., -0., -0., -0., -0., -0.}, /*4000*/ + { -0., -0., -0., -0., -0., -0., -0., -0., -0., -0., -0.}, /*5600*/ + { -0., -0., -0., -0., -0., -0., -0., -0., -0., -0., -0.}, /*8000*/ + { -0., -0., -0., -0., -0., -0., -0., -0., -0., -0., -0.}, /*11500*/ + { -0., -0., -0., -0., -0., -0., -0., -0., -0., -0., -0.}, /*16000*/ + }, 110., - .9998, .9997, /* attack/decay control */ + .9998, .9998, /* attack/decay control */ }; -static int noisy=0; +static int noisy=1; void analysis(char *base,int i,double *v,int n,int bark,int dB){ if(noisy){ int j; @@ -210,9 +250,9 @@ int main(int argc,char *argv[]){ _vp_psy_init(&p_look,&_psy_set0,framesize/2,44100); floorinit(&floorlook,framesize/2,order,map); - for(i=0;i<7;i++) - for(j=0;j<9;j++) - analysis("Ptonecurve",i*10+j,p_look.tonecurves[i][j],EHMER_MAX,0,1); + for(i=0;i<P_BANDS;i++) + for(j=0;j<P_LEVELS;j++) + analysis("Ptonecurve",i*100+j,p_look.tonecurves[i][j],EHMER_MAX,0,1); /* we cheat on the WAV header; we just bypass 44 bytes and never verify that it matches 16bit/stereo/44.1kHz. */ |
