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

mpeg/mp3

开发平台:

C/C++

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