📄 psymodel.c
字号:
mld = mld_s[sb]*en[chmid].s[sb][sblock];
rside = Max(thm[chside].s[sb][sblock],Min(thm[chmid].s[sb][sblock],mld));
thm[chmid].s[sb][sblock]=rmid;
thm[chside].s[sb][sblock]=rside;
}
}
}
}
if (gfp->mode == MPG_MD_JOINT_STEREO) {
/* determin ms_ratio from masking thresholds*/
/* use ms_stereo (ms_ratio < .35) if average thresh. diff < 5 db */
FLOAT8 db,x1,x2,sidetot=0,tot=0;
for (sb= SBPSY_l/4 ; sb< SBPSY_l; sb ++ ) {
x1 = Min(thm[0].l[sb],thm[1].l[sb]);
x2 = Max(thm[0].l[sb],thm[1].l[sb]);
/* thresholds difference in db */
if (x2 >= 1000*x1) db=3;
else db = log10(x2/x1);
/* printf("db = %f %e %e \n",db,thm[0].l[sb],thm[1].l[sb]);*/
sidetot += db;
tot++;
}
ms_ratio_l= (sidetot/tot)*0.7; /* was .35*(sidetot/tot)/5.0*10 */
ms_ratio_l = Min(ms_ratio_l,0.5);
sidetot=0; tot=0;
for ( sblock = 0; sblock < 3; sblock++ )
for ( sb = SBPSY_s/4; sb < SBPSY_s; sb++ ) {
x1 = Min(thm[0].s[sb][sblock],thm[1].s[sb][sblock]);
x2 = Max(thm[0].s[sb][sblock],thm[1].s[sb][sblock]);
/* thresholds difference in db */
if (x2 >= 1000*x1) db=3;
else db = log10(x2/x1);
sidetot += db;
tot++;
}
ms_ratio_s = (sidetot/tot)*0.7; /* was .35*(sidetot/tot)/5.0*10 */
ms_ratio_s = Min(ms_ratio_s,.5);
}
/***************************************************************
* determin final block type
***************************************************************/
for (chn=0; chn<gfp->stereo; chn++) {
blocktype[chn] = NORM_TYPE;
}
if (gfp->stereo==2) {
if (!gfp->allow_diff_short || gfp->mode==MPG_MD_JOINT_STEREO) {
/* force both channels to use the same block type */
/* this is necessary if the frame is to be encoded in ms_stereo. */
/* But even without ms_stereo, FhG does this */
int bothlong= (uselongblock[0] && uselongblock[1]);
if (!bothlong) {
uselongblock[0]=0;
uselongblock[1]=0;
}
}
}
/* update the blocktype of the previous granule, since it depends on what
* happend in this granule */
for (chn=0; chn<gfp->stereo; chn++) {
if ( uselongblock[chn])
{ /* no attack : use long blocks */
switch( blocktype_old[chn] )
{
case NORM_TYPE:
case STOP_TYPE:
blocktype[chn] = NORM_TYPE;
break;
case SHORT_TYPE:
blocktype[chn] = STOP_TYPE;
break;
case START_TYPE:
fprintf( stderr, "Error in block selecting\n" );
abort();
break; /* problem */
}
} else {
/* attack : use short blocks */
blocktype[chn] = SHORT_TYPE;
if ( blocktype_old[chn] == NORM_TYPE ) {
blocktype_old[chn] = START_TYPE;
}
if ( blocktype_old[chn] == STOP_TYPE ) {
blocktype_old[chn] = SHORT_TYPE ;
}
}
blocktype_d[chn] = blocktype_old[chn]; /* value returned to calling program */
blocktype_old[chn] = blocktype[chn]; /* save for next call to l3psy_anal */
}
if (blocktype_d[0]==2)
*ms_ratio = ms_ratio_s_old;
else
*ms_ratio = ms_ratio_l_old;
ms_ratio_s_old = ms_ratio_s;
ms_ratio_l_old = ms_ratio_l;
/* we dont know the block type of this frame yet - assume long */
*ms_ratio_next = ms_ratio_l;
/*********************************************************************/
/* compute side_energy / (side+mid)_energy */
/* 0 = no energy in side channel */
/* .5 = half of total energy in side channel */
/*********************************************************************/
if (numchn==4) {
FLOAT tmp = tot_ener[3]+tot_ener[2];
*ms_ener_ratio = ms_ener_ratio_old;
ms_ener_ratio_old=0;
if (tmp>0) ms_ener_ratio_old=tot_ener[3]/tmp;
} else
/* we didn't compute ms_ener_ratios */
*ms_ener_ratio = 0;
}
extern FLOAT8 psy_data[];
void L3para_read(FLOAT8 sfreq, int *numlines_l,int *numlines_s, int *partition_l, FLOAT8 *minval,
FLOAT8 *qthr_l, FLOAT8 s3_l[64][64], FLOAT8 s3_s[CBANDS + 1][CBANDS + 1],
FLOAT8 *qthr_s, FLOAT8 *SNR,
int *bu_l, int *bo_l, FLOAT8 *w1_l, FLOAT8 *w2_l,
int *bu_s, int *bo_s, FLOAT8 *w1_s, FLOAT8 *w2_s)
{
FLOAT8 freq_tp;
FLOAT8 bval_l[CBANDS], bval_s[CBANDS];
int cbmax=0, cbmax_tp;
FLOAT8 *p = psy_data;
int sbmax ;
int i,j,k,k2,loop, part_max ;
int freq_scale=1;
/* use MPEG1 tables. The MPEG2 tables in tables.c appear to be
* junk. MPEG2 doc claims data for these tables is the same as the
* MPEG1 data for 2x sampling frequency */
/* if (sfreq<32000) freq_scale=2; */
/* Read long block data */
for(loop=0;loop<6;loop++)
{
freq_tp = *p++;
cbmax_tp = (int) *p++;
cbmax_tp++;
if (sfreq == freq_tp/freq_scale )
{
cbmax = cbmax_tp;
for(i=0,k2=0;i<cbmax_tp;i++)
{
j = (int) *p++;
numlines_l[i] = (int) *p++;
minval[i] = exp(-((*p++) - NMT) * LN_TO_LOG10);
qthr_l[i] = *p++;
/* norm_l[i] = *p++*/ p++;
bval_l[i] = *p++;
if (j!=i)
{
fprintf(stderr,"1. please check \"psy_data\"");
exit(-1);
}
for(k=0;k<numlines_l[i];k++)
partition_l[k2++] = i ;
}
}
else
p += cbmax_tp * 6;
}
#define NEWBARKXXX
#ifdef NEWBARK
/* compute bark values of each critical band */
j = 0;
for(i=0;i<cbmax;i++)
{
FLOAT8 ji, freq, bark;
ji = j + (numlines_l[i]-1)/2.0;
freq = sfreq*ji/1024000.0;
bark = 13*atan(.76*freq) + 3.5*atan(freq*freq/(7.5*7.5));
printf("%i %i bval_l table=%f f=%f formaula=%f \n",i,j,bval_l[i],freq,bark);
bval_l[i]=bark;
j += numlines_l[i];
}
#endif
/************************************************************************
* Now compute the spreading function, s[j][i], the value of the spread-*
* ing function, centered at band j, for band i, store for later use *
************************************************************************/
/* i.e.: sum over j to spread into signal barkval=i
NOTE: i and j are used opposite as in the ISO docs */
part_max = cbmax ;
for(i=0;i<part_max;i++)
{
FLOAT8 tempx,x,tempy,temp;
for(j=0;j<part_max;j++)
{
/*tempx = (bval_l[i] - bval_l[j])*1.05;*/
if (j>=i) tempx = (bval_l[i] - bval_l[j])*3.0;
else tempx = (bval_l[i] - bval_l[j])*1.5;
#ifdef AACS3
if (i>=j) tempx = (bval_l[i] - bval_l[j])*3.0;
else tempx = (bval_l[i] - bval_l[j])*1.5;
#endif
if(tempx>=0.5 && tempx<=2.5)
{
temp = tempx - 0.5;
x = 8.0 * (temp*temp - 2.0 * temp);
}
else x = 0.0;
tempx += 0.474;
tempy = 15.811389 + 7.5*tempx - 17.5*sqrt(1.0+tempx*tempx);
#ifdef NEWS3
if (j>=i) tempy = (bval_l[j] - bval_l[i])*(-15);
else tempy = (bval_l[j] - bval_l[i])*25;
x=0;
#endif
/*
if ((i==part_max/2) && (fabs(bval_l[j] - bval_l[i])) < 3) {
printf("bark=%f x+tempy = %f \n",bval_l[j] - bval_l[i],x+tempy);
}
*/
if (tempy <= -60.0) s3_l[i][j] = 0.0;
else s3_l[i][j] = exp( (x + tempy)*LN_TO_LOG10 );
}
}
/* Read short block data */
for(loop=0;loop<6;loop++)
{
freq_tp = *p++;
cbmax_tp = (int) *p++;
cbmax_tp++;
if (sfreq == freq_tp/freq_scale )
{
cbmax = cbmax_tp;
for(i=0,k2=0;i<cbmax_tp;i++)
{
j = (int) *p++;
numlines_s[i] = (int) *p++;
qthr_s[i] = *p++;
/* norm_s[i] =*p++ */ p++;
SNR[i] = *p++;
bval_s[i] = *p++;
if (j!=i)
{
fprintf(stderr,"3. please check \"psy_data\"");
exit(-1);
}
numlines_s[i]--;
}
numlines_s[i] = -1;
}
else
p += cbmax_tp * 6;
}
#ifdef NEWBARK
/* compute bark values of each critical band */
j = 0;
for(i=0;i<cbmax;i++)
{
FLOAT8 ji, freq, bark;
ji = (j * 2 + numlines_s[i]) / 2.0;
freq = sfreq*ji/256000.0;
bark = 13*atan(.76*freq) + 3.5*atan(freq*freq/(7.5*7.5));
printf("%i %i bval_s = %f %f %f \n",i,j,bval_s[i],freq,bark);
bval_s[i]=bark;
j += numlines_s[i] + 1;
}
#endif
/************************************************************************
* Now compute the spreading function, s[j][i], the value of the spread-*
* ing function, centered at band j, for band i, store for later use *
************************************************************************/
part_max = cbmax ;
for(i=0;i<part_max;i++)
{
FLOAT8 tempx,x,tempy,temp;
for(j=0;j<part_max;j++)
{
/* tempx = (bval_s[i] - bval_s[j])*1.05;*/
if (j>=i) tempx = (bval_s[i] - bval_s[j])*3.0;
else tempx = (bval_s[i] - bval_s[j])*1.5;
#ifdef AACS3
if (i>=j) tempx = (bval_s[i] - bval_s[j])*3.0;
else tempx = (bval_s[i] - bval_s[j])*1.5;
#endif
if(tempx>=0.5 && tempx<=2.5)
{
temp = tempx - 0.5;
x = 8.0 * (temp*temp - 2.0 * temp);
}
else x = 0.0;
tempx += 0.474;
tempy = 15.811389 + 7.5*tempx - 17.5*sqrt(1.0+tempx*tempx);
#ifdef NEWS3
if (j>=i) tempy = (bval_s[j] - bval_s[i])*(-15);
else tempy = (bval_s[j] - bval_s[i])*25;
x=0;
#endif
if (tempy <= -60.0) s3_s[i][j] = 0.0;
else s3_s[i][j] = exp( (x + tempy)*LN_TO_LOG10 );
}
}
/* Read long block data for converting threshold calculation
partitions to scale factor bands */
for(loop=0;loop<6;loop++)
{
freq_tp = *p++;
sbmax = (int) *p++;
sbmax++;
if (sfreq == freq_tp/freq_scale)
{
for(i=0;i<sbmax;i++)
{
j = (int) *p++;
p++;
bu_l[i] = (int) *p++;
bo_l[i] = (int) *p++;
w1_l[i] = (FLOAT8) *p++;
w2_l[i] = (FLOAT8) *p++;
if (j!=i)
{ fprintf(stderr,"30:please check \"psy_data\"\n");
exit(-1);
}
if (i!=0)
if ( (fabs(1.0-w1_l[i]-w2_l[i-1]) > 0.01 ) )
{
fprintf(stderr,"31l: please check \"psy_data.\"\n");
fprintf(stderr,"w1,w2: %f %f \n",w1_l[i],w2_l[i-1]);
exit(-1);
}
}
}
else
p += sbmax * 6;
}
/* Read short block data for converting threshold calculation
partitions to scale factor bands */
for(loop=0;loop<6;loop++)
{
freq_tp = *p++;
sbmax = (int) *p++;
sbmax++;
if (sfreq == freq_tp/freq_scale)
{
for(i=0;i<sbmax;i++)
{
j = (int) *p++;
p++;
bu_s[i] = (int) *p++;
bo_s[i] = (int) *p++;
w1_s[i] = *p++;
w2_s[i] = *p++;
if (j!=i)
{ fprintf(stderr,"30:please check \"psy_data\"\n");
exit(-1);
}
if (i!=0)
if ( (fabs(1.0-w1_s[i]-w2_s[i-1]) > 0.01 ) )
{
fprintf(stderr,"31s: please check \"psy_data.\"\n");
fprintf(stderr,"w1,w2: %f %f \n",w1_s[i],w2_s[i-1]);
exit(-1);
}
}
}
else
p += sbmax * 6;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -