psymodel.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:33k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /**********************************************************************
  2.  *   date   programmers         comment                               *
  3.  * 2/25/91  Davis Pan           start of version 1.0 records          *
  4.  * 5/10/91  W. Joseph Carter    Ported to Macintosh and Unix.         *
  5.  * 7/10/91  Earle Jennings      Ported to MsDos.                      *
  6.  *                              replace of floats with FLOAT          *
  7.  * 2/11/92  W. Joseph Carter    Fixed mem_alloc() arg for "absthr".   *
  8.  * 3/16/92  Masahiro Iwadare Modification for Layer III            *
  9.  * 17/4/93  Masahiro Iwadare    Updated for IS Modification           *
  10.  **********************************************************************/
  11. #include "util.h"
  12. #include "encoder.h"
  13. #include "psymodel.h"
  14. #include "l3side.h"
  15. #include <assert.h>
  16. #ifdef HAVEGTK
  17. #include "gtkanal.h"
  18. #endif
  19. #include "tables.h"
  20. #include "fft.h"
  21. #ifdef M_LN10
  22. #define LN_TO_LOG10 (M_LN10/10)
  23. #else
  24. #define         LN_TO_LOG10             0.2302585093
  25. #endif
  26. void L3para_read( FLOAT8 sfreq, int numlines[CBANDS],int numlines_s[CBANDS], int partition_l[HBLKSIZE],
  27.   FLOAT8 minval[CBANDS], FLOAT8 qthr_l[CBANDS], 
  28.   FLOAT8 s3_l[CBANDS + 1][CBANDS + 1],
  29.   FLOAT8 s3_s[CBANDS + 1][CBANDS + 1],
  30.                   FLOAT8 qthr_s[CBANDS],
  31.   FLOAT8 SNR_s[CBANDS],
  32.   int bu_l[SBPSY_l], int bo_l[SBPSY_l],
  33.   FLOAT8 w1_l[SBPSY_l], FLOAT8 w2_l[SBPSY_l],
  34.   int bu_s[SBPSY_s], int bo_s[SBPSY_s],
  35.   FLOAT8 w1_s[SBPSY_s], FLOAT8 w2_s[SBPSY_s] );
  36.  
  37. void L3psycho_anal( lame_global_flags *gfp,
  38.                     short int *buffer[2],int gr_out , 
  39.                     FLOAT8 *ms_ratio,
  40.                     FLOAT8 *ms_ratio_next,
  41.     FLOAT8 *ms_ener_ratio,
  42.     III_psy_ratio masking_ratio[2][2],
  43.     III_psy_ratio masking_MS_ratio[2][2],
  44.     FLOAT8 percep_entropy[2],FLOAT8 percep_MS_entropy[2], 
  45.                     int blocktype_d[2])
  46. {
  47. /* to get a good cache performance, one has to think about
  48.  * the sequence, in which the variables are used
  49.  */
  50.   
  51. /* The static variables "r", "phi_sav", "new", "old" and "oldest" have    */
  52. /* to be remembered for the unpredictability measure.  For "r" and        */
  53. /* "phi_sav", the first index from the left is the channel select and     */
  54. /* the second index is the "age" of the data.                             */
  55.   static FLOAT8 minval[CBANDS],qthr_l[CBANDS];
  56.   static FLOAT8 qthr_s[CBANDS];
  57.   static FLOAT8 nb_1[4][CBANDS], nb_2[4][CBANDS];
  58.   static FLOAT8 s3_s[CBANDS + 1][CBANDS + 1];
  59.   static FLOAT8 s3_l[CBANDS + 1][CBANDS + 1];
  60.   static III_psy_xmin thm[4];
  61.   static III_psy_xmin en[4];
  62.   
  63.   /* unpredictability calculation
  64.    */
  65.   static int cw_upper_index;
  66.   static int cw_lower_index;
  67.   static FLOAT ax_sav[4][2][HBLKSIZE];
  68.   static FLOAT bx_sav[4][2][HBLKSIZE];
  69.   static FLOAT rx_sav[4][2][HBLKSIZE];
  70.   static FLOAT cw[HBLKSIZE];
  71.   /* fft and energy calculation
  72.    */
  73.   FLOAT (*wsamp_l)[BLKSIZE];
  74.   FLOAT (*wsamp_s)[3][BLKSIZE_s];
  75.   FLOAT tot_ener[4];
  76.   static FLOAT wsamp_L[2][BLKSIZE];
  77.   static FLOAT energy[HBLKSIZE];
  78.   static FLOAT wsamp_S[2][3][BLKSIZE_s];
  79.   static FLOAT energy_s[3][HBLKSIZE_s];
  80.   /* convolution
  81.    */
  82.   static FLOAT8 eb[CBANDS];
  83.   static FLOAT8 cb[CBANDS];
  84.   static FLOAT8 thr[CBANDS];
  85.   
  86.   /* Scale Factor Bands
  87.    */
  88.   static FLOAT8 w1_l[SBPSY_l], w2_l[SBPSY_l];
  89.   static FLOAT8 w1_s[SBPSY_s], w2_s[SBPSY_s];
  90.   static FLOAT8 mld_l[SBPSY_l],mld_s[SBPSY_s];
  91.   static int bu_l[SBPSY_l],bo_l[SBPSY_l] ;
  92.   static int bu_s[SBPSY_s],bo_s[SBPSY_s] ;
  93.   static int npart_l,npart_s;
  94.   static int npart_l_orig,npart_s_orig;
  95.   
  96.   static int s3ind[CBANDS][2];
  97.   static int s3ind_s[CBANDS][2];
  98.   static int numlines_s[CBANDS] ;
  99.   static int numlines_l[CBANDS];
  100.   static int partition_l[HBLKSIZE];
  101.   
  102.   /* frame analyzer 
  103.    */
  104. #ifdef HAVEGTK
  105.   static FLOAT energy_save[4][HBLKSIZE];
  106.   static FLOAT8 pe_save[4];
  107.   static FLOAT8 ers_save[4];
  108. #endif
  109.   /* ratios 
  110.    */
  111.   static FLOAT8 pe[4]={0,0,0,0};
  112.   static FLOAT8 ms_ratio_s_old=0,ms_ratio_l_old=0;
  113.   static FLOAT8 ms_ener_ratio_old=.25;
  114.   FLOAT8 ms_ratio_l=0,ms_ratio_s=0;
  115.   /* block type 
  116.    */
  117.   static int blocktype_old[2];
  118.   int blocktype[2],uselongblock[2];
  119.   
  120.   /* usual variables like loop indices, etc..
  121.    */
  122.   int numchn, chn;
  123.   int   b, i, j, k;
  124.   int sb,sblock;
  125.   FLOAT cwlimit;
  126.   /* initialization of static variables
  127.    */
  128.   if((gfp->frameNum==0) && (gr_out==0)){
  129.     FLOAT8 SNR_s[CBANDS];
  130.     
  131.     blocktype_old[0]=STOP_TYPE;
  132.     blocktype_old[1]=STOP_TYPE;
  133.     i = gfp->out_samplerate;
  134.     switch(i){
  135.     case 32000: break;
  136.     case 44100: break;
  137.     case 48000: break;
  138.     case 16000: break;
  139.     case 22050: break;
  140.     case 24000: break;
  141.     default:    fprintf(stderr,"error, invalid sampling frequency: %d Hzn",i);
  142.       exit(-1);
  143.     }
  144.     
  145.     /* reset states used in unpredictability measure */
  146.     memset (rx_sav,0, sizeof(rx_sav));
  147.     memset (ax_sav,0, sizeof(ax_sav));
  148.     memset (bx_sav,0, sizeof(bx_sav));
  149.     memset (en,0, sizeof(en));
  150.     memset (thm,0, sizeof(thm));
  151.     
  152.     /*  gfp->cwlimit = sfreq*j/1024.0;  */
  153.     cw_lower_index=6;
  154.     if (gfp->cwlimit>0) 
  155.       cwlimit=gfp->cwlimit;
  156.     else
  157.       cwlimit=8.8717;
  158.     cw_upper_index = cwlimit*1000.0*1024.0/((FLOAT8) gfp->out_samplerate);
  159.     cw_upper_index=Min(HBLKSIZE-4,cw_upper_index);      /* j+3 < HBLKSIZE-1 */
  160.     cw_upper_index=Max(6,cw_upper_index);
  161.     for ( j = 0; j < HBLKSIZE; j++ )
  162.       cw[j] = 0.4;
  163.     
  164.     /* setup stereo demasking thresholds */
  165.     /* formula reverse enginerred from plot in paper */
  166.     for ( sb = 0; sb < SBPSY_s; sb++ ) {
  167.       FLOAT8 mld = 1.25*(1-cos(PI*sb/SBPSY_s))-2.5;
  168.       mld_s[sb] = pow(10.0,mld);
  169.     }
  170.     for ( sb = 0; sb < SBPSY_l; sb++ ) {
  171.       FLOAT8 mld = 1.25*(1-cos(PI*sb/SBPSY_l))-2.5;
  172.       mld_l[sb] = pow(10.0,mld);
  173.     }
  174.     
  175.     for (i=0;i<HBLKSIZE;i++) partition_l[i]=-1;
  176.     L3para_read( (FLOAT8) gfp->out_samplerate,numlines_l,numlines_s,partition_l,minval,qthr_l,s3_l,s3_s,
  177.  qthr_s,SNR_s,
  178.  bu_l,bo_l,w1_l,w2_l, bu_s,bo_s,w1_s,w2_s );
  179.     
  180.     
  181.     /* npart_l_orig   = number of partition bands before convolution */
  182.     /* npart_l  = number of partition bands after convolution */
  183.     npart_l_orig=0; npart_s_orig=0;
  184.     for (i=0;i<HBLKSIZE;i++) 
  185.       if (partition_l[i]>npart_l_orig) npart_l_orig=partition_l[i];
  186.     npart_l_orig++;
  187.     for (i=0;numlines_s[i]>=0;i++)
  188.       ;
  189.     npart_s_orig = i;
  190.     
  191.     npart_l=bo_l[SBPSY_l-1]+1;
  192.     npart_s=bo_s[SBPSY_s-1]+1;
  193.     /* MPEG2 tables are screwed up 
  194.      * the mapping from paritition bands to scalefactor bands will use
  195.      * more paritition bands than we have.  
  196.      * So we will not compute these fictitious partition bands by reducing
  197.      * npart_l below.  */
  198.     if (npart_l > npart_l_orig) {
  199.       npart_l=npart_l_orig;
  200.       bo_l[SBPSY_l-1]=npart_l-1;
  201.       w2_l[SBPSY_l-1]=1.0;
  202.     }
  203.     if (npart_s > npart_s_orig) {
  204.       npart_s=npart_s_orig;
  205.       bo_s[SBPSY_s-1]=npart_s-1;
  206.       w2_s[SBPSY_s-1]=1.0;
  207.     }
  208.     
  209.     
  210.     
  211.     for (i=0; i<npart_l; i++) {
  212.       for (j = 0; j < npart_l_orig; j++) {
  213. if (s3_l[i][j] != 0.0)
  214.   break;
  215.       }
  216.       s3ind[i][0] = j;
  217.       
  218.       for (j = npart_l_orig - 1; j > 0; j--) {
  219. if (s3_l[i][j] != 0.0)
  220.   break;
  221.       }
  222.       s3ind[i][1] = j;
  223.     }
  224.     for (i=0; i<npart_s; i++) {
  225.       for (j = 0; j < npart_s_orig; j++) {
  226. if (s3_s[i][j] != 0.0)
  227.   break;
  228.       }
  229.       s3ind_s[i][0] = j;
  230.       
  231.       for (j = npart_s_orig - 1; j > 0; j--) {
  232. if (s3_s[i][j] != 0.0)
  233.   break;
  234.       }
  235.       s3ind_s[i][1] = j;
  236.     }
  237.     
  238.     
  239.     /*  
  240.       #include "debugscalefac.c"
  241.     */
  242.     
  243. #define AACS3
  244. #define NEWS3XX
  245. #ifdef AACS3
  246.     /* AAC values, results in more masking over MP3 values */
  247. # define TMN 18
  248. # define NMT 6
  249. #else
  250.     /* MP3 values */
  251. # define TMN 29
  252. # define NMT 6
  253. #endif
  254. #define rpelev 2
  255. #define rpelev2 16
  256.     /* compute norm_l, norm_s instead of relying on table data */
  257.     for ( b = 0;b < npart_l; b++ ) {
  258.       FLOAT8 norm=0;
  259.       for ( k = s3ind[b][0]; k <= s3ind[b][1]; k++ ) {
  260. norm += s3_l[b][k];
  261.       }
  262.       for ( k = s3ind[b][0]; k <= s3ind[b][1]; k++ ) {
  263. s3_l[b][k] *= exp(-LN_TO_LOG10 * NMT) / norm;
  264.       }
  265.       /*printf("%i  norm=%f  norm_l=%f n",b,1/norm,norm_l[b]);*/
  266.     }
  267.     /* MPEG1 SNR_s data is given in db, convert to energy */
  268.     if (gfp->version == 1) {
  269.       for ( b = 0;b < npart_s; b++ ) {
  270. SNR_s[b]=exp( (FLOAT8) SNR_s[b] * LN_TO_LOG10 );
  271.       }
  272.     }
  273.     for ( b = 0;b < npart_s; b++ ) {
  274.       FLOAT8 norm=0;
  275.       for ( k = s3ind_s[b][0]; k <= s3ind_s[b][1]; k++ ) {
  276. norm += s3_s[b][k];
  277.       }
  278.       for ( k = s3ind_s[b][0]; k <= s3ind_s[b][1]; k++ ) {
  279. s3_s[b][k] *= SNR_s[b] / norm;
  280.       }
  281.       /*printf("%i  norm=%f  norm_s=%f n",b,1/norm,norm_l[b]);*/
  282.     }
  283.     
  284.     init_fft();
  285.   }
  286.   /************************* End of Initialization *****************************/
  287.   
  288.   
  289.   
  290.   numchn = gfp->stereo;
  291.   /* chn=2 and 3 = Mid and Side channels */
  292.   if (gfp->mode == MPG_MD_JOINT_STEREO) numchn=4;
  293.   for (chn=0; chn<numchn; chn++) {
  294.   
  295.     wsamp_s = wsamp_S+(chn & 1);
  296.     wsamp_l = wsamp_L+(chn & 1);
  297.     if (chn<2) {    
  298.       /**********************************************************************
  299.        *  compute FFTs
  300.        **********************************************************************/
  301.       fft_long ( *wsamp_l, chn, buffer);
  302.       fft_short( *wsamp_s, chn, buffer); 
  303.       
  304.       /* LR maskings  */
  305.       percep_entropy[chn] = pe[chn]; 
  306.       masking_ratio[gr_out][chn].thm = thm[chn];
  307.       masking_ratio[gr_out][chn].en = en[chn];
  308.     }else{
  309.       /* MS maskings  */
  310.       percep_MS_entropy[chn-2] = pe[chn]; 
  311.       masking_MS_ratio[gr_out][chn-2].en = en[chn];
  312.       masking_MS_ratio[gr_out][chn-2].thm = thm[chn];
  313.       
  314.       if (chn == 2)
  315.       {
  316.         for (j = BLKSIZE-1; j >=0 ; --j)
  317.         {
  318.           FLOAT l = wsamp_L[0][j];
  319.           FLOAT r = wsamp_L[1][j];
  320.           wsamp_L[0][j] = (l+r)*(FLOAT)(SQRT2*0.5);
  321.           wsamp_L[1][j] = (l-r)*(FLOAT)(SQRT2*0.5);
  322.         }
  323.         for (b = 2; b >= 0; --b)
  324.         {
  325.           for (j = BLKSIZE_s-1; j >= 0 ; --j)
  326.           {
  327.             FLOAT l = wsamp_S[0][b][j];
  328.             FLOAT r = wsamp_S[1][b][j];
  329.             wsamp_S[0][b][j] = (l+r)*(FLOAT)(SQRT2*0.5);
  330.             wsamp_S[1][b][j] = (l-r)*(FLOAT)(SQRT2*0.5);
  331.           }
  332.         }
  333.       }
  334.     }
  335.     /**********************************************************************
  336.      *  compute energies
  337.      **********************************************************************/
  338.     
  339.     
  340.     
  341.     energy[0]  = (*wsamp_l)[0];
  342.     energy[0] *= energy[0];
  343.     
  344.     tot_ener[chn] = energy[0]; /* sum total energy at nearly no extra cost */
  345.     
  346.     for (j=BLKSIZE/2-1; j >= 0; --j)
  347.     {
  348.       FLOAT re = (*wsamp_l)[BLKSIZE/2-j];
  349.       FLOAT im = (*wsamp_l)[BLKSIZE/2+j];
  350.       energy[BLKSIZE/2-j] = (re * re + im * im) * (FLOAT)0.5;
  351.       
  352.       tot_ener[chn] += energy[BLKSIZE/2-j];
  353.     }
  354.     for (b = 2; b >= 0; --b)
  355.     {
  356.       energy_s[b][0]  = (*wsamp_s)[b][0];
  357.       energy_s[b][0] *=  energy_s [b][0];
  358.       for (j=BLKSIZE_s/2-1; j >= 0; --j)
  359.       {
  360.         FLOAT re = (*wsamp_s)[b][BLKSIZE_s/2-j];
  361.         FLOAT im = (*wsamp_s)[b][BLKSIZE_s/2+j];
  362.         energy_s[b][BLKSIZE_s/2-j] = (re * re + im * im) * (FLOAT)0.5;
  363.       }
  364.     }
  365. #ifdef HAVEGTK
  366.   if(gfp->gtkflag) {
  367.     for (j=0; j<HBLKSIZE ; j++) {
  368.       pinfo->energy[gr_out][chn][j]=energy_save[chn][j];
  369.       energy_save[chn][j]=energy[j];
  370.     }
  371.   }
  372. #endif
  373.     
  374.     /**********************************************************************
  375.      *    compute unpredicatability of first six spectral lines            * 
  376.      **********************************************************************/
  377.     for ( j = 0; j < cw_lower_index; j++ )
  378.       {  /* calculate unpredictability measure cw */
  379. FLOAT an, a1, a2;
  380. FLOAT bn, b1, b2;
  381. FLOAT rn, r1, r2;
  382. FLOAT numre, numim, den;
  383. a2 = ax_sav[chn][1][j];
  384. b2 = bx_sav[chn][1][j];
  385. r2 = rx_sav[chn][1][j];
  386. a1 = ax_sav[chn][1][j] = ax_sav[chn][0][j];
  387. b1 = bx_sav[chn][1][j] = bx_sav[chn][0][j];
  388. r1 = rx_sav[chn][1][j] = rx_sav[chn][0][j];
  389. an = ax_sav[chn][0][j] = (*wsamp_l)[j];
  390. bn = bx_sav[chn][0][j] = j==0 ? (*wsamp_l)[0] : (*wsamp_l)[BLKSIZE-j];  
  391. rn = rx_sav[chn][0][j] = sqrt(energy[j]);
  392. { /* square (x1,y1) */
  393.   if( r1 != 0 ) {
  394.     numre = (a1*b1);
  395.     numim = (a1*a1-b1*b1)*(FLOAT)0.5;
  396.     den = r1*r1;
  397.   } else {
  398.     numre = 1;
  399.     numim = 0;
  400.     den = 1;
  401.   }
  402. }
  403. { /* multiply by (x2,-y2) */
  404.   if( r2 != 0 ) {
  405.     FLOAT tmp2 = (numim+numre)*(a2+b2)*(FLOAT)0.5;
  406.     FLOAT tmp1 = -a2*numre+tmp2;
  407.     numre =       -b2*numim+tmp2;
  408.     numim = tmp1;
  409.     den *= r2;
  410.   } else {
  411.     /* do nothing */
  412.   }
  413. }
  414. { /* r-prime factor */
  415.   FLOAT tmp = (2*r1-r2)/den;
  416.   numre *= tmp;
  417.   numim *= tmp;
  418. }
  419. den=rn+fabs(2*r1-r2);
  420. if( den != 0 ) {
  421.   numre = (an+bn)*(FLOAT)0.5-numre;
  422.   numim = (an-bn)*(FLOAT)0.5-numim;
  423.   den = sqrt(numre*numre+numim*numim)/den;
  424. }
  425. cw[j] = den;
  426.       }
  427.     /**********************************************************************
  428.      *     compute unpredicatibility of next 200 spectral lines            *
  429.      **********************************************************************/ 
  430.     for ( j = cw_lower_index; j < cw_upper_index; j += 4 )
  431.       {/* calculate unpredictability measure cw */
  432. FLOAT rn, r1, r2;
  433. FLOAT numre, numim, den;
  434. k = (j+2) / 4; 
  435. { /* square (x1,y1) */
  436.   r1 = energy_s[0][k];
  437.   if( r1 != 0 ) {
  438.     FLOAT a1 = (*wsamp_s)[0][k]; 
  439.     FLOAT b1 = (*wsamp_s)[0][BLKSIZE_s-k]; /* k is never 0 */
  440.     numre = (a1*b1);
  441.     numim = (a1*a1-b1*b1)*(FLOAT)0.5;
  442.     den = r1;
  443.     r1 = sqrt(r1);
  444.   } else {
  445.     numre = 1;
  446.     numim = 0;
  447.     den = 1;
  448.   }
  449. }
  450. { /* multiply by (x2,-y2) */
  451.   r2 = energy_s[2][k];
  452.   if( r2 != 0 ) {
  453.     FLOAT a2 = (*wsamp_s)[2][k]; 
  454.     FLOAT b2 = (*wsamp_s)[2][BLKSIZE_s-k];
  455.     
  456.     
  457.     FLOAT tmp2 = (numim+numre)*(a2+b2)*(FLOAT)0.5;
  458.     FLOAT tmp1 = -a2*numre+tmp2;
  459.     numre =       -b2*numim+tmp2;
  460.     numim = tmp1;
  461.     
  462.     r2 = sqrt(r2);
  463.     den *= r2;
  464.   } else {
  465.     /* do nothing */
  466.   }
  467. }
  468. { /* r-prime factor */
  469.   FLOAT tmp = (2*r1-r2)/den;
  470.   numre *= tmp;
  471.   numim *= tmp;
  472. }
  473. rn = sqrt(energy_s[1][k]);
  474. den=rn+fabs(2*r1-r2);
  475. if( den != 0 ) {
  476.   FLOAT an = (*wsamp_s)[1][k]; 
  477.   FLOAT bn = (*wsamp_s)[1][BLKSIZE_s-k];
  478.   numre = (an+bn)*(FLOAT)0.5-numre;
  479.   numim = (an-bn)*(FLOAT)0.5-numim;
  480.   den = sqrt(numre*numre+numim*numim)/den;
  481. }
  482. cw[j+1] = cw[j+2] = cw[j+3] = cw[j] = den;
  483.       }
  484.     
  485. #if 0
  486.     for ( j = 14; j < HBLKSIZE-4; j += 4 )
  487.       {/* calculate energy from short ffts */
  488. FLOAT8 tot,ave;
  489. k = (j+2) / 4; 
  490. for (tot=0, sblock=0; sblock < 3; sblock++)
  491.   tot+=energy_s[sblock][k];
  492. ave = energy[j+1]+ energy[j+2]+ energy[j+3]+ energy[j];
  493. ave /= 4.;
  494. /*
  495.   printf("energy / tot %i %5.2f   %e  %en",j,ave/(tot*16./3.),
  496.   ave,tot*16./3.);
  497. */
  498. energy[j+1] = energy[j+2] = energy[j+3] =  energy[j]=tot;
  499.       }
  500. #endif
  501.     
  502.     
  503.     
  504.     
  505.     
  506.     
  507.     
  508.     
  509.     /**********************************************************************
  510.      *    Calculate the energy and the unpredictability in the threshold   *
  511.      *    calculation partitions                                           *
  512.      **********************************************************************/
  513. #if 0
  514.     for ( b = 0; b < CBANDS; b++ )
  515.       {
  516. eb[b] = 0;
  517. cb[b] = 0;
  518.       }
  519.     for ( j = 0; j < HBLKSIZE; j++ )
  520.       {
  521. int tp = partition_l[j];
  522. if ( tp >= 0 )
  523.   {
  524.     eb[tp] += energy[j];
  525.     cb[tp] += cw[j] * energy[j];
  526.   }
  527. assert(tp<npart_l_orig);
  528.       }
  529. #else
  530.     b = 0;
  531.     for (j = 0; j < cw_upper_index;)
  532.       {
  533. FLOAT8 ebb, cbb;
  534. int i;
  535. ebb = energy[j];
  536. cbb = energy[j] * cw[j];
  537. j++;
  538. for (i = numlines_l[b] - 1; i > 0; i--)
  539.   {
  540.     ebb += energy[j];
  541.     cbb += energy[j] * cw[j];
  542.     j++;
  543.   }
  544. eb[b] = ebb;
  545. cb[b] = cbb;
  546. b++;
  547.       }
  548.     for (; b < npart_l_orig; b++ )
  549.       {
  550. int i;
  551. FLOAT8 ebb = energy[j++];
  552. for (i = numlines_l[b] - 1; i > 0; i--)
  553.   {
  554.     ebb += energy[j++];
  555.   }
  556. eb[b] = ebb;
  557. cb[b] = ebb * 0.4;
  558.       }
  559. #endif
  560.     /**********************************************************************
  561.      *      convolve the partitioned energy and unpredictability           *
  562.      *      with the spreading function, s3_l[b][k]                        *
  563.      ******************************************************************** */
  564.     pe[chn] = 0; /*  calculate percetual entropy */
  565.     for ( b = 0;b < npart_l; b++ )
  566.       {
  567. FLOAT8 tbb,ecb,ctb;
  568. FLOAT8 temp_1; /* BUG of IS */
  569. ecb = 0;
  570. ctb = 0;
  571. for ( k = s3ind[b][0]; k <= s3ind[b][1]; k++ )
  572.   {
  573.     ecb += s3_l[b][k] * eb[k]; /* sprdngf for Layer III */
  574.     ctb += s3_l[b][k] * cb[k];
  575.   }
  576. /* calculate the tonality of each threshold calculation partition */
  577. /* calculate the SNR in each threshhold calculation partition */
  578. tbb = ecb;
  579. if (tbb != 0)
  580.   {
  581.     tbb = ctb / tbb;
  582.     if (tbb <= 0.04875584301)
  583.       {
  584. tbb = exp(-LN_TO_LOG10 * (TMN - NMT));
  585.       }
  586.     else if (tbb > 0.4989003827)
  587.       {
  588. tbb = 1;
  589.       }
  590.     else
  591.       {
  592. tbb = log(tbb);
  593. tbb = exp(((TMN - NMT)*(LN_TO_LOG10*0.299))
  594. + ((TMN - NMT)*(LN_TO_LOG10*0.43 ))*tbb);  /* conv1=-0.299, conv2=-0.43 */
  595.       }
  596.   }
  597. tbb = Min(minval[b], tbb);
  598. ecb *= tbb;
  599. /* pre-echo control */
  600. /* rpelev=2.0, rpelev2=16.0 */
  601. temp_1 = Min(ecb, Min(rpelev*nb_1[chn][b],rpelev2*nb_2[chn][b]) );
  602. thr[b] = Max( qthr_l[b], temp_1 ); 
  603. nb_2[chn][b] = nb_1[chn][b];
  604. nb_1[chn][b] = ecb;
  605. /* note: all surges in PE are because of the above pre-echo formula
  606.  * for temp_1.  it this is not used, PE is always around 600
  607.  */
  608. if (thr[b] < eb[b])
  609.   {
  610.     /* there's no non sound portition, because thr[b] is
  611.      maximum of qthr_l and temp_1 */
  612.     pe[chn] -= numlines_l[b] * log(thr[b] / eb[b]);
  613.   }
  614.       }
  615. #ifdef HAVEGTK
  616.     if (gfp->gtkflag) {
  617.       FLOAT mn,mx,ma=0,mb=0,mc=0;
  618.       for ( j = HBLKSIZE_s/2; j < HBLKSIZE_s; j ++)
  619.       {
  620.         ma += energy_s[0][j];
  621.         mb += energy_s[1][j];
  622.         mc += energy_s[2][j];
  623.       }
  624.       mn = Min(ma,mb);
  625.       mn = Min(mn,mc);
  626.       mx = Max(ma,mb);
  627.       mx = Max(mx,mc);
  628.       pinfo->ers[gr_out][chn]=ers_save[chn];
  629.       ers_save[chn]=mx/(1e-12+mn);
  630.       pinfo->pe[gr_out][chn]=pe_save[chn];
  631.       pe_save[chn]=pe[chn];
  632.     }
  633. #endif
  634.     
  635.     /*************************************************************** 
  636.      * determine the block type (window type) based on L & R channels
  637.      * 
  638.      ***************************************************************/
  639.     if (chn<2) {
  640.       if (gfp->no_short_blocks){
  641. uselongblock[chn]=1;
  642.       } else {
  643. /* tuned for t1.wav.  doesnt effect most other samples */
  644. if (pe[chn] > 3000) {
  645.   uselongblock[chn]=0;
  646. } else { 
  647.   FLOAT mn,mx,ma=0,mb=0,mc=0;
  648.   for ( j = HBLKSIZE_s/2; j < HBLKSIZE_s; j ++)
  649.   {
  650.       ma += energy_s[0][j];
  651.       mb += energy_s[1][j];
  652.       mc += energy_s[2][j];
  653.   }
  654.   mn = Min(ma,mb);
  655.   mn = Min(mn,mc);
  656.   mx = Max(ma,mb);
  657.   mx = Max(mx,mc);
  658.   uselongblock[chn] = 1;
  659.   
  660.   if ( mx > 30*mn ) 
  661.   {/* big surge of energy - always use short blocks */
  662.     uselongblock[chn] = 0;
  663.   } 
  664.   else if ((mx > 10*mn) && (pe[chn] > 1000))
  665.   {/* medium surge, medium pe - use short blocks */
  666.     uselongblock[chn] = 0;
  667.   }
  668.       }
  669.     }
  670.     /*************************************************************** 
  671.      * compute masking thresholds for both short and long blocks
  672.      ***************************************************************/
  673.     /* longblock threshold calculation (part 2) */
  674.     for ( sb = 0; sb < SBPSY_l; sb++ )
  675.       {
  676. FLOAT8 enn = w1_l[sb] * eb[bu_l[sb]] + w2_l[sb] * eb[bo_l[sb]];
  677. FLOAT8 thmm = w1_l[sb] *thr[bu_l[sb]] + w2_l[sb] * thr[bo_l[sb]];
  678. for ( b = bu_l[sb]+1; b < bo_l[sb]; b++ )
  679.   {
  680.     enn  += eb[b];
  681.     thmm += thr[b];
  682.   }
  683. en[chn].l[sb] = enn;
  684. thm[chn].l[sb] = thmm;
  685.       }
  686.     
  687.     
  688.     /* threshold calculation for short blocks */
  689.     for ( sblock = 0; sblock < 3; sblock++ )
  690.       {
  691. j = 0;
  692. for ( b = 0; b < npart_s_orig; b++ )
  693.   {
  694.     int i;
  695.     FLOAT ecb = energy_s[sblock][j++];
  696.     for (i = numlines_s[b]; i > 0; i--)
  697.       {
  698. ecb += energy_s[sblock][j++];
  699.       }
  700.     eb[b] = ecb;
  701.   }
  702. for ( b = 0; b < npart_s; b++ )
  703.   {
  704.     FLOAT8 ecb = 0;
  705.     for ( k = s3ind_s[b][0]; k <= s3ind_s[b][1]; k++ )
  706.       {
  707. ecb += s3_s[b][k] * eb[k];
  708.       }
  709.     thr[b] = Max (qthr_s[b], ecb);
  710.   }
  711. for ( sb = 0; sb < SBPSY_s; sb++ )
  712.   {
  713.     FLOAT8 enn  = w1_s[sb] * eb[bu_s[sb]] + w2_s[sb] * eb[bo_s[sb]];
  714.     FLOAT8 thmm = w1_s[sb] *thr[bu_s[sb]] + w2_s[sb] * thr[bo_s[sb]];
  715.     for ( b = bu_s[sb]+1; b < bo_s[sb]; b++ )
  716.       {
  717. enn  += eb[b];
  718. thmm += thr[b];
  719.       }
  720.     en[chn].s[sb][sblock] = enn;
  721.     thm[chn].s[sb][sblock] = thmm;
  722.   }
  723.       }
  724.   } /* end loop over chn */
  725.   /* compute M/S thresholds from Johnston & Ferreira 1992 ICASSP paper */
  726.   if ( numchn==4 /* mid/side and r/l */) {
  727.     FLOAT8 rside,rmid,mld;
  728.     int chmid=2,chside=3; 
  729.     
  730.     for ( sb = 0; sb < SBPSY_l; sb++ ) {
  731.       /* use this fix if L & R masking differs by 2db or less */
  732.       /* if db = 10*log10(x2/x1) < 2 */
  733.       /* if (x2 < 1.58*x1) { */
  734.       if (thm[0].l[sb] <= 1.58*thm[1].l[sb]
  735.   && thm[1].l[sb] <= 1.58*thm[0].l[sb]) {
  736. mld = mld_l[sb]*en[chside].l[sb];
  737. rmid = Max(thm[chmid].l[sb], Min(thm[chside].l[sb],mld));
  738. mld = mld_l[sb]*en[chmid].l[sb];
  739. rside = Max(thm[chside].l[sb],Min(thm[chmid].l[sb],mld));
  740. thm[chmid].l[sb]=rmid;
  741. thm[chside].l[sb]=rside;
  742.       }
  743.     }
  744.     for ( sb = 0; sb < SBPSY_s; sb++ ) {
  745.       for ( sblock = 0; sblock < 3; sblock++ ) {
  746. if (thm[0].s[sb][sblock] <= 1.58*thm[1].s[sb][sblock]
  747.     && thm[1].s[sb][sblock] <= 1.58*thm[0].s[sb][sblock]) {
  748.   mld = mld_s[sb]*en[chside].s[sb][sblock];
  749.   rmid = Max(thm[chmid].s[sb][sblock],Min(thm[chside].s[sb][sblock],mld));
  750.   mld = mld_s[sb]*en[chmid].s[sb][sblock];
  751.   rside = Max(thm[chside].s[sb][sblock],Min(thm[chmid].s[sb][sblock],mld));
  752.   thm[chmid].s[sb][sblock]=rmid;
  753.   thm[chside].s[sb][sblock]=rside;
  754. }
  755.       }
  756.     }
  757.   }
  758.   
  759.   
  760.   
  761.   if (gfp->mode == MPG_MD_JOINT_STEREO)  {
  762.     /* determin ms_ratio from masking thresholds*/
  763.     /* use ms_stereo (ms_ratio < .35) if average thresh. diff < 5 db */
  764.     FLOAT8 db,x1,x2,sidetot=0,tot=0;
  765.     for (sb= SBPSY_l/4 ; sb< SBPSY_l; sb ++ ) {
  766.       x1 = Min(thm[0].l[sb],thm[1].l[sb]);
  767.       x2 = Max(thm[0].l[sb],thm[1].l[sb]);
  768.       /* thresholds difference in db */
  769.       if (x2 >= 1000*x1)  db=3;
  770.       else db = log10(x2/x1);  
  771.       /*  printf("db = %f %e %e  n",db,thm[0].l[sb],thm[1].l[sb]);*/
  772.       sidetot += db;
  773.       tot++;
  774.     }
  775.     ms_ratio_l= (sidetot/tot)*0.7; /* was .35*(sidetot/tot)/5.0*10 */
  776.     ms_ratio_l = Min(ms_ratio_l,0.5);
  777.     
  778.     sidetot=0; tot=0;
  779.     for ( sblock = 0; sblock < 3; sblock++ )
  780.       for ( sb = SBPSY_s/4; sb < SBPSY_s; sb++ ) {
  781. x1 = Min(thm[0].s[sb][sblock],thm[1].s[sb][sblock]);
  782. x2 = Max(thm[0].s[sb][sblock],thm[1].s[sb][sblock]);
  783. /* thresholds difference in db */
  784. if (x2 >= 1000*x1)  db=3;
  785. else db = log10(x2/x1);  
  786. sidetot += db;
  787. tot++;
  788.       }
  789.     ms_ratio_s = (sidetot/tot)*0.7; /* was .35*(sidetot/tot)/5.0*10 */
  790.     ms_ratio_s = Min(ms_ratio_s,.5);
  791.   }
  792.   /*************************************************************** 
  793.    * determin final block type
  794.    ***************************************************************/
  795.   for (chn=0; chn<gfp->stereo; chn++) {
  796.     blocktype[chn] = NORM_TYPE;
  797.   }
  798.   if (gfp->stereo==2) {
  799.     if (!gfp->allow_diff_short || gfp->mode==MPG_MD_JOINT_STEREO) {
  800.       /* force both channels to use the same block type */
  801.       /* this is necessary if the frame is to be encoded in ms_stereo.  */
  802.       /* But even without ms_stereo, FhG  does this */
  803.       int bothlong= (uselongblock[0] && uselongblock[1]);
  804.       if (!bothlong) {
  805. uselongblock[0]=0;
  806. uselongblock[1]=0;
  807.       }
  808.     }
  809.   }
  810.   
  811.   
  812.   /* update the blocktype of the previous granule, since it depends on what
  813.    * happend in this granule */
  814.   for (chn=0; chn<gfp->stereo; chn++) {
  815.     if ( uselongblock[chn])
  816.       { /* no attack : use long blocks */
  817. switch( blocktype_old[chn] ) 
  818.   {
  819.   case NORM_TYPE:
  820.   case STOP_TYPE:
  821.     blocktype[chn] = NORM_TYPE;
  822.     break;
  823.   case SHORT_TYPE:
  824.     blocktype[chn] = STOP_TYPE; 
  825.     break;
  826.   case START_TYPE:
  827.     fprintf( stderr, "Error in block selectingn" );
  828.     abort();
  829.     break; /* problem */
  830.   }
  831.       } else   {
  832. /* attack : use short blocks */
  833. blocktype[chn] = SHORT_TYPE;
  834. if ( blocktype_old[chn] == NORM_TYPE ) {
  835.   blocktype_old[chn] = START_TYPE;
  836. }
  837. if ( blocktype_old[chn] == STOP_TYPE ) {
  838.   blocktype_old[chn] = SHORT_TYPE ;
  839. }
  840.       }
  841.     
  842.     blocktype_d[chn] = blocktype_old[chn];  /* value returned to calling program */
  843.     blocktype_old[chn] = blocktype[chn];    /* save for next call to l3psy_anal */
  844.   }
  845.   
  846.   if (blocktype_d[0]==2) 
  847.     *ms_ratio = ms_ratio_s_old;
  848.   else
  849.     *ms_ratio = ms_ratio_l_old;
  850.   ms_ratio_s_old = ms_ratio_s;
  851.   ms_ratio_l_old = ms_ratio_l;
  852.   /* we dont know the block type of this frame yet - assume long */
  853.   *ms_ratio_next = ms_ratio_l;
  854.   /*********************************************************************/
  855.   /* compute side_energy / (side+mid)_energy */
  856.   /* 0 = no energy in side channel */
  857.   /* .5 = half of total energy in side channel */
  858.   /*********************************************************************/
  859.   if (numchn==4)  {
  860.     FLOAT tmp = tot_ener[3]+tot_ener[2];
  861.     *ms_ener_ratio = ms_ener_ratio_old;
  862.     ms_ener_ratio_old=0;
  863.     if (tmp>0) ms_ener_ratio_old=tot_ener[3]/tmp;
  864.   } else
  865.     /* we didn't compute ms_ener_ratios */
  866.     *ms_ener_ratio = 0;
  867.  
  868. }
  869. void L3para_read(FLOAT8 sfreq, int *numlines_l,int *numlines_s, int *partition_l, FLOAT8 *minval,
  870. FLOAT8 *qthr_l, FLOAT8 s3_l[64][64], FLOAT8 s3_s[CBANDS + 1][CBANDS + 1],
  871. FLOAT8 *qthr_s, FLOAT8 *SNR, 
  872. int *bu_l, int *bo_l, FLOAT8 *w1_l, FLOAT8 *w2_l, 
  873. int *bu_s, int *bo_s, FLOAT8 *w1_s, FLOAT8 *w2_s)
  874. {
  875.   FLOAT8 freq_tp;
  876.   FLOAT8 bval_l[CBANDS], bval_s[CBANDS];
  877.   int   cbmax=0, cbmax_tp;
  878.   FLOAT8 *p = psy_data;
  879.   int  sbmax ;
  880.   int  i,j,k,k2,loop, part_max ;
  881.   int freq_scale=1;
  882.   /* use MPEG1 tables.  The MPEG2 tables in tables.c appear to be 
  883.    * junk.  MPEG2 doc claims data for these tables is the same as the
  884.    * MPEG1 data for 2x sampling frequency */
  885.   /*  if (sfreq<32000) freq_scale=2; */
  886.   
  887.   /* Read long block data */
  888.   for(loop=0;loop<6;loop++)
  889.     {
  890.       freq_tp = *p++;
  891.       cbmax_tp = (int) *p++;
  892.       cbmax_tp++;
  893.       if (sfreq == freq_tp/freq_scale )
  894. {
  895.   cbmax = cbmax_tp;
  896.   for(i=0,k2=0;i<cbmax_tp;i++)
  897.     {
  898.       j = (int) *p++;
  899.       numlines_l[i] = (int) *p++;
  900.       minval[i] = exp(-((*p++) - NMT) * LN_TO_LOG10);
  901.       qthr_l[i] = *p++;
  902.       /* norm_l[i] = *p++*/ p++;
  903.       bval_l[i] = *p++;
  904.       if (j!=i)
  905. {
  906.   fprintf(stderr,"1. please check "psy_data"");
  907.   exit(-1);
  908. }
  909.       for(k=0;k<numlines_l[i];k++)
  910. partition_l[k2++] = i ;
  911.     }
  912. }
  913.       else
  914. p += cbmax_tp * 6;
  915.     }
  916. #define NEWBARKXXX
  917. #ifdef NEWBARK
  918.   /* compute bark values of each critical band */
  919.   j = 0;
  920.   for(i=0;i<cbmax;i++)
  921.     {
  922.       FLOAT8 ji, freq, bark;
  923.       ji = j + (numlines_l[i]-1)/2.0;
  924.       freq = sfreq*ji/1024000.0;
  925.       bark = 13*atan(.76*freq) + 3.5*atan(freq*freq/(7.5*7.5));
  926.       printf("%i %i bval_l table=%f  f=%f  formaula=%f n",i,j,bval_l[i],freq,bark);
  927.       bval_l[i]=bark;
  928.       j += numlines_l[i];
  929.     }
  930. #endif
  931.   /************************************************************************
  932.    * Now compute the spreading function, s[j][i], the value of the spread-*
  933.    * ing function, centered at band j, for band i, store for later use    *
  934.    ************************************************************************/
  935.   /* i.e.: sum over j to spread into signal barkval=i  
  936.      NOTE: i and j are used opposite as in the ISO docs */
  937.   part_max = cbmax ;
  938.   for(i=0;i<part_max;i++)
  939.     {
  940.       FLOAT8 tempx,x,tempy,temp;
  941.       for(j=0;j<part_max;j++)
  942. {
  943.   /*tempx = (bval_l[i] - bval_l[j])*1.05;*/
  944.   if (j>=i) tempx = (bval_l[i] - bval_l[j])*3.0;
  945.   else    tempx = (bval_l[i] - bval_l[j])*1.5;
  946. #ifdef AACS3
  947.           if (i>=j) tempx = (bval_l[i] - bval_l[j])*3.0;
  948.   else    tempx = (bval_l[i] - bval_l[j])*1.5; 
  949. #endif
  950.   if(tempx>=0.5 && tempx<=2.5)
  951.     {
  952.       temp = tempx - 0.5;
  953.       x = 8.0 * (temp*temp - 2.0 * temp);
  954.     }
  955.   else x = 0.0;
  956.   tempx += 0.474;
  957.   tempy = 15.811389 + 7.5*tempx - 17.5*sqrt(1.0+tempx*tempx);
  958. #ifdef NEWS3
  959.   if (j>=i) tempy = (bval_l[j] - bval_l[i])*(-15);
  960.   else    tempy = (bval_l[j] - bval_l[i])*25;
  961.   x=0; 
  962. #endif
  963.   /*
  964.   if ((i==part_max/2)  && (fabs(bval_l[j] - bval_l[i])) < 3) {
  965.     printf("bark=%f   x+tempy = %f  n",bval_l[j] - bval_l[i],x+tempy);
  966.   }
  967.   */
  968.   if (tempy <= -60.0) s3_l[i][j] = 0.0;
  969.   else                s3_l[i][j] = exp( (x + tempy)*LN_TO_LOG10 ); 
  970. }
  971.     }
  972.   /* Read short block data */
  973.   for(loop=0;loop<6;loop++)
  974.     {
  975.       freq_tp = *p++;
  976.       cbmax_tp = (int) *p++;
  977.       cbmax_tp++;
  978.       if (sfreq == freq_tp/freq_scale )
  979. {
  980.   cbmax = cbmax_tp;
  981.   for(i=0,k2=0;i<cbmax_tp;i++)
  982.     {
  983.       j = (int) *p++;
  984.       numlines_s[i] = (int) *p++;
  985.       qthr_s[i] = *p++;         
  986.       /* norm_s[i] =*p++ */ p++;         
  987.       SNR[i] = *p++;            
  988.       bval_s[i] = *p++;
  989.       if (j!=i)
  990. {
  991.   fprintf(stderr,"3. please check "psy_data"");
  992.   exit(-1);
  993. }
  994.       numlines_s[i]--;
  995.     }
  996.   numlines_s[i] = -1;
  997. }
  998.       else
  999. p += cbmax_tp * 6;
  1000.     }
  1001. #ifdef NEWBARK
  1002.   /* compute bark values of each critical band */
  1003.   j = 0;
  1004.   for(i=0;i<cbmax;i++)
  1005.     {
  1006.       FLOAT8 ji, freq, bark;
  1007.       ji = (j * 2 + numlines_s[i]) / 2.0;
  1008.       freq = sfreq*ji/256000.0;
  1009.       bark = 13*atan(.76*freq) + 3.5*atan(freq*freq/(7.5*7.5));
  1010.       printf("%i %i bval_s = %f  %f  %f n",i,j,bval_s[i],freq,bark);
  1011.       bval_s[i]=bark;
  1012.       j += numlines_s[i] + 1;
  1013.     }
  1014. #endif
  1015.   /************************************************************************
  1016.    * Now compute the spreading function, s[j][i], the value of the spread-*
  1017.    * ing function, centered at band j, for band i, store for later use    *
  1018.    ************************************************************************/
  1019.   part_max = cbmax ;
  1020.   for(i=0;i<part_max;i++)
  1021.     {
  1022.       FLOAT8 tempx,x,tempy,temp;
  1023.       for(j=0;j<part_max;j++)
  1024. {
  1025.   /* tempx = (bval_s[i] - bval_s[j])*1.05;*/
  1026.   if (j>=i) tempx = (bval_s[i] - bval_s[j])*3.0;
  1027.   else    tempx = (bval_s[i] - bval_s[j])*1.5;
  1028. #ifdef AACS3
  1029.           if (i>=j) tempx = (bval_s[i] - bval_s[j])*3.0;
  1030.   else    tempx = (bval_s[i] - bval_s[j])*1.5; 
  1031. #endif
  1032.   if(tempx>=0.5 && tempx<=2.5)
  1033.     {
  1034.       temp = tempx - 0.5;
  1035.       x = 8.0 * (temp*temp - 2.0 * temp);
  1036.     }
  1037.   else x = 0.0;
  1038.   tempx += 0.474;
  1039.   tempy = 15.811389 + 7.5*tempx - 17.5*sqrt(1.0+tempx*tempx);
  1040. #ifdef NEWS3
  1041.   if (j>=i) tempy = (bval_s[j] - bval_s[i])*(-15);
  1042.   else    tempy = (bval_s[j] - bval_s[i])*25;
  1043.   x=0; 
  1044. #endif
  1045.   if (tempy <= -60.0) s3_s[i][j] = 0.0;
  1046.   else                s3_s[i][j] = exp( (x + tempy)*LN_TO_LOG10 );
  1047. }
  1048.     }
  1049.   /* Read long block data for converting threshold calculation 
  1050.      partitions to scale factor bands */
  1051.   for(loop=0;loop<6;loop++)
  1052.     {
  1053.       freq_tp = *p++;
  1054.       sbmax =  (int) *p++;
  1055.       sbmax++;
  1056.       if (sfreq == freq_tp/freq_scale)
  1057. {
  1058.   for(i=0;i<sbmax;i++)
  1059.     {
  1060.       j = (int) *p++;
  1061.       p++;             
  1062.       bu_l[i] = (int) *p++;
  1063.       bo_l[i] = (int) *p++;
  1064.       w1_l[i] = (FLOAT8) *p++;
  1065.       w2_l[i] = (FLOAT8) *p++;
  1066.       if (j!=i)
  1067. { fprintf(stderr,"30:please check "psy_data"n");
  1068. exit(-1);
  1069. }
  1070.       if (i!=0)
  1071. if ( (fabs(1.0-w1_l[i]-w2_l[i-1]) > 0.01 ) )
  1072.   {
  1073.     fprintf(stderr,"31l: please check "psy_data."n");
  1074.                   fprintf(stderr,"w1,w2: %f %f n",w1_l[i],w2_l[i-1]);
  1075.     exit(-1);
  1076.   }
  1077.     }
  1078. }
  1079.       else
  1080. p += sbmax * 6;
  1081.     }
  1082.   /* Read short block data for converting threshold calculation 
  1083.      partitions to scale factor bands */
  1084.   for(loop=0;loop<6;loop++)
  1085.     {
  1086.       freq_tp = *p++;
  1087.       sbmax = (int) *p++;
  1088.       sbmax++;
  1089.       if (sfreq == freq_tp/freq_scale)
  1090. {
  1091.   for(i=0;i<sbmax;i++)
  1092.     {
  1093.       j = (int) *p++;
  1094.       p++;
  1095.       bu_s[i] = (int) *p++;
  1096.       bo_s[i] = (int) *p++;
  1097.       w1_s[i] = *p++;
  1098.       w2_s[i] = *p++;
  1099.       if (j!=i)
  1100. { fprintf(stderr,"30:please check "psy_data"n");
  1101. exit(-1);
  1102. }
  1103.       if (i!=0)
  1104. if ( (fabs(1.0-w1_s[i]-w2_s[i-1]) > 0.01 ) )
  1105.   { 
  1106.                   fprintf(stderr,"31s: please check "psy_data."n");
  1107.                   fprintf(stderr,"w1,w2: %f %f n",w1_s[i],w2_s[i-1]);
  1108.   exit(-1);
  1109.   }
  1110.     }
  1111. }
  1112.       else
  1113. p += sbmax * 6;
  1114.     }
  1115. }