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

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