TONAL.C
上传用户:njqiyou
上传日期:2007-01-08
资源大小:574k
文件大小:38k
源码类别:

mpeg/mp3

开发平台:

C/C++

  1. /**********************************************************************
  2.  * ISO MPEG Audio Subgroup Software Simulation Group (1996)
  3.  * ISO 13818-3 MPEG-2 Audio Encoder - Lower Sampling Frequency Extension
  4.  *
  5.  * $Id: tonal.c,v 1.1 1996/02/14 04:04:23 rowlands Exp $
  6.  *
  7.  * $Log: tonal.c,v $
  8.  * Revision 1.1  1996/02/14 04:04:23  rowlands
  9.  * Initial revision
  10.  *
  11.  * Received from Mike Coleman
  12.  **********************************************************************/
  13. /**********************************************************************
  14.  *   date   programmers         comment                               *
  15.  * 2/25/91  Douglas Wong        start of version 1.1 records          *
  16.  * 3/06/91  Douglas Wong        rename: setup.h to endef.h            *
  17.  *                              updated I_psycho_one and II_psycho_one*
  18.  * 3/11/91  W. J. Carter        Added Douglas Wong's updates dated    *
  19.  *                              3/9/91 for I_Psycho_One() and for     *
  20.  *                              II_Psycho_One().                      *
  21.  * 5/10/91  W. Joseph Carter    Ported to Macintosh and Unix.         *
  22.  *                              Located and fixed numerous software   *
  23.  *                              bugs and table data errors.           *
  24.  * 6/11/91  Davis Pan           corrected several bugs                *
  25.  *                              based on comments from H. Fuchs       *
  26.  * 01jul91  dpwe (Aware Inc.)   Made pow() args float                 *
  27.  *                              Removed logical bug in I_tonal_label: *
  28.  *                              Sometimes *tone returned == STOP      *
  29.  * 7/10/91  Earle Jennings      no change necessary in port to MsDos  *
  30.  * 11sep91  dpwe@aware.com      Subtracted 90.3dB from II_f_f_t peaks *
  31.  * 10/1/91  Peter W. Farrett    Updated II_Psycho_One(),I_Psycho_One()*
  32.  *                              to include comments.                  *
  33.  *11/29/91  Masahiro Iwadare    Bug fix regarding POWERNORM           *
  34.  *                              fixed several other miscellaneous bugs*
  35.  * 2/11/92  W. Joseph Carter    Ported new code to Macintosh.  Most   *
  36.  *                              important fixes involved changing     *
  37.  *                              16-bit ints to long or unsigned in    *
  38.  *                              bit alloc routines for quant of 65535 *
  39.  *                              and passing proper function args.     *
  40.  *                              Removed "Other Joint Stereo" option   *
  41.  *                              and made bitrate be total channel     *
  42.  *                              bitrate, irrespective of the mode.    *
  43.  *                              Fixed many small bugs & reorganized.  *
  44.  * 2/12/92  Masahiro Iwadare    Fixed some potential bugs in          *
  45.  *          Davis Pan           subsampling()                         *
  46.  * 2/25/92  Masahiro Iwadare    Fixed some more potential bugs        *
  47.  * 6/24/92  Tan Ah Peng         Modified window for FFT               * 
  48.  *                              (denominator N-1 to N)                *
  49.  *                              Updated all critical band rate &      *
  50.  *                              absolute threshold tables and critical*
  51.  *                              boundaries for use with Layer I & II  *  
  52.  *                              Corrected boundary limits for tonal   *
  53.  *                              component computation                 *
  54.  *                              Placement of non-tonal component at   *
  55.  *                              geometric mean of critical band       *
  56.  *                              (previous placement method commented  *
  57.  *                               out - can be used if desired)        *
  58.  * 3/01/93  Mike Li             Infinite looping fix in noise_label() *
  59.  * 3/19/93  Jens Spille         fixed integer overflow problem in     *
  60.  *                              psychoacoutic model 1                 *
  61.  * 3/19/93  Giorgio Dimino      modifications to better account for   *
  62.  *                              tonal and non-tonal components        *
  63.  * 5/28/93 Sriram Jayasimha     "London" mod. to psychoacoustic model1*
  64.  * 8/05/93 Masahiro Iwadare     noise_label modification "option"     *
  65.  * 1/21/94 Seymore Shlien       fixed another infinite looping problem*
  66.  * 7/12/95 Soeren H. Nielsen    Changes for LSF, new tables           *
  67.  **********************************************************************/
  68. #include "common.h"
  69. #include "encoder.h"
  70. #define LONDON                  /* enable "LONDON" modification */
  71. #define MAKE_SENSE              /* enable "MAKE_SENSE" modification */
  72. #define MI_OPTION               /* enable "MI_OPTION" modification */
  73. /**********************************************************************
  74. *
  75. *        This module implements the psychoacoustic model I for the
  76. * MPEG encoder layer II. It uses simplified tonal and noise masking
  77. * threshold analysis to generate SMR for the encoder bit allocation
  78. * routine.
  79. *
  80. **********************************************************************/
  81. int crit_band;
  82. int FAR *cbound;
  83. int sub_size;
  84. void read_cbound(lay,freq)  /* this function reads in critical */
  85. int lay, freq;              /* band boundaries                 */
  86. {
  87.  int i,j,k;
  88.  FILE *fp;
  89.  char r[16], t[80];
  90.  strcpy(r, "2cb1");
  91.  r[0] = (char) lay + '0';
  92.  r[3] = (char) freq + '0';
  93.  if( !(fp = OpenTableFile(r)) ){       /* check boundary values */
  94.     printf("Please check %s boundary tablen",r);
  95.     exit(1);
  96.  }
  97.  fgets(t,80,fp);               /* read input for critical bands */
  98.  sscanf(t,"%dn",&crit_band);
  99.  cbound = (int FAR *) mem_alloc(sizeof(int) * crit_band, "cbound");
  100.  for(i=0;i<crit_band;i++){   /* continue to read input for */
  101.     fgets(t,80,fp);            /* critical band boundaries   */
  102.     sscanf(t,"%d %dn",&j, &k);
  103.     if(i==j) cbound[j] = k;
  104.     else {                     /* error */
  105.        printf("Please check index %d in cbound table %sn",i,r);
  106.        exit(1);
  107.     }
  108.  }
  109.  fclose(fp);
  110. }        
  111. void read_freq_band(ltg,lay,freq)  /* this function reads in   */
  112. int lay, freq;                     /* frequency bands and bark */
  113. g_ptr FAR *ltg;                /* values                   */
  114. {
  115.  int i,j, k;
  116.  double b,c;
  117.  FILE *fp;
  118.  char r[16], t[80];
  119.  strcpy(r, "2th1");
  120.  r[0] = (char) lay + '0';
  121.  r[3] = (char) freq + '0';
  122.  if( !(fp = OpenTableFile(r)) ){   /* check freq. values  */
  123.     printf("Please check frequency and cband table %sn",r);
  124.     exit(1);
  125.  }
  126.  fgets(t,80,fp);              /* read input for freq. subbands */
  127.  sscanf(t,"%dn",&sub_size);
  128.  *ltg = (g_ptr FAR ) mem_alloc(sizeof(g_thres) * sub_size, "ltg");
  129.  (*ltg)[0].line = 0;          /* initialize global masking threshold */
  130.  (*ltg)[0].bark = 0;
  131.  (*ltg)[0].hear = 0;
  132.  for(i=1;i<sub_size;i++){    /* continue to read freq. subband */
  133.     fgets(t,80,fp);          /* and assign                     */
  134.     sscanf(t,"%d %d %lf %lfn",&j, &k, &b, &c);
  135.     if(i == j){
  136.        (*ltg)[j].line = k;
  137.        (*ltg)[j].bark = b;
  138.        (*ltg)[j].hear = c;
  139.     }
  140.     else {                   /* error */
  141.        printf("Please check index %d in freq-cb table %sn",i,r);
  142.        exit(1);
  143.     }
  144.  }
  145.  fclose(fp);
  146. }
  147. void make_map(power, ltg)       /* this function calculates the */
  148. mask FAR power[HAN_SIZE];   /* global masking threshold     */
  149. g_thres FAR *ltg;
  150. {
  151.  int i,j;
  152.  for(i=1;i<sub_size;i++) for(j=ltg[i-1].line;j<=ltg[i].line;j++)
  153.     power[j].map = i;
  154. }
  155. double add_db(a,b)
  156. double a,b;
  157. {
  158.  a = pow(10.0,a/10.0);
  159.  b = pow(10.0,b/10.0);
  160.  return 10 * log10(a+b);
  161. }
  162. /****************************************************************
  163. *
  164. *        Fast Fourier transform of the input samples.
  165. *
  166. ****************************************************************/
  167. void II_f_f_t(sample, power)      /* this function calculates an */
  168. double FAR sample[FFT_SIZE];  /* FFT analysis for the freq.  */
  169. mask FAR power[HAN_SIZE];     /* domain                      */
  170. {
  171.  int i,j,k,L,l=0;
  172.  int ip, le, le1;
  173.  double t_r, t_i, u_r, u_i;
  174.  static int M, MM1, init = 0, N;
  175.  double *x_r, *x_i, *energy;
  176.  static int *rev;
  177.  static double *w_r, *w_i;
  178.  x_r = (double *) mem_alloc(sizeof(DFFT), "x_r");
  179.  x_i = (double *) mem_alloc(sizeof(DFFT), "x_i");
  180.  energy = (double *) mem_alloc(sizeof(DFFT), "energy");
  181.  for(i=0;i<FFT_SIZE;i++) x_r[i] = x_i[i] = energy[i] = 0;
  182.  if(!init){
  183.     rev = (int *) mem_alloc(sizeof(IFFT), "rev");
  184.     w_r = (double *) mem_alloc(sizeof(D10), "w_r");
  185.     w_i = (double *) mem_alloc(sizeof(D10), "w_i");
  186.     M = 10;
  187.     MM1 = 9;
  188.     N = FFT_SIZE;
  189.     for(L=0;L<M;L++){
  190.        le = 1 << (M-L);
  191.        le1 = le >> 1;
  192.        w_r[L] = cos(PI/le1);
  193.        w_i[L] = -sin(PI/le1);
  194.     }
  195.     for(i=0;i<FFT_SIZE;rev[i] = l,i++) for(j=0,l=0;j<10;j++){
  196.        k=(i>>j) & 1;
  197.        l |= (k<<(9-j));                
  198.     }
  199.     init = 1;
  200.  }
  201.  memcpy( (char *) x_r, (char *) sample, sizeof(double) * FFT_SIZE);
  202.  for(L=0;L<MM1;L++){
  203.     le = 1 << (M-L);
  204.     le1 = le >> 1;
  205.     u_r = 1;
  206.     u_i = 0;
  207.     for(j=0;j<le1;j++){
  208.        for(i=j;i<N;i+=le){
  209.           ip = i + le1;
  210.           t_r = x_r[i] + x_r[ip];
  211.           t_i = x_i[i] + x_i[ip];
  212.           x_r[ip] = x_r[i] - x_r[ip];
  213.           x_i[ip] = x_i[i] - x_i[ip];
  214.           x_r[i] = t_r;
  215.           x_i[i] = t_i;
  216.           t_r = x_r[ip];
  217.           x_r[ip] = x_r[ip] * u_r - x_i[ip] * u_i;
  218.           x_i[ip] = x_i[ip] * u_r + t_r * u_i;
  219.        }
  220.        t_r = u_r;
  221.        u_r = u_r * w_r[L] - u_i * w_i[L];
  222.        u_i = u_i * w_r[L] + t_r * w_i[L];
  223.     }
  224.  }
  225.  for(i=0;i<N;i+=2){
  226.     ip = i + 1;
  227.     t_r = x_r[i] + x_r[ip];
  228.     t_i = x_i[i] + x_i[ip];
  229.     x_r[ip] = x_r[i] - x_r[ip];
  230.     x_i[ip] = x_i[i] - x_i[ip];
  231.     x_r[i] = t_r;
  232.     x_i[i] = t_i;
  233.     energy[i] = x_r[i] * x_r[i] + x_i[i] * x_i[i];
  234.  }
  235.  for(i=0;i<FFT_SIZE;i++) if(i<rev[i]){
  236.     t_r = energy[i];
  237.     energy[i] = energy[rev[i]];
  238.     energy[rev[i]] = t_r;
  239.  }
  240.  for(i=0;i<HAN_SIZE;i++){    /* calculate power density spectrum */
  241.     if (energy[i] < 1E-20) energy[i] = 1E-20;
  242.     power[i].x = 10 * log10(energy[i]) + POWERNORM;
  243.     power[i].next = STOP;
  244.     power[i].type = FALSE;
  245.  }
  246.  mem_free((void **) &x_r);
  247.  mem_free((void **) &x_i);
  248.  mem_free((void **) &energy);
  249. }
  250. /****************************************************************
  251. *
  252. *         Window the incoming audio signal.
  253. *
  254. ****************************************************************/
  255. void II_hann_win(sample)          /* this function calculates a  */
  256. double FAR sample[FFT_SIZE];  /* Hann window for PCM (input) */
  257. {                                 /* samples for a 1024-pt. FFT  */
  258.  register int i;
  259.  register double sqrt_8_over_3;
  260.  static int init = 0;
  261.  static double FAR *window;
  262.  if(!init){  /* calculate window function for the Fourier transform */
  263.     window = (double FAR *) mem_alloc(sizeof(DFFT), "window");
  264.     sqrt_8_over_3 = pow(8.0/3.0, 0.5);
  265.     for(i=0;i<FFT_SIZE;i++){
  266.        /* Hann window formula */
  267.        window[i]=sqrt_8_over_3*0.5*(1-cos(2.0*PI*i/(FFT_SIZE)))/FFT_SIZE;
  268.     }
  269.     init = 1;
  270.  }
  271.  for(i=0;i<FFT_SIZE;i++) sample[i] *= window[i];
  272. }
  273. /*******************************************************************
  274. *
  275. *        This function finds the maximum spectral component in each
  276. * subband and return them to the encoder for time-domain threshold
  277. * determination.
  278. *
  279. *******************************************************************/
  280. #ifndef LONDON
  281. void II_pick_max(power, spike)
  282. double FAR spike[SBLIMIT];
  283. mask FAR power[HAN_SIZE];
  284. {
  285.  double max;
  286.  int i,j;
  287.  for(i=0;i<HAN_SIZE;spike[i>>4] = max, i+=16)      /* calculate the      */
  288.  for(j=0, max = DBMIN;j<16;j++)                    /* maximum spectral   */
  289.     max = (max>power[i+j].x) ? max : power[i+j].x; /* component in each  */
  290. }                                                  /* subband from bound */
  291.                                                    /* 4-16               */
  292. #else
  293. void II_pick_max(power, spike)
  294. double FAR spike[SBLIMIT];
  295. mask FAR power[HAN_SIZE];
  296. {
  297.  double sum;
  298.  int i,j;
  299.  for(i=0;i<HAN_SIZE;spike[i>>4] = 10.0*log10(sum), i+=16)
  300.                                                    /* calculate the      */
  301.  for(j=0, sum = pow(10.0,0.1*DBMIN);j<16;j++)      /* sum of spectral   */
  302.    sum += pow(10.0,0.1*power[i+j].x);              /* component in each  */
  303. }                                                  /* subband from bound */
  304.                                                    /* 4-16               */
  305. #endif
  306. /****************************************************************
  307. *
  308. *        This function labels the tonal component in the power
  309. * spectrum.
  310. *
  311. ****************************************************************/
  312. void II_tonal_label(power, tone)  /* this function extracts (tonal) */
  313. mask FAR power[HAN_SIZE];     /* sinusoidals from the spectrum  */
  314. int *tone;
  315. {
  316.  int i,j, last = LAST, first, run, last_but_one = LAST; /* dpwe */
  317.  double max;
  318.  *tone = LAST;
  319.  for(i=2;i<HAN_SIZE-12;i++){
  320.     if(power[i].x>power[i-1].x && power[i].x>=power[i+1].x){
  321.        power[i].type = TONE;
  322.        power[i].next = LAST;
  323.        if(last != LAST) power[last].next = i;
  324.        else first = *tone = i;
  325.        last = i;
  326.     }
  327.  }
  328.  last = LAST;
  329.  first = *tone;
  330.  *tone = LAST;
  331.  while(first != LAST){               /* the conditions for the tonal          */
  332.     if(first<3 || first>500) run = 0;/* otherwise k+/-j will be out of bounds */
  333.     else if(first<63) run = 2;       /* components in layer II, which         */
  334.     else if(first<127) run = 3;      /* are the boundaries for calc.          */
  335.     else if(first<255) run = 6;      /* the tonal components                  */
  336.     else run = 12;
  337.     max = power[first].x - 7;        /* after calculation of tonal   */
  338.     for(j=2;j<=run;j++)              /* components, set to local max */
  339.        if(max < power[first-j].x || max < power[first+j].x){
  340.           power[first].type = FALSE;
  341.           break;
  342.        }
  343.     if(power[first].type == TONE){   /* extract tonal components */
  344.        int help=first;
  345.        if(*tone==LAST) *tone = first;
  346.        while((power[help].next!=LAST)&&(power[help].next-first)<=run)
  347.           help=power[help].next;
  348.        help=power[help].next;
  349.        power[first].next=help;
  350.        if((first-last)<=run){
  351.           if(last_but_one != LAST) power[last_but_one].next=first;
  352.        }
  353.        if(first>1 && first<500){     /* calculate the sum of the */
  354.           double tmp;                /* powers of the components */
  355.           tmp = add_db(power[first-1].x, power[first+1].x);
  356.           power[first].x = add_db(power[first].x, tmp);
  357.        }
  358.        for(j=1;j<=run;j++){
  359.           power[first-j].x = power[first+j].x = DBMIN;
  360.           power[first-j].next = power[first+j].next = STOP;
  361.           power[first-j].type = power[first+j].type = FALSE;
  362.        }
  363.        last_but_one=last;
  364.        last = first;
  365.        first = power[first].next;
  366.     }
  367.     else {
  368.        int ll;
  369.        if(last == LAST); /* *tone = power[first].next; dpwe */
  370.        else power[last].next = power[first].next;
  371.        ll = first;
  372.        first = power[first].next;
  373.        power[ll].next = STOP;
  374.     }
  375.  }
  376. }
  377. /****************************************************************
  378. *
  379. *        This function groups all the remaining non-tonal
  380. * spectral lines into critical band where they are replaced by
  381. * one single line.
  382. *
  383. ****************************************************************/
  384.         
  385. void noise_label(power, noise, ltg)
  386. g_thres FAR *ltg;
  387. mask FAR *power;
  388. int *noise;
  389. {
  390.  int i,j, centre, last = LAST;
  391.  double index, weight, sum;
  392.                               /* calculate the remaining spectral */
  393.  for(i=0;i<crit_band-1;i++){  /* lines for non-tonal components   */
  394.      for(j=cbound[i],weight = 0.0,sum = DBMIN;j<cbound[i+1];j++){
  395.         if(power[j].type != TONE){
  396.            if(power[j].x != DBMIN){
  397.               sum = add_db(power[j].x,sum);
  398. /* the line below and others under the "MAKE_SENSE" condition are an alternate
  399.    interpretation of "geometric mean". This approach may make more sense but
  400.    it has not been tested with hardware. */
  401. #ifdef MAKE_SENSE
  402. /* weight += pow(10.0, power[j].x/10.0) * (ltg[power[j].map].bark-i);
  403.    bad code [SS] 21-1-93
  404.  */
  405.     weight += pow(10.0,power[j].x/10.0) * (double) (j-cbound[i]) /
  406.      (double) (cbound[i+1]-cbound[i]);  /* correction */
  407. #endif
  408.               power[j].x = DBMIN;
  409.            }
  410.         }   /*  check to see if the spectral line is low dB, and if  */
  411.      }      /* so replace the center of the critical band, which is */
  412.             /* the center freq. of the noise component              */
  413. #ifdef MAKE_SENSE
  414.      if(sum <= DBMIN)  centre = (cbound[i+1]+cbound[i]) /2;
  415.      else {
  416.         index = weight/pow(10.0,sum/10.0);
  417.         centre = cbound[i] + (int) (index * (double) (cbound[i+1]-cbound[i]) );
  418.      } 
  419. #else
  420.      index = (double)( ((double)cbound[i]) * ((double)(cbound[i+1]-1)) );
  421.      centre = (int)(pow(index,0.5)+0.5);
  422. #endif
  423.     /* locate next non-tonal component until finished; */
  424.     /* add to list of non-tonal components             */
  425. #ifdef MI_OPTION
  426.      /* Masahiro Iwadare's fix for infinite looping problem? */
  427.      if(power[centre].type == TONE) 
  428.        if (power[centre+1].type == TONE) centre++; else centre--;
  429. #else
  430.      /* Mike Li's fix for infinite looping problem */
  431.      if(power[centre].type == FALSE) centre++;
  432.      if(power[centre].type == NOISE){
  433.        if(power[centre].x >= ltg[power[i].map].hear){
  434.          if(sum >= ltg[power[i].map].hear) sum = add_db(power[j].x,sum);
  435.          else
  436.          sum = power[centre].x;
  437.        }
  438.      }
  439. #endif
  440.      if(last == LAST) *noise = centre;
  441.      else {
  442.         power[centre].next = LAST;
  443.         power[last].next = centre;
  444.      }
  445.      power[centre].x = sum;
  446.      power[centre].type = NOISE;        
  447.      last = centre;
  448.  }        
  449. }
  450. /****************************************************************
  451. *
  452. *        This function reduces the number of noise and tonal
  453. * component for further threshold analysis.
  454. *
  455. ****************************************************************/
  456. void subsampling(power, ltg, tone, noise)
  457. mask FAR power[HAN_SIZE];
  458. g_thres FAR *ltg;
  459. int *tone, *noise;
  460. {
  461.  int i, old;
  462.  i = *tone; old = STOP;    /* calculate tonal components for */
  463.  while(i!=LAST){           /* reduction of spectral lines    */
  464.     if(power[i].x < ltg[power[i].map].hear){
  465.        power[i].type = FALSE;
  466.        power[i].x = DBMIN;
  467.        if(old == STOP) *tone = power[i].next;
  468.        else power[old].next = power[i].next;
  469.     }
  470.     else old = i;
  471.     i = power[i].next;
  472.  }
  473.  i = *noise; old = STOP;    /* calculate non-tonal components for */
  474.  while(i!=LAST){            /* reduction of spectral lines        */
  475.     if(power[i].x < ltg[power[i].map].hear){
  476.        power[i].type = FALSE;
  477.        power[i].x = DBMIN;
  478.        if(old == STOP) *noise = power[i].next;
  479.        else power[old].next = power[i].next;
  480.     }
  481.     else old = i;
  482.     i = power[i].next;
  483.  }
  484.  i = *tone; old = STOP;
  485.  while(i != LAST){                              /* if more than one */
  486.     if(power[i].next == LAST)break;             /* tonal component  */
  487.     if(ltg[power[power[i].next].map].bark -     /* is less than .5  */
  488.        ltg[power[i].map].bark < 0.5) {          /* bark, take the   */
  489.        if(power[power[i].next].x > power[i].x ){/* maximum          */
  490.           if(old == STOP) *tone = power[i].next;
  491.           else power[old].next = power[i].next;
  492.           power[i].type = FALSE;
  493.           power[i].x = DBMIN;
  494.           i = power[i].next;
  495.        }
  496.        else {
  497.           power[power[i].next].type = FALSE;
  498.           power[power[i].next].x = DBMIN;
  499.           power[i].next = power[power[i].next].next;
  500.           old = i;
  501.        }
  502.     }
  503.     else {
  504.       old = i;
  505.       i = power[i].next;
  506.     }
  507.  }
  508. }
  509. /****************************************************************
  510. *
  511. *        This function calculates the individual threshold and
  512. * sum with the quiet threshold to find the global threshold.
  513. *
  514. ****************************************************************/
  515. void threshold(power, ltg, tone, noise, bit_rate)
  516. mask FAR power[HAN_SIZE];
  517. g_thres FAR *ltg;
  518. int *tone, *noise, bit_rate;
  519. {
  520.  int k, t;
  521.  double dz, tmps, vf;
  522.  for(k=1;k<sub_size;k++){
  523.     ltg[k].x = DBMIN;
  524.     t = *tone;          /* calculate individual masking threshold for */
  525.     while(t != LAST){   /* components in order to find the global     */
  526.        if(ltg[k].bark-ltg[power[t].map].bark >= -3.0 && /*threshold (LTG)*/
  527.           ltg[k].bark-ltg[power[t].map].bark <8.0){
  528.           dz = ltg[k].bark-ltg[power[t].map].bark; /* distance of bark value*/
  529.           tmps = -1.525-0.275*ltg[power[t].map].bark - 4.5 + power[t].x;
  530.              /* masking function for lower & upper slopes */
  531.           if(-3<=dz && dz<-1) vf = 17*(dz+1)-(0.4*power[t].x +6);
  532.           else if(-1<=dz && dz<0) vf = (0.4 *power[t].x + 6) * dz;
  533.           else if(0<=dz && dz<1) vf = (-17*dz);
  534.           else if(1<=dz && dz<8) vf = -(dz-1) * (17-0.15 *power[t].x) - 17;
  535.           tmps += vf;        
  536.           ltg[k].x = add_db(ltg[k].x, tmps);
  537.        }
  538.        t = power[t].next;
  539.     }
  540.     t = *noise;        /* calculate individual masking threshold  */
  541.     while(t != LAST){  /* for non-tonal components to find LTG    */
  542.        if(ltg[k].bark-ltg[power[t].map].bark >= -3.0 &&
  543.           ltg[k].bark-ltg[power[t].map].bark <8.0){
  544.           dz = ltg[k].bark-ltg[power[t].map].bark; /* distance of bark value */
  545.           tmps = -1.525-0.175*ltg[power[t].map].bark -0.5 + power[t].x;
  546.              /* masking function for lower & upper slopes */
  547.           if(-3<=dz && dz<-1) vf = 17*(dz+1)-(0.4*power[t].x +6);
  548.           else if(-1<=dz && dz<0) vf = (0.4 *power[t].x + 6) * dz;
  549.           else if(0<=dz && dz<1) vf = (-17*dz);
  550.           else if(1<=dz && dz<8) vf = -(dz-1) * (17-0.15 *power[t].x) - 17;
  551.           tmps += vf;
  552.           ltg[k].x = add_db(ltg[k].x, tmps);
  553.        }
  554.        t = power[t].next;
  555.     }
  556.     if(bit_rate<96)ltg[k].x = add_db(ltg[k].hear, ltg[k].x);
  557.     else ltg[k].x = add_db(ltg[k].hear-12.0, ltg[k].x);
  558.  }
  559. }
  560. /****************************************************************
  561. *
  562. *        This function finds the minimum masking threshold and
  563. * return the value to the encoder.
  564. *
  565. ****************************************************************/
  566. void II_minimum_mask(ltg,ltmin,sblimit)
  567. g_thres FAR *ltg;
  568. double FAR ltmin[SBLIMIT];
  569. int sblimit;
  570. {
  571.  double min;
  572.  int i,j;
  573.  j=1;
  574.  for(i=0;i<sblimit;i++)
  575.     if(j>=sub_size-1)                   /* check subband limit, and       */
  576.        ltmin[i] = ltg[sub_size-1].hear; /* calculate the minimum masking  */
  577.     else {                              /* level of LTMIN for each subband*/
  578.        min = ltg[j].x;
  579.        while(ltg[j].line>>4 == i && j < sub_size){
  580.        if(min>ltg[j].x)  min = ltg[j].x;
  581.        j++;
  582.     }
  583.     ltmin[i] = min;
  584.  }
  585. }
  586. /*****************************************************************
  587. *
  588. *        This procedure is called in musicin to pick out the
  589. * smaller of the scalefactor or threshold.
  590. *
  591. *****************************************************************/
  592. void II_smr(ltmin, spike, scale, sblimit)
  593. double FAR spike[SBLIMIT], scale[SBLIMIT], ltmin[SBLIMIT];
  594. int sblimit;
  595. {
  596.  int i;
  597.  double max;
  598.                 
  599.  for(i=0;i<sblimit;i++){                     /* determine the signal   */
  600.     max = 20 * log10(scale[i] * 32768) - 10; /* level for each subband */
  601.     if(spike[i]>max) max = spike[i];         /* for the maximum scale  */
  602.     max -= ltmin[i];                         /* factors                */
  603.     ltmin[i] = max;
  604.  }
  605. }
  606.         
  607. /****************************************************************
  608. *
  609. *        This procedure calls all the necessary functions to
  610. * complete the psychoacoustic analysis.
  611. *
  612. ****************************************************************/
  613. void II_Psycho_One(buffer, scale, ltmin, fr_ps)
  614. short FAR buffer[2][1152];
  615. double FAR scale[2][SBLIMIT], ltmin[2][SBLIMIT];
  616. frame_params *fr_ps;
  617. {
  618.  layer *info = fr_ps->header;
  619.  int   stereo = fr_ps->stereo;
  620.  int   sblimit = fr_ps->sblimit;
  621.  int k,i, tone=0, noise=0;
  622.  static char init = 0;
  623.  static int off[2] = {256,256};
  624.  double *sample;
  625.  DSBL *spike;
  626.  static D1408 *fft_buf;
  627.  static mask_ptr FAR power;
  628.  static g_ptr FAR ltg;
  629.  sample = (double *) mem_alloc(sizeof(DFFT), "sample");
  630.  spike = (DSBL *) mem_alloc(sizeof(D2SBL), "spike");
  631.      /* call functions for critical boundaries, freq. */
  632.  if(!init){  /* bands, bark values, and mapping */
  633.     fft_buf = (D1408 *) mem_alloc((long) sizeof(D1408) * 2, "fft_buf");
  634.     power = (mask_ptr FAR ) mem_alloc(sizeof(mask) * HAN_SIZE, "power");
  635.     if (info->version == MPEG_AUDIO_ID) {
  636.       read_cbound(info->lay, info->sampling_frequency);
  637.       read_freq_band(&ltg, info->lay, info->sampling_frequency);
  638.     } else {
  639.       read_cbound(info->lay, info->sampling_frequency + 4);
  640.       read_freq_band(&ltg, info->lay, info->sampling_frequency + 4);
  641.     }
  642.     make_map(power,ltg);
  643.     for (i=0;i<1408;i++) fft_buf[0][i] = fft_buf[1][i] = 0;
  644.     init = 1;
  645.  }
  646.  for(k=0;k<stereo;k++){  /* check pcm input for 3 blocks of 384 samples */
  647.     for(i=0;i<1152;i++) fft_buf[k][(i+off[k])%1408]= (double)buffer[k][i]/SCALE;
  648.     for(i=0;i<FFT_SIZE;i++) sample[i] = fft_buf[k][(i+1216+off[k])%1408];
  649.     off[k] += 1152;
  650.     off[k] %= 1408;
  651.                             /* call functions for windowing PCM samples,*/
  652.     II_hann_win(sample);    /* location of spectral components in each  */
  653.     for(i=0;i<HAN_SIZE;i++) power[i].x = DBMIN;  /*subband with labeling*/
  654.     II_f_f_t(sample, power);                     /*locate remaining non-*/
  655.     II_pick_max(power, &spike[k][0]);            /*tonal sinusoidals,   */
  656.     II_tonal_label(power, &tone);                /*reduce noise & tonal */
  657.     noise_label(power, &noise, ltg);             /*components, find     */
  658.     subsampling(power, ltg, &tone, &noise);      /*global & minimal     */
  659.     threshold(power, ltg, &tone, &noise,         /*threshold, and sgnl- */
  660.       bitrate[info->version][info->lay-1][info->bitrate_index]/stereo); /*to-mask ratio*/
  661.     II_minimum_mask(ltg, &ltmin[k][0], sblimit);
  662.     II_smr(&ltmin[k][0], &spike[k][0], &scale[k][0], sblimit);        
  663.  }
  664.  mem_free((void **) &sample);
  665.  mem_free((void **) &spike);
  666. }
  667. /**********************************************************************
  668. *
  669. *        This module implements the psychoacoustic model I for the
  670. * MPEG encoder layer I. It uses simplified tonal and noise masking
  671. * threshold analysis to generate SMR for the encoder bit allocation
  672. * routine.
  673. *
  674. **********************************************************************/
  675. /****************************************************************
  676. *
  677. *        Fast Fourier transform of the input samples.
  678. *
  679. ****************************************************************/
  680. void I_f_f_t(sample, power)         /* this function calculates */
  681. double FAR sample[FFT_SIZE/2];  /* an FFT analysis for the  */
  682. mask FAR power[HAN_SIZE/2];     /* freq. domain             */
  683. {
  684.  int i,j,k,L,l=0;
  685.  int ip, le, le1;
  686.  double t_r, t_i, u_r, u_i;
  687.  static int M, MM1, init = 0, N;
  688.  double *x_r, *x_i, *energy;
  689.  static int *rev;
  690.  static double *w_r, *w_i;
  691.  x_r = (double *) mem_alloc(sizeof(DFFT2), "x_r");
  692.  x_i = (double *) mem_alloc(sizeof(DFFT2), "x_i");
  693.  energy = (double *) mem_alloc(sizeof(DFFT2), "energy");
  694.  for(i=0;i<FFT_SIZE/2;i++) x_r[i] = x_i[i] = energy[i] = 0;
  695.  if(!init){
  696.     rev = (int *) mem_alloc(sizeof(IFFT2), "rev");
  697.     w_r = (double *) mem_alloc(sizeof(D9), "w_r");
  698.     w_i = (double *) mem_alloc(sizeof(D9), "w_i");
  699.     M = 9;
  700.     MM1 = 8;
  701.     N = FFT_SIZE/2;
  702.     for(L=0;L<M;L++){
  703.        le = 1 << (M-L);
  704.        le1 = le >> 1;
  705.        w_r[L] = cos(PI/le1);
  706.        w_i[L] = -sin(PI/le1);
  707.     }
  708.     for(i=0;i<FFT_SIZE/2;rev[i] = l,i++) for(j=0,l=0;j<9;j++){
  709.        k=(i>>j) & 1;
  710.        l |= (k<<(8-j));                
  711.     }
  712.     init = 1;
  713.  }
  714.  memcpy( (char *) x_r, (char *) sample, sizeof(double) * FFT_SIZE/2);
  715.  for(L=0;L<MM1;L++){
  716.     le = 1 << (M-L);
  717.     le1 = le >> 1;
  718.     u_r = 1;
  719.     u_i = 0;
  720.     for(j=0;j<le1;j++){
  721.        for(i=j;i<N;i+=le){
  722.           ip = i + le1;
  723.           t_r = x_r[i] + x_r[ip];
  724.           t_i = x_i[i] + x_i[ip];
  725.           x_r[ip] = x_r[i] - x_r[ip];
  726.           x_i[ip] = x_i[i] - x_i[ip];
  727.           x_r[i] = t_r;
  728.           x_i[i] = t_i;
  729.           t_r = x_r[ip];
  730.           x_r[ip] = x_r[ip] * u_r - x_i[ip] * u_i;
  731.           x_i[ip] = x_i[ip] * u_r + t_r * u_i;
  732.        }
  733.        t_r = u_r;
  734.        u_r = u_r * w_r[L] - u_i * w_i[L];
  735.        u_i = u_i * w_r[L] + t_r * w_i[L];
  736.     }
  737.  }
  738.  for(i=0;i<N;i+=2){
  739.     ip = i + 1;
  740.     t_r = x_r[i] + x_r[ip];
  741.     t_i = x_i[i] + x_i[ip];
  742.     x_r[ip] = x_r[i] - x_r[ip];
  743.     x_i[ip] = x_i[i] - x_i[ip];
  744.     x_r[i] = t_r;
  745.     x_i[i] = t_i;
  746.     energy[i] = x_r[i] * x_r[i] + x_i[i] * x_i[i];
  747.  }
  748.  for(i=0;i<FFT_SIZE/2;i++) if(i<rev[i]){
  749.     t_r = energy[i];
  750.     energy[i] = energy[rev[i]];
  751.     energy[rev[i]] = t_r;
  752.  }
  753.  for(i=0;i<HAN_SIZE/2;i++){                     /* calculate power  */
  754.     if(energy[i] < 1E-20) energy[i] = 1E-20;    /* density spectrum */
  755.        power[i].x = 10 * log10(energy[i]) + POWERNORM;
  756.        power[i].next = STOP;
  757.        power[i].type = FALSE;
  758.  }
  759.  mem_free((void **) &x_r);
  760.  mem_free((void **) &x_i);
  761.  mem_free((void **) &energy);
  762. }
  763. /****************************************************************
  764. *
  765. *         Window the incoming audio signal.
  766. *
  767. ****************************************************************/
  768. void I_hann_win(sample)             /* this function calculates a  */
  769. double FAR sample[FFT_SIZE/2];  /* Hann window for PCM (input) */
  770. {                                   /* samples for a 512-pt. FFT   */
  771.  register int i;
  772.  register double sqrt_8_over_3;
  773.  static int init = 0;
  774.  static double FAR *window;
  775.  if(!init){  /* calculate window function for the Fourier transform */
  776.     window = (double FAR *) mem_alloc(sizeof(DFFT2), "window");
  777.     sqrt_8_over_3 = pow(8.0/3.0, 0.5);
  778.     for(i=0;i<FFT_SIZE/2;i++){
  779.       /* Hann window formula */
  780.       window[i]=sqrt_8_over_3*0.5*(1-cos(2.0*PI*i/(FFT_SIZE/2)))/(FFT_SIZE/2);
  781.     }
  782.     init = 1;
  783.  }
  784.  for(i=0;i<FFT_SIZE/2;i++) sample[i] *= window[i];
  785. }
  786. /*******************************************************************
  787. *
  788. *        This function finds the maximum spectral component in each
  789. * subband and return them to the encoder for time-domain threshold
  790. * determination.
  791. *
  792. *******************************************************************/
  793. #ifndef LONDON
  794. void I_pick_max(power, spike)
  795. double FAR spike[SBLIMIT];
  796. mask FAR power[HAN_SIZE/2];
  797. {
  798.  double max;
  799.  int i,j;
  800.  /* calculate the spectral component in each subband */
  801.  for(i=0;i<HAN_SIZE/2;spike[i>>3] = max, i+=8)
  802.     for(j=0, max = DBMIN;j<8;j++) max = (max>power[i+j].x) ? max : power[i+j].x;
  803. }
  804. #else
  805. void I_pick_max(power, spike)
  806. double FAR spike[SBLIMIT];
  807. mask FAR power[HAN_SIZE];
  808. {
  809.  double sum;
  810.  int i,j;
  811.  for(i=0;i<HAN_SIZE/2;spike[i>>3] = 10.0*log10(sum), i+=8)
  812.                                                    /* calculate the      */
  813.  for(j=0, sum = pow(10.0,0.1*DBMIN);j<8;j++)       /* sum of spectral   */
  814.    sum += pow(10.0,0.1*power[i+j].x);              /* component in each  */
  815. }                                                  /* subband from bound */
  816. #endif
  817. /****************************************************************
  818. *
  819. *        This function labels the tonal component in the power
  820. * spectrum.
  821. *
  822. ****************************************************************/
  823. void I_tonal_label(power, tone)     /* this function extracts   */
  824. mask FAR power[HAN_SIZE/2];     /* (tonal) sinusoidals from */
  825. int *tone;                          /* the spectrum             */
  826. {
  827.  int i,j, last = LAST, first, run;
  828.  double max;
  829.  int last_but_one= LAST;
  830.  *tone = LAST;
  831.  for(i=2;i<HAN_SIZE/2-6;i++){
  832.     if(power[i].x>power[i-1].x && power[i].x>=power[i+1].x){
  833.        power[i].type = TONE;
  834.        power[i].next = LAST;
  835.        if(last != LAST) power[last].next = i;
  836.        else first = *tone = i;
  837.        last = i;
  838.     }
  839.  }
  840.  last = LAST;
  841.  first = *tone;
  842.  *tone = LAST;
  843.  while(first != LAST){                /* conditions for the tonal     */
  844.     if(first<3 || first>250) run = 0; /* otherwise k+/-j will be out of bounds*/
  845.     else if(first<63) run = 2;        /* components in layer I, which */
  846.     else if(first<127) run = 3;       /* are the boundaries for calc.   */
  847.     else run = 6;                     /* the tonal components          */
  848.     max = power[first].x - 7;
  849.     for(j=2;j<=run;j++)  /* after calc. of tonal components, set to loc.*/
  850.        if(max < power[first-j].x || max < power[first+j].x){   /* max   */
  851.           power[first].type = FALSE;
  852.           break;
  853.        }
  854.     if(power[first].type == TONE){    /* extract tonal components */
  855.        int help=first;
  856.        if(*tone == LAST) *tone = first;
  857.        while((power[help].next!=LAST)&&(power[help].next-first)<=run)
  858.           help=power[help].next;
  859.        help=power[help].next;
  860.        power[first].next=help;
  861.        if((first-last)<=run){
  862.           if(last_but_one != LAST) power[last_but_one].next=first;
  863.        }
  864.        if(first>1 && first<255){     /* calculate the sum of the */
  865.           double tmp;                /* powers of the components */
  866.           tmp = add_db(power[first-1].x, power[first+1].x);
  867.           power[first].x = add_db(power[first].x, tmp);
  868.        }
  869.        for(j=1;j<=run;j++){
  870.           power[first-j].x = power[first+j].x = DBMIN;
  871.           power[first-j].next = power[first+j].next = STOP; /*dpwe: 2nd was .x*/
  872.           power[first-j].type = power[first+j].type = FALSE;
  873.        }
  874.        last_but_one=last;
  875.        last = first;
  876.        first = power[first].next;
  877.     }
  878.     else {
  879.        int ll;
  880.        if(last == LAST) ; /* *tone = power[first].next; dpwe */
  881.        else power[last].next = power[first].next;
  882.        ll = first;
  883.        first = power[first].next;
  884.        power[ll].next = STOP;
  885.     }
  886.  }
  887. }                        
  888.                                 
  889. /****************************************************************
  890. *
  891. *        This function finds the minimum masking threshold and
  892. * return the value to the encoder.
  893. *
  894. ****************************************************************/
  895. void I_minimum_mask(ltg,ltmin)
  896. g_thres FAR *ltg;
  897. double FAR ltmin[SBLIMIT];
  898. {
  899.  double min;
  900.  int i,j;
  901.  j=1;
  902.  for(i=0;i<SBLIMIT;i++)
  903.     if(j>=sub_size-1)                   /* check subband limit, and       */
  904.        ltmin[i] = ltg[sub_size-1].hear; /* calculate the minimum masking  */
  905.     else {                              /* level of LTMIN for each subband*/
  906.        min = ltg[j].x;
  907.        while(ltg[j].line>>3 == i && j < sub_size){
  908.           if (min>ltg[j].x)  min = ltg[j].x;
  909.           j++;
  910.        }
  911.        ltmin[i] = min;
  912.     }
  913. }
  914. /*****************************************************************
  915. *
  916. *        This procedure is called in musicin to pick out the
  917. * smaller of the scalefactor or threshold.
  918. *
  919. *****************************************************************/
  920. void I_smr(ltmin, spike, scale)
  921. double FAR spike[SBLIMIT], scale[SBLIMIT], ltmin[SBLIMIT];
  922. {
  923.  int i;
  924.  double max;
  925.                 
  926.  for(i=0;i<SBLIMIT;i++){                      /* determine the signal   */
  927.     max = 20 * log10(scale[i] * 32768) - 10;  /* level for each subband */
  928.     if(spike[i]>max) max = spike[i];          /* for the scalefactor    */
  929.     max -= ltmin[i];
  930.     ltmin[i] = max;
  931.  }
  932. }
  933.         
  934. /****************************************************************
  935. *
  936. *        This procedure calls all the necessary functions to
  937. * complete the psychoacoustic analysis.
  938. *
  939. ****************************************************************/
  940. void I_Psycho_One(buffer, scale, ltmin, fr_ps)
  941. short FAR buffer[2][1152];
  942. double FAR scale[2][SBLIMIT], ltmin[2][SBLIMIT];
  943. frame_params *fr_ps;
  944. {
  945.  int stereo = fr_ps->stereo;
  946.  the_layer info = fr_ps->header;
  947.  int k,i, tone=0, noise=0;
  948.  static char init = 0;
  949.  static int off[2] = {256,256};
  950.  double *sample;
  951.  DSBL *spike;
  952.  static D640 *fft_buf;
  953.  static mask_ptr FAR power;
  954.  static g_ptr FAR ltg;
  955.  sample = (double *) mem_alloc(sizeof(DFFT2), "sample");
  956.  spike = (DSBL *) mem_alloc(sizeof(D2SBL), "spike");
  957.             /* call functions for critical boundaries, freq. */
  958.  if(!init){ /* bands, bark values, and mapping              */
  959.     fft_buf = (D640 *) mem_alloc(sizeof(D640) * 2, "fft_buf");
  960.     power = (mask_ptr FAR ) mem_alloc(sizeof(mask) * HAN_SIZE/2, "power");
  961.     if (info->version == MPEG_AUDIO_ID) {
  962.       read_cbound(info->lay, info->sampling_frequency);
  963.       read_freq_band(&ltg, info->lay, info->sampling_frequency);
  964.     } else {
  965.       read_cbound(info->lay, info->sampling_frequency + 4);
  966.       read_freq_band(&ltg, info->lay, info->sampling_frequency + 4);
  967.     }
  968.     make_map(power,ltg);
  969.     for(i=0;i<640;i++) fft_buf[0][i] = fft_buf[1][i] = 0;
  970.     init = 1;
  971.  }
  972.  for(k=0;k<stereo;k++){    /* check PCM input for a block of */
  973.     for(i=0;i<384;i++)     /* 384 samples for a 512-pt. FFT  */
  974.        fft_buf[k][(i+off[k])%640]= (double) buffer[k][i]/SCALE;
  975.     for(i=0;i<FFT_SIZE/2;i++)
  976.        sample[i] = fft_buf[k][(i+448+off[k])%640];
  977.     off[k] += 384;
  978.     off[k] %= 640;
  979.                         /* call functions for windowing PCM samples,   */
  980.     I_hann_win(sample); /* location of spectral components in each     */
  981.     for(i=0;i<HAN_SIZE/2;i++) power[i].x = DBMIN;   /* subband with    */
  982.     I_f_f_t(sample, power);              /* labeling, locate remaining */
  983.     I_pick_max(power, &spike[k][0]);     /* non-tonal sinusoidals,     */
  984.     I_tonal_label(power, &tone);         /* reduce noise & tonal com., */
  985.     noise_label(power, &noise, ltg);     /* find global & minimal      */
  986.     subsampling(power, ltg, &tone, &noise);  /* threshold, and sgnl-   */
  987.     threshold(power, ltg, &tone, &noise,     /* to-mask ratio          */
  988.       bitrate[info->version][info->lay-1][info->bitrate_index]/stereo);
  989.     I_minimum_mask(ltg, &ltmin[k][0]);
  990.     I_smr(&ltmin[k][0], &spike[k][0], &scale[k][0]);        
  991.  }
  992.  mem_free((void **) &sample);
  993.  mem_free((void **) &spike);
  994. }