📄 quantize.c
字号:
huff_bits = targ_bits - cod_info->part2_length;
if (huff_bits < 0) {
assert(iteration != 1);
/* scale factors too large, not enough bits. use previous quantizaton */
notdone=0;
} else {
/* if this is the first iteration, see if we can reuse the quantization
* computed in bin_search_StepSize above */
int real_bits;
if (iteration==1) {
if(bits_found>huff_bits) {
cod_info->global_gain++;
real_bits = inner_loop(gfp,xrpow, l3_enc_w, huff_bits, cod_info);
} else real_bits=bits_found;
}
else
real_bits=inner_loop(gfp,xrpow, l3_enc_w, huff_bits, cod_info);
cod_info->part2_3_length = real_bits;
/* compute the distortion in this quantization */
if (gfp->noise_shaping==0) {
over=0;
}else{
/* coefficients and thresholds both l/r (or both mid/side) */
over=calc_noise1( xr, l3_enc_w, cod_info,
xfsf_w,distort, l3_xmin, &scalefac_w, &over_noise,
&tot_noise, &max_noise);
}
/* check if this quantization is better the our saved quantization */
if (iteration == 1) better=1;
else
better=quant_compare(gfp->experimentalX,
best_over,best_tot_noise,best_over_noise,best_max_noise,
over, tot_noise, over_noise, max_noise);
/* save data so we can restore this quantization later */
if (better) {
best_over=over;
best_max_noise=max_noise;
best_over_noise=over_noise;
best_tot_noise=tot_noise;
memcpy(scalefac, &scalefac_w, sizeof(III_scalefac_t));
memcpy(l3_enc,l3_enc_w,sizeof(int)*576);
memcpy(&save_cod_info,cod_info,sizeof(save_cod_info));
#ifdef HAVEGTK
if (gfp->gtkflag) {
memcpy(xfsf, xfsf_w, sizeof(xfsf_w));
}
#endif
}
}
/* if no bands with distortion, we are done */
if (gfp->noise_shaping_stop==0)
if (over==0) notdone=0;
if (notdone) {
amp_scalefac_bands( xrpow, cod_info, &scalefac_w, distort);
/* check to make sure we have not amplified too much */
/* loop_break returns 0 if there is an unamplified scalefac */
/* scale_bitcount returns 0 if no scalefactors are too large */
if ( (status = loop_break(&scalefac_w, cod_info)) == 0 ) {
if ( gfp->version == 1 ) {
status = scale_bitcount(&scalefac_w, cod_info);
}else{
status = scale_bitcount_lsf(&scalefac_w, cod_info);
}
if (status && (cod_info->scalefac_scale==0)) try_scale=1;
}
notdone = !status;
}
if (try_scale && gfp->experimentalY) {
init_outer_loop(gfp,xr, cod_info);
compute_stepsize=1; /* compute a new global gain */
notdone=1;
cod_info->scalefac_scale=1;
}
} /* done with main iteration */
memcpy(cod_info,&save_cod_info,sizeof(save_cod_info));
cod_info->part2_3_length += cod_info->part2_length;
/* finish up */
assert( cod_info->global_gain < 256 );
best_noise[0]=best_over;
best_noise[1]=best_max_noise;
best_noise[2]=best_over_noise;
best_noise[3]=best_tot_noise;
}
/*************************************************************************/
/* calc_noise */
/*************************************************************************/
/* mt 5/99: Function: Improved calc_noise for a single channel */
int calc_noise1( FLOAT8 xr[576], int ix[576], gr_info *cod_info,
FLOAT8 xfsf[4][SBPSY_l], FLOAT8 distort[4][SBPSY_l],
III_psy_xmin *l3_xmin, III_scalefac_t *scalefac,
FLOAT8 *over_noise,
FLOAT8 *tot_noise, FLOAT8 *max_noise)
{
int start, end, l, i, over=0;
u_int sfb;
FLOAT8 sum,step,bw;
#ifdef RH_ATH
FLOAT8 ath_max;
#endif
int count=0;
FLOAT8 noise;
*over_noise=0;
*tot_noise=0;
*max_noise = -999;
for ( sfb = 0; sfb < cod_info->sfb_lmax; sfb++ ) {
FLOAT8 step;
int s = scalefac->l[sfb];
if (cod_info->preflag)
s += pretab[sfb];
s = cod_info->global_gain - (s << (cod_info->scalefac_scale + 1));
assert(s<Q_MAX);
assert(s>=0);
step = POW20(s);
start = scalefac_band.l[ sfb ];
end = scalefac_band.l[ sfb+1 ];
bw = end - start;
#ifdef RH_ATH
ath_max = 0;
#endif
for ( sum = 0.0, l = start; l < end; l++ )
{
FLOAT8 temp;
temp = fabs(xr[l]) - pow43[ix[l]] * step;
#ifdef MAXNOISE
temp = bw*temp*temp;
sum = Max(sum,temp);
#elif RH_ATH
temp = temp*temp;
sum += temp;
ath_max = Max( ath_max, temp/ATH_mdct_long[l] );
#else
sum += temp * temp;
#endif
}
xfsf[0][sfb] = sum / bw;
/* max -30db noise below threshold */
#ifdef RH_ATH
noise = 10*log10(Max(.001,Min(ath_max,xfsf[0][sfb]/l3_xmin->l[sfb])));
#else
noise = 10*log10(Max(.001,xfsf[0][sfb] / l3_xmin->l[sfb]));
#endif
distort[0][sfb] = noise;
if (noise>0) {
over++;
*over_noise += noise;
}
*tot_noise += noise;
*max_noise=Max(*max_noise,noise);
count++;
}
for ( i = 0; i < 3; i++ ) {
for ( sfb = cod_info->sfb_smax; sfb < SBPSY_s; sfb++ ) {
int s;
s = (scalefac->s[sfb][i] << (cod_info->scalefac_scale + 1))
+ cod_info->subblock_gain[i] * 8;
s = cod_info->global_gain - s;
assert(s<Q_MAX);
assert(s>=0);
step = POW20(s);
start = scalefac_band.s[ sfb ];
end = scalefac_band.s[ sfb+1 ];
bw = end - start;
#ifdef RH_ATH
ath_max = 0;
#endif
for ( sum = 0.0, l = start; l < end; l++ ) {
FLOAT8 temp;
temp = fabs(xr[l * 3 + i]) - pow43[ix[l * 3 + i]] * step;
#ifdef MAXNOISE
temp = bw*temp*temp;
sum = Max(sum,temp);
#elif RH_ATH
temp = temp*temp;
sum += temp;
ath_max = Max( ath_max, temp/ATH_mdct_short[l] );
#else
sum += temp * temp;
#endif
}
xfsf[i+1][sfb] = sum / bw;
/* max -30db noise below threshold */
#ifdef RH_ATH
noise = 10*log10(Max(.001,Min(ath_max,xfsf[i+1][sfb]/l3_xmin->s[sfb][i])));
#else
noise = 10*log10(Max(.001,xfsf[i+1][sfb] / l3_xmin->s[sfb][i] ));
#endif
distort[i+1][sfb] = noise;
if (noise > 0) {
over++;
*over_noise += noise;
}
*tot_noise += noise;
*max_noise=Max(*max_noise,noise);
count++;
}
}
if (count>1) *tot_noise /= count;
if (over>1) *over_noise /= over;
return over;
}
/*************************************************************************/
/* amp_scalefac_bands */
/*************************************************************************/
/*
Amplify the scalefactor bands that violate the masking threshold.
See ISO 11172-3 Section C.1.5.4.3.5
*/
void amp_scalefac_bands(FLOAT8 xrpow[576],
gr_info *cod_info,
III_scalefac_t *scalefac,
FLOAT8 distort[4][SBPSY_l])
{
int start, end, l,i;
u_int sfb;
FLOAT8 ifqstep34;
FLOAT8 distort_thresh;
if ( cod_info->scalefac_scale == 0 )
ifqstep34 = 1.29683955465100964055;
else
ifqstep34 = 1.68179283050742922612;
/* distort_thresh = 0, unless all bands have distortion
* less than masking. In that case, just amplify bands with distortion
* within 95% of largest distortion/masking ratio */
distort_thresh = -900;
for ( sfb = 0; sfb < cod_info->sfb_lmax; sfb++ ) {
distort_thresh = Max(distort[0][sfb],distort_thresh);
}
for ( sfb = cod_info->sfb_smax; sfb < 12; sfb++ ) {
for ( i = 0; i < 3; i++ ) {
distort_thresh = Max(distort[i+1][sfb],distort_thresh);
}
}
distort_thresh=Min(distort_thresh * 1.05, 0.0);
for ( sfb = 0; sfb < cod_info->sfb_lmax; sfb++ ) {
if ( distort[0][sfb]>distort_thresh ) {
scalefac->l[sfb]++;
start = scalefac_band.l[sfb];
end = scalefac_band.l[sfb+1];
for ( l = start; l < end; l++ )
xrpow[l] *= ifqstep34;
}
}
for ( i = 0; i < 3; i++ ) {
for ( sfb = cod_info->sfb_smax; sfb < 12; sfb++ ) {
if ( distort[i+1][sfb]>distort_thresh) {
scalefac->s[sfb][i]++;
start = scalefac_band.s[sfb];
end = scalefac_band.s[sfb+1];
for (l = start; l < end; l++)
xrpow[l * 3 + i] *= ifqstep34;
}
}
}
}
int quant_compare(int experimentalX,
int best_over,FLOAT8 best_tot_noise,FLOAT8 best_over_noise,FLOAT8 best_max_noise,
int over,FLOAT8 tot_noise, FLOAT8 over_noise, FLOAT8 max_noise)
{
/*
noise is given in decibals (db) relative to masking thesholds.
over_noise: sum of quantization noise > masking
tot_noise: sum of all quantization noise
max_noise: max quantization noise
*/
int better=0;
if (experimentalX==0) {
better = ((over < best_over) ||
((over==best_over) && (over_noise<=best_over_noise)) ) ;
}
if (experimentalX==1)
better = max_noise < best_max_noise;
if (experimentalX==2) {
better = tot_noise < best_tot_noise;
}
if (experimentalX==3) {
better = (tot_noise < best_tot_noise) &&
(max_noise < best_max_noise + 2);
}
if (experimentalX==4) {
better = ( ( (0>=max_noise) && (best_max_noise>2)) ||
( (0>=max_noise) && (best_max_noise<0) && ((best_max_noise+2)>max_noise) && (tot_noise<best_tot_noise) ) ||
( (0>=max_noise) && (best_max_noise>0) && ((best_max_noise+2)>max_noise) && (tot_noise<(best_tot_noise+best_over_noise)) ) ||
( (0<max_noise) && (best_max_noise>-0.5) && ((best_max_noise+1)>max_noise) && ((tot_noise+over_noise)<(best_tot_noise+best_over_noise)) ) ||
( (0<max_noise) && (best_max_noise>-1) && ((best_max_noise+1.5)>max_noise) && ((tot_noise+over_noise+over_noise)<(best_tot_noise+best_over_noise+best_over_noise)) ) );
}
if (experimentalX==5) {
better = (over_noise < best_over_noise)
|| ((over_noise == best_over_noise)&&(tot_noise < best_tot_noise));
}
if (experimentalX==6) {
better = (over_noise < best_over_noise)
||( (over_noise == best_over_noise)
&&( (max_noise < best_max_noise)
||( (max_noise == best_max_noise)
&&(tot_noise <= best_tot_noise)
)
)
);
}
return better;
}
int VBR_compare(
int best_over,FLOAT8 best_tot_noise,FLOAT8 best_over_noise,FLOAT8 best_max_noise,
int over,FLOAT8 tot_noise, FLOAT8 over_noise, FLOAT8 max_noise)
{
/*
noise is given in decibals (db) relative to masking thesholds.
over_noise: sum of quantization noise > masking
tot_noise: sum of all quantization noise
max_noise: max quantization noise
*/
int better=0;
better = ((over <= best_over) &&
(over_noise<=best_over_noise) &&
(tot_noise<=best_tot_noise) &&
(max_noise<=best_max_noise));
return better;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -