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

📄 l3psy.c

📁 功能非常完善的MP3编译码器,输入文件WAV或AIFF,能够方便的嵌入到你自己的系统当中.
💻 C
📖 第 1 页 / 共 2 页
字号:
	    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];		for ( b = 0; b < CBANDS_s; b++ )		{		    nb[b] = ecb[b] * norm_l[b] * exp( (double) SNR_s[b] * LN_TO_LOG10 );		    thr[b] = maximum (qthr_s[b],nb[b]);		}		for ( sb = 0; sb < SBMAX_s; sb++ )		{		    en[sb] = w1_s[sb] * eb[bu_s[sb]] + w2_s[sb] * eb[bo_s[sb]];		    thm[sb] = w1_s[sb] *thr[bu_s[sb]] + w2_s[sb] * thr[bo_s[sb]];		    for ( b = bu_s[sb]+1; b < bo_s[sb]; b++ )		    {			en[sb] += eb[b];			thm[sb] += thr[b];		    }		    if ( en[sb] != 0.0 )			ratio_s[chn][sb][sblock] = thm[sb]/en[sb];		    else			ratio_s[chn][sb][sblock] = 0.0;		}	    }	} 		cod_info->block_type = blocktype_old[chn];	blocktype_old[chn] = blocktype;	if ( cod_info->block_type == NORM_TYPE )	    cod_info->window_switching_flag = 0;	else	    cod_info->window_switching_flag = 1;	cod_info->mixed_block_flag = 0;}/*____ L3para_read() __________________________________________________________*/void L3para_read(int sfreq, int *numlines, int *partition_l, double *minval, double *qthr_l, double *norm_l, double (*s3_l)[63], int *partition_s, double *qthr_s, double *norm_s, double *SNR, int *cbw_l, int *bu_l, int *bo_l, double *w1_l, double *w2_l, int *cbw_s, int *bu_s, int *bo_s, double *w1_s, double *w2_s){   static double bval_l[CBANDS], bval_s[CBANDS];   int   cbmax, cbmax_tp;   static double s3_s[CBANDS][CBANDS];   int  sbmax ;   int  i,j,k,k2, part_max ;	 psyDataElem * rpa1;	 psyDataElem2 * rpa2;	 psyDataElem3 * rpa3;	 /* Read long block data */	switch( sfreq )	{		case	32000:			rpa1 = psy_longBlock__32000_58;			cbmax_tp = 59;			break;		case	44100:			rpa1 = psy_longBlock_44100_62;			cbmax_tp = 63;			break;		case	48000:			rpa1 = psy_longBlock_48000_61;			cbmax_tp = 62;			break;	}	 	cbmax = cbmax_tp;	for(i=0,k2=0;i<cbmax_tp;i++)	{		numlines[i] = rpa1->lines;		minval[i] = rpa1->minVal;		qthr_l[i] = rpa1->qthr;		norm_l[i] = rpa1->norm;		bval_l[i] = rpa1->bVal;		rpa1++;		for(k=0;k<numlines[i];k++)			partition_l[k2++] = i ;	}		/************************************************************************ * 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++)	  {	  double 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;/*             if (j>=i) tempx = (bval_l[j] - bval_l[i])*3.0;               else    tempx = (bval_l[j] - bval_l[i])*1.5; */             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);             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 */	switch( sfreq )	{		case	32000:			rpa2 = psy_shortBlock_32000_41;			cbmax_tp = 42;			break;		case	44100:			rpa2 = psy_shortBlock_44100_38;			cbmax_tp = 39;			break;		case	48000:			rpa2 = psy_shortBlock_48000_37;			cbmax_tp = 38;			break;	}	cbmax = cbmax_tp;	for(i=0,k2=0;i<cbmax_tp;i++)	{		numlines[i] = rpa2->lines;		qthr_s[i] = rpa2->qthr;		norm_s[i] = rpa2->norm;		SNR[i] = rpa2->snr;		bval_s[i] = rpa2->bVal;		rpa2++;				for(k=0;k<numlines[i];k++)			partition_s[k2++] = i ;	}/************************************************************************ * 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++)	  {	  double 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;             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);             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 */	switch( sfreq )	{		case	32000:			rpa3 = psy_data3_32000_20;			sbmax = 21;			break;		case	44100:			rpa3 = psy_data3_44100_20;			sbmax = 21;			break;		case	48000:			rpa3 = psy_data3_48000_20;			sbmax = 21;			break;	}  for(i=0;i<sbmax;i++)  {		cbw_l[i] = rpa3->cbw;		bu_l[i] = rpa3->bu;		bo_l[i] = rpa3->bo;		w1_l[i] = rpa3->w1;		w2_l[i] = rpa3->w2;		rpa3++;			}/* Read short block data for converting threshold calculation    partitions to scale factor bands */	switch( sfreq )	{		case	32000:			rpa3 = psy_data4_32000_11;			sbmax = 12;			break;		case	44100:			rpa3 = psy_data4_44100_11;			sbmax = 12;			break;		case	48000:			rpa3 = psy_data4_48000_11;			sbmax = 12;			break;	}  for(i=0;i<sbmax;i++)  {		cbw_s[i] = rpa3->cbw;		bu_s[i] = rpa3->bu;		bo_s[i] = rpa3->bo;		w1_s[i] = rpa3->w1;		w2_s[i] = rpa3->w2;		rpa3++;			}	}

⌨️ 快捷键说明

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