⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 l3psy.c

📁 ISO mp3 sources (distribution 10) Layer 1/2/3, C Source, 512 k Sources of the Mpeg 1,2 layer 1,2
💻 C
📖 第 1 页 / 共 3 页
字号:
           ecb[j] = 0;           cb[j] = 0;           for(k=0;k<CBANDS;k++){              if(s[j][k] != 0.0){                 ecb[j] += s[j][k]*grouped_e[k];                 cb[j] += s[j][k]*grouped_c[k];              }           }           if(ecb[j] !=0)cb[j] = cb[j]/ecb[j];           else cb[j] = 0;        }/***************************************************************************** * Calculate the required SNR for each of the frequency partitions           * *         this whole section can be accomplished by a table lookup          * *****************************************************************************/        for(j=0;j<CBANDS;j++){           if(cb[j]<.05)cb[j]=0.05;           else if(cb[j]>.5)cb[j]=0.5;/*         tb = -0.434294482*log((double) cb[j])-0.301029996; */           tb = -0.43 *log((double) cb[j]) - 0.29 ;           if(tb<0.0) tb=0.0; else if(tb>1.0) tb=1.0;           bc[j] = tmn[j]*tb + nmt*(1.0-tb);           k = cbval[j] + 0.5;           bc[j] = (bc[j] > bmax[k]) ? bc[j] : bmax[k];           bc[j] = exp((double) -bc[j]*LN_TO_LOG10);        }/***************************************************************************** * Calculate the permissible noise energy level in each of the frequency     * * partitions. Include absolute threshold and pre-echo controls              * *         this whole section can be accomplished by a table lookup          * *****************************************************************************/        for(j=0;j<CBANDS;j++)           if(rnorm[j] && numlines[j])              nb[j] = ecb[j]*bc[j]/(rnorm[j]*numlines[j]);           else nb[j] = 0;        for(j=0;j<HBLKSIZE;j++){           temp1=nb[partition[j]];		 /* preliminary threshold */           temp1=(temp1>absthr[j])?temp1:absthr[j];/*do not use pre-echo control for layer 2 because it may do bad things to the*//*  MUSICAM bit allocation algorithm                                         */           if(lay==1){              fthr[j] = (temp1 < lthr[chn][j]) ? temp1 : lthr[chn][j];              temp2 = temp1 * 0.00316;              fthr[j] = (temp2 > fthr[j]) ? temp2 : fthr[j];           }           else fthr[j] = temp1;           lthr[chn][j] = LXMIN*temp1;        }/***************************************************************************** * Translate the 512 threshold values to the 32 filter bands of the coder    * *****************************************************************************/        for(j=0;j<193;j += 16){           min_thres = fthr[j];           sum_energy = energy[j];           for(k=1;k<17;k++){              if(min_thres>fthr[j+k]) min_thres = fthr[j+k];              sum_energy += energy[j+k];           }           snrtmp[i][j/16] = sum_energy/(min_thres * 17.0);           snrtmp[i][j/16] = 4.342944819 * log((double)snrtmp[i][j/16]);        }        for(j=208;j<(HBLKSIZE-1);j += 16){           min_thres = 0.0;           sum_energy = 0.0;           for(k=0;k<17;k++){              min_thres += fthr[j+k];              sum_energy += energy[j+k];           }           snrtmp[i][j/16] = sum_energy/min_thres;           snrtmp[i][j/16] = 4.342944819 * log((double)snrtmp[i][j/16]);        }/***************************************************************************** * End of Psychoacuostic calculation loop                                    * *****************************************************************************/     }     for(i=0; i<32; i++){        if(lay==2)		/* if(lay==2 && chn==2) MI */           snr32[i]=(snrtmp[0][i]>snrtmp[1][i])?snrtmp[0][i]:snrtmp[1][i];        else snr32[i]=snrtmp[0][i];     }     break;/*************************************************************************//**       LAYER 3                                                        *//*************************************************************************/   case 3:	if ( init_L3 == 0 )	{	    L3para_read( sfreq,numlines,partition_l,minval,qthr_l,norm_l,s3_l,			 partition_s,qthr_s,norm_s,SNR_s,			 cbw_l,bu_l,bo_l,w1_l,w2_l, cbw_s,bu_s,bo_s,w1_s,w2_s );	    init_L3 ++ ;	}		for ( j = 0; j < 21; j++ )	    ratio_d[j] = ratio[chn][j];	for ( j = 0; j < 12; j++ )	    for ( i = 0; i < 3; i++ )		ratio_ds[j][i] = ratio_s[chn][j][i];		if ( chn == 0 )	    if ( new == 0 )	    {		new = 1;		old = 0;		oldest = 1;	    }	    else	    {		new = 0;		old = 1;		oldest = 0;	    }/***********************************************************************  Delay signal by sync_flush=768 samples                             ***********************************************************************/		for ( j = 0; j < sync_flush; j++ ) /* for long window samples */	    savebuf[j] = savebuf[j+flush];		for ( j = sync_flush; j < syncsize; j++ )	    savebuf[j] = *buffer++;		for ( j = 0; j < BLKSIZE; j++ )	{ /**window data with HANN window**/	    wsamp_r[j] = window[j] * savebuf[j];  	    wsamp_i[j] = 0.0;	}/***********************************************************************    compute unpredicatability of first six spectral lines            * **********************************************************************/	fft( wsamp_r, wsamp_i, energy, phi, 1024 );		/**long FFT**/	for ( j = 0; j < 6; j++ )	{	 /* calculate unpredictability measure cw */	    r_prime = 2.0 * r[chn][old][j] - r[chn][oldest][j];	    phi_prime = 2.0 * phi_sav[chn][old][j]-phi_sav[chn][oldest][j];	    r[chn][new][j] = sqrt((double) energy[j]);	    phi_sav[chn][new][j] = phi[j];	    temp1 = r[chn][new][j] * cos((double) phi[j])		- r_prime * cos(phi_prime);	    temp2 = r[chn][new][j] * sin((double) phi[j])		- r_prime * sin(phi_prime);	    temp3=r[chn][new][j] + fabs(r_prime);	    	    if ( temp3 != 0.0 )		cw[j] = sqrt( temp1*temp1+temp2*temp2 ) / temp3;	    else		cw[j] = 0;	}/***********************************************************************     compute unpredicatibility of next 200 spectral lines            ***********************************************************************/ 	for ( sblock = 0; sblock < 3; sblock++ )	{ /**window data with HANN window**/	    for ( j = 0, k = 128 * (2 + sblock); j < 256; j++, k++ )	    {		wsamp_r[j] = window_s[j]* savebuf[k]; 		wsamp_i[j] = 0.0;	    }							/* short FFT*/	    	    fft( wsamp_r, wsamp_i, &energy_s[sblock][0], &phi_s[sblock][0], 256 );        }         sblock = 1;	for ( j = 6; j < 206; j += 4 )	{/* calculate unpredictability measure cw */	    double r2, phi2, temp1, temp2, temp3;	    	    k = (j+2) / 4; 	    r_prime = 2.0 * sqrt((double) energy_s[0][k])		- sqrt((double) energy_s[2][k]);	    phi_prime = 2.0 * phi_s[0][k] - phi_s[2][k];	    r2 = sqrt((double) energy_s[1][k]);	    phi2 = phi_s[1][k];	    temp1 = r2 * cos( phi2 ) - r_prime * cos( phi_prime );	    temp2 = r2 * sin( phi2 ) - r_prime * sin( phi_prime );	    temp3 = r2 + fabs( r_prime );	    if ( temp3 != 0.0 )		cw[j] = sqrt( temp1 * temp1 + temp2 * temp2 ) / temp3;	    else		cw[j] = 0.0;	    cw[j+1] = cw[j+2] = cw[j+3] = cw[j];	}/***********************************************************************    Set unpredicatiblility of remaining spectral lines to 0.4        ***********************************************************************/	for ( j = 206; j < HBLKSIZE; j++ )	    cw[j] = 0.4;	/***********************************************************************    Calculate the energy and the unpredictability in the threshold   **    calculation partitions                                           ***********************************************************************/	for ( b = 0; b < CBANDS; b++ )	{	    eb[b] = 0.0;	    cb[b] = 0.0;	}	for ( j = 0; j < HBLKSIZE; j++ )	{	    int tp = partition_l[j];	    if ( tp >= 0 )	    {		eb[tp] += energy[j];		cb[tp] += cw[j] * energy[j];	    }	}/***********************************************************************      convolve the partitioned energy and unpredictability           **      with the spreading function, s3_l[b][k]                        ********************************************************************* */		for ( b = 0; b < CBANDS; b++ )	{	    ecb[b] = 0.0;	    ctb[b] = 0.0;	}	for ( b = 0;b < CBANDS; b++ )	{	    for ( k = 0; k < CBANDS; k++ )	    {		ecb[b] += s3_l[b][k] * eb[k];	/* sprdngf for Layer III */		ctb[b] += s3_l[b][k] * cb[k];	    }	}	/* calculate the tonality of each threshold calculation partition */	/* calculate the SNR in each threshhold calculation partition */	for ( b = 0; b < CBANDS; b++ )	{	    double cbb,tbb;	    if (ecb[b] != 0.0 )                {		cbb = ctb[b]/ecb[b];                if (cbb <0.01) cbb = 0.01;		cbb = log( cbb);                }	    else		cbb = 0.0 ;	    tbb = -0.299 - 0.43*cbb;  /* conv1=-0.299, conv2=-0.43 */	    tbb = minimum( 1.0, maximum( 0.0, tbb) ) ;  /* 0<tbb<1 */	    SNR_l[b] = maximum( minval[b], 29.0*tbb+6.0*(1.0-tbb) );	}	/* TMN=29.0,NMT=6.0 for all calculation partitions */		for ( b = 0; b < CBANDS; b++ ) /* calculate the threshold for each partition */	    nb[b] = ecb[b] * norm_l[b] * exp( -SNR_l[b] * LN_TO_LOG10 );	for ( b = 0; b < CBANDS; b++ )	{ /* pre-echo control */	    double temp_1; /* BUG of IS */	    temp_1 = minimum( nb[b], minimum(2.0*nb_1[chn][b],16.0*nb_2[chn][b]) );	    thr[b] = maximum( qthr_l[b], temp_1 );/* rpelev=2.0, rpelev2=16.0 */	    nb_2[chn][b] = nb_1[chn][b];	    nb_1[chn][b] = nb[b];	}	*pe = 0.0;		/*  calculate percetual entropy */	for ( b = 0; b < CBANDS; b++ )	{	    double tp ;	    tp = minimum( 0.0, log((thr[b]+1.0) / (eb[b]+1.0) ) ) ; /*not log*/	    *pe -= numlines[b] * tp ;	}	/* thr[b] -> thr[b]+1.0 : for non sound portition */	#define switch_pe  1800        blocktype = NORM_TYPE;		if ( *pe < switch_pe )	{				/* no attack : use long blocks */	    switch( blocktype_old[chn] ) 	    {	      case NORM_TYPE:	      case STOP_TYPE:		blocktype = NORM_TYPE;		break;    	      case SHORT_TYPE:		blocktype = STOP_TYPE;		break;    	      case START_TYPE:		fprintf( stderr, "Error in block selecting\n" );		abort();		break; /* problem */	    }	    /* threshold calculation (part 2) */	    for ( sb = 0; sb < SBMAX_l; sb++ )	    {		en[sb] = w1_l[sb] * eb[bu_l[sb]] + w2_l[sb] * eb[bo_l[sb]];		thm[sb] = w1_l[sb] *thr[bu_l[sb]] + w2_l[sb] * thr[bo_l[sb]];		for ( b = bu_l[sb]+1; b < bo_l[sb]; b++ )		{		    en[sb]  += eb[b];		    thm[sb] += thr[b];		}		if ( en[sb] != 0.0 )		    ratio[chn][sb] = thm[sb]/en[sb];		else		    ratio[chn][sb] = 0.0;	    }	}	else 	{	    /* attack : use short blocks */	    blocktype = SHORT_TYPE;	    	    if ( blocktype_old[chn] == NORM_TYPE ) 		blocktype_old[chn] = START_TYPE;	    if ( blocktype_old[chn] == STOP_TYPE )		blocktype_old[chn] = SHORT_TYPE ;	    	    /* threshold calculation for short blocks */	    	    for ( sblock = 0; sblock < 3; sblock++ )	    {		for ( b = 0; b < CBANDS_s; b++ )		{		    eb[b] = 0.0;		    ecb[b] = 0.0;		}		for ( j = 0; j < HBLKSIZE_s; j++ )		    eb[partition_s[j]] += energy_s[sblock][j];		for ( b = 0; b < CBANDS_s; b++ )		    for ( k = 0; k < CBANDS_s; k++ )			ecb[b] += s3_l[b][k] * eb[k];

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -