PSY.C
上传用户:dshsh2009
上传日期:2007-01-07
资源大小:155k
文件大小:18k
源码类别:

mpeg/mp3

开发平台:

Unix_Linux

  1. /**********************************************************************
  2. Copyright (c) 1991 MPEG/audio software simulation group, All Rights Reserved
  3. psy.c
  4. **********************************************************************/
  5. /**********************************************************************
  6.  * MPEG/audio coding/decoding software, work in progress              *
  7.  *   NOT for public distribution until verified and approved by the   *
  8.  *   MPEG/audio committee.  For further information, please contact   *
  9.  *   Davis Pan, 508-493-2241, e-mail: pan@3d.enet.dec.com             *
  10.  *                                                                    *
  11.  * VERSION 3.9                                                        *
  12.  *   changes made since last update:                                  *
  13.  *   date   programmers         comment                               *
  14.  * 2/25/91  Davis Pan           start of version 1.0 records          *
  15.  * 5/10/91  W. Joseph Carter    Ported to Macintosh and Unix.         *
  16.  * 7/10/91  Earle Jennings      Ported to MsDos.                      *
  17.  *                              replace of floats with FLOAT          *
  18.  * 2/11/92  W. Joseph Carter    Fixed mem_alloc() arg for "absthr".   *
  19.  * 7/24/92  M. Iwadare          HANN window coefficients modified.    *
  20.  * 7/27/92  Masahiro Iwadare    Bug fix, FFT modification for Layer 3 *
  21.  * 7/27/92  Masahiro Iwadare    Bug fix, "new", "old", and "oldest"   *
  22.  *                              updates                               *
  23.  * 8/07/92  Mike Coleman        Bug fix, read_absthr()                *
  24.  **********************************************************************/
  25. #include "common.h"
  26. #include "encoder.h"
  27. void psycho_anal(buffer,savebuf,chn,lay,snr32,sfreq)
  28. short int *buffer;
  29. short int savebuf[1056];
  30. int   chn, lay;
  31. FLOAT snr32[32];
  32. double sfreq;        /* to match prototype : float args are always double */
  33. {
  34.  unsigned int   i, j, k;
  35.  FLOAT          r_prime, phi_prime;
  36.  FLOAT          freq_mult, bval_lo, minthres, sum_energy;
  37.  double         tb, temp1, temp2, temp3;
  38. /* The static variables "r", "phi_sav", "new", "old" and "oldest" have    */
  39. /* to be remembered for the unpredictability measure.  For "r" and        */
  40. /* "phi_sav", the first index from the left is the channel select and     */
  41. /* the second index is the "age" of the data.                             */
  42.  static int     new = 0, old = 1, oldest = 0;
  43.  static int     init = 0, flush, sync_flush, syncsize, sfreq_idx;
  44. /* The following static variables are constants.                           */
  45.  static double  nmt = 5.5;
  46.  static FLOAT   crit_band[27] = {0,  100,  200, 300, 400, 510, 630,  770,
  47.                                920, 1080, 1270,1480,1720,2000,2320, 2700,
  48.                               3150, 3700, 4400,5300,6400,7700,9500,12000,
  49.                              15500,25000,30000};
  50.  static FLOAT   bmax[27] = {20.0, 20.0, 20.0, 20.0, 20.0, 17.0, 15.0,
  51.                             10.0,  7.0,  4.4,  4.5,  4.5,  4.5,  4.5,
  52.                              4.5,  4.5,  4.5,  4.5,  4.5,  4.5,  4.5,
  53.                              4.5,  4.5,  4.5,  3.5,  3.5,  3.5};
  54. /* The following pointer variables point to large areas of memory         */
  55. /* dynamically allocated by the mem_alloc() function.  Dynamic memory     */
  56. /* allocation is used in order to avoid stack frame or data area          */
  57. /* overflow errors that otherwise would have occurred at compile time     */
  58. /* on the Macintosh computer.                                             */
  59.  FLOAT          *grouped_c, *grouped_e, *nb, *cb, *ecb, *bc;
  60.  FLOAT          *wsamp_r, *wsamp_i, *phi, *energy;
  61.  FLOAT          *c, *fthr;
  62.  F32            *snrtmp;
  63.  static int     *numlines;
  64.  static int     *partition;
  65.  static FLOAT   *cbval, *rnorm;
  66.  static FLOAT   *window;
  67.  static FLOAT   *absthr;
  68.  static double  *tmn;
  69.  static FCB     *s;
  70.  static FHBLK   *lthr;
  71.  static F2HBLK  *r, *phi_sav;
  72. /* These dynamic memory allocations simulate "automatic" variables        */
  73. /* placed on the stack.  For each mem_alloc() call here, there must be    */
  74. /* a corresponding mem_free() call at the end of this function.           */
  75.  grouped_c = (FLOAT *) mem_alloc(sizeof(FCB), "grouped_c");
  76.  grouped_e = (FLOAT *) mem_alloc(sizeof(FCB), "grouped_e");
  77.  nb = (FLOAT *) mem_alloc(sizeof(FCB), "nb");
  78.  cb = (FLOAT *) mem_alloc(sizeof(FCB), "cb");
  79.  ecb = (FLOAT *) mem_alloc(sizeof(FCB), "ecb");
  80.  bc = (FLOAT *) mem_alloc(sizeof(FCB), "bc");
  81.  wsamp_r = (FLOAT *) mem_alloc(sizeof(FBLK), "wsamp_r");
  82.  wsamp_i = (FLOAT *) mem_alloc(sizeof(FBLK), "wsamp_i");
  83.  phi = (FLOAT *) mem_alloc(sizeof(FBLK), "phi");
  84.  energy = (FLOAT *) mem_alloc(sizeof(FBLK), "energy");
  85.  c = (FLOAT *) mem_alloc(sizeof(FHBLK), "c");
  86.  fthr = (FLOAT *) mem_alloc(sizeof(FHBLK), "fthr");
  87.  snrtmp = (F32 *) mem_alloc(sizeof(F2_32), "snrtmp");
  88.  if(init==0){
  89. /* These dynamic memory allocations simulate "static" variables placed    */
  90. /* in the data space.  Each mem_alloc() call here occurs only once at     */
  91. /* initialization time.  The mem_free() function must not be called.      */
  92.      numlines = (int *) mem_alloc(sizeof(ICB), "numlines");
  93.      partition = (int *) mem_alloc(sizeof(IHBLK), "partition");
  94.      cbval = (FLOAT *) mem_alloc(sizeof(FCB), "cbval");
  95.      rnorm = (FLOAT *) mem_alloc(sizeof(FCB), "rnorm");
  96.      window = (FLOAT *) mem_alloc(sizeof(FBLK), "window");
  97.      absthr = (FLOAT *) mem_alloc(sizeof(FHBLK), "absthr");
  98.      tmn = (double *) mem_alloc(sizeof(DCB), "tmn");
  99.      s = (FCB *) mem_alloc(sizeof(FCBCB), "s");
  100.      lthr = (FHBLK *) mem_alloc(sizeof(F2HBLK), "lthr");
  101.      r = (F2HBLK *) mem_alloc(sizeof(F22HBLK), "r");
  102.      phi_sav = (F2HBLK *) mem_alloc(sizeof(F22HBLK), "phi_sav");
  103.      i = sfreq + 0.5;
  104.      switch(i){
  105.         case 32000: sfreq_idx = 0; break;
  106.         case 44100: sfreq_idx = 1; break;
  107.         case 48000: sfreq_idx = 2; break;
  108.         default:    printf("error, invalid sampling frequency: %d Hzn",i);
  109.         exit(-1);
  110.      }
  111.      printf("absthr[][] sampling frequency index: %dn",sfreq_idx);
  112.      read_absthr(absthr, sfreq_idx);
  113.      if(lay==1){
  114.         flush = 384;
  115.         syncsize = 1024;
  116.         sync_flush = 576;
  117.      }
  118.      else {
  119.         flush = 384*3.0/2.0;
  120.         syncsize = 1056;
  121.         sync_flush = syncsize - flush;
  122.      }
  123. /* calculate HANN window coefficients */
  124. /*   for(i=0;i<BLKSIZE;i++)window[i]=0.5*(1-cos(2.0*PI*i/(BLKSIZE-1.0))); */
  125.      for(i=0;i<BLKSIZE;i++)window[i]=0.5*(1-cos(2.0*PI*(i-0.5)/BLKSIZE));
  126. /* reset states used in unpredictability measure */
  127.      for(i=0;i<HBLKSIZE;i++){
  128.         r[0][0][i]=r[1][0][i]=r[0][1][i]=r[1][1][i]=0;
  129.         phi_sav[0][0][i]=phi_sav[1][0][i]=0;
  130.         phi_sav[0][1][i]=phi_sav[1][1][i]=0;
  131.         lthr[0][i] = 60802371420160.0;
  132.         lthr[1][i] = 60802371420160.0;
  133.      }
  134. /*****************************************************************************
  135.  * Initialization: Compute the following constants for use later             *
  136.  *    partition[HBLKSIZE] = the partition number associated with each        *
  137.  *                          frequency line                                   *
  138.  *    cbval[CBANDS]       = the center (average) bark value of each          *
  139.  *                          partition                                        *
  140.  *    numlines[CBANDS]    = the number of frequency lines in each partition  *
  141.  *    tmn[CBANDS]         = tone masking noise                               *
  142.  *****************************************************************************/
  143. /* compute fft frequency multiplicand */
  144.      freq_mult = sfreq/BLKSIZE;
  145.  
  146. /* calculate fft frequency, then bval of each line (use fthr[] as tmp storage)*/
  147.      for(i=0;i<HBLKSIZE;i++){
  148.         temp1 = i*freq_mult;
  149.         j = 1;
  150.         while(temp1>crit_band[j])j++;
  151.         fthr[i]=j-1+(temp1-crit_band[j-1])/(crit_band[j]-crit_band[j-1]);
  152.      }
  153.      partition[0] = 0;
  154. /* temp2 is the counter of the number of frequency lines in each partition */
  155.      temp2 = 1;
  156.      cbval[0]=fthr[0];
  157.      bval_lo=fthr[0];
  158.      for(i=1;i<HBLKSIZE;i++){
  159.         if((fthr[i]-bval_lo)>0.33){
  160.            partition[i]=partition[i-1]+1;
  161.            cbval[partition[i-1]] = cbval[partition[i-1]]/temp2;
  162.            cbval[partition[i]] = fthr[i];
  163.            bval_lo = fthr[i];
  164.            numlines[partition[i-1]] = temp2;
  165.            temp2 = 1;
  166.         }
  167.         else {
  168.            partition[i]=partition[i-1];
  169.            cbval[partition[i]] += fthr[i];
  170.            temp2++;
  171.         }
  172.      }
  173.      numlines[partition[i-1]] = temp2;
  174.      cbval[partition[i-1]] = cbval[partition[i-1]]/temp2;
  175.  
  176. /************************************************************************
  177.  * Now compute the spreading function, s[j][i], the value of the spread-*
  178.  * ing function, centered at band j, for band i, store for later use    *
  179.  ************************************************************************/
  180.      for(j=0;j<CBANDS;j++){
  181.         for(i=0;i<CBANDS;i++){
  182.            temp1 = (cbval[i] - cbval[j])*1.05;
  183.            if(temp1>=0.5 && temp1<=2.5){
  184.               temp2 = temp1 - 0.5;
  185.               temp2 = 8.0 * (temp2*temp2 - 2.0 * temp2);
  186.            }
  187.            else temp2 = 0;
  188.            temp1 += 0.474;
  189.            temp3 = 15.811389+7.5*temp1-17.5*sqrt((double) (1.0+temp1*temp1));
  190.            if(temp3 <= -100) s[i][j] = 0;
  191.            else {
  192.               temp3 = (temp2 + temp3)*LN_TO_LOG10;
  193.               s[i][j] = exp(temp3);
  194.            }
  195.         }
  196.      }
  197.   /* Calculate Tone Masking Noise values */
  198.      for(j=0;j<CBANDS;j++){
  199.         temp1 = 15.5 + cbval[j];
  200.         tmn[j] = (temp1>24.5) ? temp1 : 24.5;
  201.   /* Calculate normalization factors for the net spreading functions */
  202.         rnorm[j] = 0;
  203.         for(i=0;i<CBANDS;i++){
  204.            rnorm[j] += s[j][i];
  205.         }
  206.      }
  207.      init++;
  208.  }
  209.  
  210. /************************* End of Initialization *****************************/
  211.  switch(lay) {
  212.   case 1:
  213.   case 2:
  214.      for(i=0; i<lay; i++){
  215. /*****************************************************************************
  216.  * Net offset is 480 samples (1056-576) for layer 2; this is because one must*
  217.  * stagger input data by 256 samples to synchronize psychoacoustic model with*
  218.  * filter bank outputs, then stagger so that center of 1024 FFT window lines *
  219.  * up with center of 576 "new" audio samples.                                *
  220.  *                                                                           *
  221.  * For layer 1, the input data still needs to be staggered by 256 samples,   *
  222.  * then it must be staggered again so that the 384 "new" samples are centered*
  223.  * in the 1024 FFT window.  The net offset is then 576 and you need 448 "new"*
  224.  * samples for each iteration to keep the 384 samples of interest centered   *
  225.  *****************************************************************************/
  226.         for(j=0; j<syncsize; j++){
  227.            if(j<(sync_flush))savebuf[j] = savebuf[j+flush];
  228.            else savebuf[j] = *buffer++;
  229.            if(j<BLKSIZE){
  230. /**window data with HANN window***********************************************/
  231.               wsamp_r[j] = window[j]*((FLOAT) savebuf[j]);
  232.               wsamp_i[j] = 0;
  233.            }
  234.         }
  235. /**Compute FFT****************************************************************/
  236.         fft(wsamp_r,wsamp_i,energy,phi,1024);
  237. /*****************************************************************************
  238.  * calculate the unpredictability measure, given energy[f] and phi[f]        *
  239.  *****************************************************************************/
  240. /*only update data "age" pointers after you are done with both channels      */
  241. /*for layer 1 computations, for the layer 2 double computations, the pointers*/
  242. /*are reset automatically on the second pass                                 */
  243.          if(lay==2 || (lay==1 && chn==0) ){
  244.            if(new==0){new = 1; oldest = 1;}
  245.            else {new = 0; oldest = 0;}
  246.            if(old==0)old = 1; else old = 0;
  247.         }
  248.         for(j=0; j<HBLKSIZE; j++){
  249.            r_prime = 2.0 * r[chn][old][j] - r[chn][oldest][j];
  250.            phi_prime = 2.0 * phi_sav[chn][old][j] - phi_sav[chn][oldest][j];
  251.            r[chn][new][j] = sqrt((double) energy[j]);
  252.            phi_sav[chn][new][j] = phi[j];
  253. temp1=r[chn][new][j] * cos((double) phi[j]) - r_prime * cos((double) phi_prime);
  254. temp2=r[chn][new][j] * sin((double) phi[j]) - r_prime * sin((double) phi_prime);
  255.            temp3=r[chn][new][j] + fabs((double)r_prime);
  256.            if(temp3 != 0)c[j]=sqrt(temp1*temp1+temp2*temp2)/temp3;
  257.            else c[j] = 0;
  258.         }
  259. /*****************************************************************************
  260.  * Calculate the grouped, energy-weighted, unpredictability measure,         *
  261.  * grouped_c[], and the grouped energy. grouped_e[]                          *
  262.  *****************************************************************************/
  263.         for(j=1;j<CBANDS;j++){
  264.            grouped_e[j] = 0;
  265.            grouped_c[j] = 0;
  266.         }
  267.         grouped_e[0] = energy[0];
  268.         grouped_c[0] = energy[0]*c[0];
  269.         for(j=1;j<HBLKSIZE;j++){
  270.            grouped_e[partition[j]] += energy[j];
  271.            grouped_c[partition[j]] += energy[j]*c[j];
  272.         }
  273. /*****************************************************************************
  274.  * convolve the grouped energy-weighted unpredictability measure             *
  275.  * and the grouped energy with the spreading function, s[j][k]               *
  276.  *****************************************************************************/
  277.         for(j=0;j<CBANDS;j++){
  278.            ecb[j] = 0;
  279.            cb[j] = 0;
  280.            for(k=0;k<CBANDS;k++){
  281.               if(s[j][k] != 0.0){
  282.                  ecb[j] += s[j][k]*grouped_e[k];
  283.                  cb[j] += s[j][k]*grouped_c[k];
  284.               }
  285.            }
  286.            if(ecb[j] !=0)cb[j] = cb[j]/ecb[j];
  287.            else cb[j] = 0;
  288.         }
  289. /*****************************************************************************
  290.  * Calculate the required SNR for each of the frequency partitions           *
  291.  *         this whole section can be accomplished by a table lookup          *
  292.  *****************************************************************************/
  293.         for(j=0;j<CBANDS;j++){
  294.            if(cb[j]<.05)cb[j]=0.05;
  295.            else if(cb[j]>.5)cb[j]=0.5;
  296.            tb = -0.434294482*log((double) cb[j])-0.301029996;
  297.            bc[j] = tmn[j]*tb + nmt*(1.0-tb);
  298.            k = cbval[j] + 0.5;
  299.            bc[j] = (bc[j] > bmax[k]) ? bc[j] : bmax[k];
  300.            bc[j] = exp((double) -bc[j]*LN_TO_LOG10);
  301.         }
  302. /*****************************************************************************
  303.  * Calculate the permissible noise energy level in each of the frequency     *
  304.  * partitions. Include absolute threshold and pre-echo controls              *
  305.  *         this whole section can be accomplished by a table lookup          *
  306.  *****************************************************************************/
  307.         for(j=0;j<CBANDS;j++)
  308.            if(rnorm[j] && numlines[j])
  309.               nb[j] = ecb[j]*bc[j]/(rnorm[j]*numlines[j]);
  310.            else nb[j] = 0;
  311.         for(j=0;j<HBLKSIZE;j++){
  312. /*temp1 is the preliminary threshold */
  313.            temp1=nb[partition[j]];
  314.            temp1=(temp1>absthr[j])?temp1:absthr[j];
  315. /*do not use pre-echo control for layer 2 because it may do bad things to the*/
  316. /*  MUSICAM bit allocation algorithm                                         */
  317.            if(lay==1){
  318.               fthr[j] = (temp1 < lthr[chn][j]) ? temp1 : lthr[chn][j];
  319.               temp2 = temp1 * 0.00316;
  320.               fthr[j] = (temp2 > fthr[j]) ? temp2 : fthr[j];
  321.            }
  322.            else fthr[j] = temp1;
  323.            lthr[chn][j] = LXMIN*temp1;
  324.         }
  325. /*****************************************************************************
  326.  * Translate the 512 threshold values to the 32 filter bands of the coder    *
  327.  *****************************************************************************/
  328.         for(j=0;j<193;j += 16){
  329.            minthres = 60802371420160.0;
  330.            sum_energy = 0.0;
  331.            for(k=0;k<17;k++){
  332.               if(minthres>fthr[j+k])minthres = fthr[j+k];
  333.               sum_energy += energy[j+k];
  334.            }
  335.            snrtmp[i][j/16] = sum_energy/(minthres * 17.0);
  336.            snrtmp[i][j/16] = 4.342944819 * log((double)snrtmp[i][j/16]);
  337.         }
  338.         for(j=208;j<(HBLKSIZE-1);j += 16){
  339.            minthres = 0.0;
  340.            sum_energy = 0.0;
  341.            for(k=0;k<17;k++){
  342.               minthres += fthr[j+k];
  343.               sum_energy += energy[j+k];
  344.            }
  345.            snrtmp[i][j/16] = sum_energy/minthres;
  346.            snrtmp[i][j/16] = 4.342944819 * log((double)snrtmp[i][j/16]);
  347.         }
  348. /*****************************************************************************
  349.  * End of Psychoacuostic calculation loop                                    *
  350.  *****************************************************************************/
  351.      }
  352.      for(i=0; i<32; i++){
  353.         if(lay==2)
  354.            snr32[i]=(snrtmp[0][i]>snrtmp[1][i])?snrtmp[0][i]:snrtmp[1][i];
  355.         else snr32[i]=snrtmp[0][i];
  356.      }
  357.      break;
  358.   case 3:
  359.      printf("layer 3 is not currently supportedn");
  360.      break;
  361.   default:
  362.      printf("error, invalid MPEG/audio coding layer: %dn",lay);
  363.  }
  364. /* These mem_free() calls must correspond with the mem_alloc() calls     */
  365. /* used at the beginning of this function to simulate "automatic"        */
  366. /* variables placed on the stack.                                        */
  367.  mem_free((void **) &grouped_c);
  368.  mem_free((void **) &grouped_e);
  369.  mem_free((void **) &nb);
  370.  mem_free((void **) &cb);
  371.  mem_free((void **) &ecb);
  372.  mem_free((void **) &bc);
  373.  mem_free((void **) &wsamp_r);
  374.  mem_free((void **) &wsamp_i);
  375.  mem_free((void **) &phi);
  376.  mem_free((void **) &energy);
  377.  mem_free((void **) &c);
  378.  mem_free((void **) &fthr);
  379.  mem_free((void **) &snrtmp);
  380. }
  381. /******************************************************************************
  382. routine to read in absthr table from a file.
  383. ******************************************************************************/
  384. void read_absthr(absthr, table)
  385. FLOAT *absthr;
  386. int table;
  387. {
  388.  FILE *fp;
  389.  long j,index;
  390.  float a;
  391.  char t[80];
  392.  char ta[16];
  393.  strcpy( ta, "absthr_0" );
  394.  
  395.  switch(table){
  396.     case 0 : ta[7] = '0';
  397.              break;
  398.     case 1 : ta[7] = '1';
  399.              break;
  400.     case 2 : ta[7] = '2';
  401.              break;
  402.     default : printf("absthr table: Not valid table numbern");
  403.  }
  404.  if(!(fp = OpenTableFile(ta) ) ){
  405.     printf("Please check %s tablen", ta);
  406.     exit(1);
  407.  }
  408.  fgets(t, 150, fp);
  409.  sscanf(t, "table %ld", &index);
  410.  if(index != table){
  411.     printf("error in absthr table %s",ta);
  412.     exit(1);
  413.  }
  414.  for(j=0; j<HBLKSIZE; j++){
  415.     fgets(t,80,fp);
  416.     sscanf(t,"%f", &a);
  417.     absthr[j] =  a;
  418.  }
  419.  fclose(fp);
  420. }