void compute_ath( lame_global_flags *gfp, FLOAT8 ATH_l[], FLOAT8 ATH_s[] ) { lame_internal_flags *gfc = gfp->internal_flags; int sfb, i, start, end; FLOAT8 ATH_f; FLOAT8 samp_freq = gfp->out_samplerate; for (sfb = 0; sfb < SBMAX_l; sfb++) { start = gfc->scalefac_band.l[ sfb ]; end = gfc->scalefac_band.l[ sfb+1 ]; ATH_l[sfb]=FLOAT8_MAX; for (i = start ; i < end; i++) { FLOAT8 freq = i*samp_freq/(2*576); ATH_f = ATHmdct( gfp, freq ); /* freq in kHz */ ATH_l[sfb] = Min( ATH_l[sfb], ATH_f ); } } for (sfb = 0; sfb < SBMAX_s; sfb++){ start = gfc->scalefac_band.s[ sfb ]; end = gfc->scalefac_band.s[ sfb+1 ]; ATH_s[sfb] = FLOAT8_MAX; for (i = start ; i < end; i++) { FLOAT8 freq = i*samp_freq/(2*192); ATH_f = ATHmdct( gfp, freq ); /* freq in kHz */ ATH_s[sfb] = Min( ATH_s[sfb], ATH_f ); } } /* no-ATH mode: * reduce ATH to -200 dB */ if (gfp->noATH) { for (sfb = 0; sfb < SBMAX_l; sfb++) { ATH_l[sfb] = 1E-37; } for (sfb = 0; sfb < SBMAX_s; sfb++) { ATH_s[sfb] = 1E-37; } } /* work in progress, don't rely on it too much */ gfc->ATH-> floor = 10. * log10( ATHmdct( gfp, -1. ) ); /* { FLOAT8 g=10000, t=1e30, x; for ( f = 100; f < 10000; f++ ) { x = ATHmdct( gfp, f ); if ( t > x ) t = x, g = f; } printf("min=%g\n", g); }*/ }
static void compute_ath(lame_internal_flags const* gfc) { SessionConfig_t const *const cfg = &gfc->cfg; FLOAT *const ATH_l = gfc->ATH->l; FLOAT *const ATH_psfb21 = gfc->ATH->psfb21; FLOAT *const ATH_s = gfc->ATH->s; FLOAT *const ATH_psfb12 = gfc->ATH->psfb12; int sfb, i, start, end; FLOAT ATH_f; FLOAT const samp_freq = cfg->samplerate_out; for (sfb = 0; sfb < SBMAX_l; sfb++) { start = gfc->scalefac_band.l[sfb]; end = gfc->scalefac_band.l[sfb + 1]; ATH_l[sfb] = FLOAT_MAX; for (i = start; i < end; i++) { FLOAT const freq = i * samp_freq / (2 * 576); ATH_f = ATHmdct(cfg, freq); /* freq in kHz */ ATH_l[sfb] = Min(ATH_l[sfb], ATH_f); } } for (sfb = 0; sfb < PSFB21; sfb++) { start = gfc->scalefac_band.psfb21[sfb]; end = gfc->scalefac_band.psfb21[sfb + 1]; ATH_psfb21[sfb] = FLOAT_MAX; for (i = start; i < end; i++) { FLOAT const freq = i * samp_freq / (2 * 576); ATH_f = ATHmdct(cfg, freq); /* freq in kHz */ ATH_psfb21[sfb] = Min(ATH_psfb21[sfb], ATH_f); } } for (sfb = 0; sfb < SBMAX_s; sfb++) { start = gfc->scalefac_band.s[sfb]; end = gfc->scalefac_band.s[sfb + 1]; ATH_s[sfb] = FLOAT_MAX; for (i = start; i < end; i++) { FLOAT const freq = i * samp_freq / (2 * 192); ATH_f = ATHmdct(cfg, freq); /* freq in kHz */ ATH_s[sfb] = Min(ATH_s[sfb], ATH_f); } ATH_s[sfb] *= (gfc->scalefac_band.s[sfb + 1] - gfc->scalefac_band.s[sfb]); } for (sfb = 0; sfb < PSFB12; sfb++) { start = gfc->scalefac_band.psfb12[sfb]; end = gfc->scalefac_band.psfb12[sfb + 1]; ATH_psfb12[sfb] = FLOAT_MAX; for (i = start; i < end; i++) { FLOAT const freq = i * samp_freq / (2 * 192); ATH_f = ATHmdct(cfg, freq); /* freq in kHz */ ATH_psfb12[sfb] = Min(ATH_psfb12[sfb], ATH_f); } /*not sure about the following */ ATH_psfb12[sfb] *= (gfc->scalefac_band.s[13] - gfc->scalefac_band.s[12]); } /* no-ATH mode: * reduce ATH to -200 dB */ if (cfg->noATH) { for (sfb = 0; sfb < SBMAX_l; sfb++) { ATH_l[sfb] = 1E-20; } for (sfb = 0; sfb < PSFB21; sfb++) { ATH_psfb21[sfb] = 1E-20; } for (sfb = 0; sfb < SBMAX_s; sfb++) { ATH_s[sfb] = 1E-20; } for (sfb = 0; sfb < PSFB12; sfb++) { ATH_psfb12[sfb] = 1E-20; } } /* work in progress, don't rely on it too much */ gfc->ATH->floor = 10. * log10(ATHmdct(cfg, -1.)); /* { FLOAT g=10000, t=1e30, x; for ( f = 100; f < 10000; f++ ) { x = ATHmdct( cfg, f ); if ( t > x ) t = x, g = f; } printf("min=%g\n", g); } */ }