function psycho_loudness_approx(energy, gfc) {
	        var loudness_power = 0.0;
	        /* apply weights to power in freq. bands */
	        for (var i = 0; i < Encoder.BLKSIZE / 2; ++i)
	            loudness_power += energy[i] * gfc.ATH.eql_w[i];
	        loudness_power *= VO_SCALE;

	        return loudness_power;
	    }
<PRE>
      L3psycho_anal.  Compute psycho acoustics.

      Data returned to the calling program must be delayed by one
      granule.

      This is done in two places.
      If we do not need to know the blocktype, the copying
      can be done here at the top of the program: we copy the data for
      the last granule (computed during the last call) before it is
      overwritten with the new data.  It looks like this:

      0. static psymodel_data
      1. calling_program_data = psymodel_data
      2. compute psymodel_data

      For data which needs to know the blocktype, the copying must be
      done at the end of this loop, and the old values must be saved:

      0. static psymodel_data_old
      1. compute psymodel_data
      2. compute possible block type of this granule
      3. compute final block type of previous granule based on #2.
      4. calling_program_data = psymodel_data_old
      5. psymodel_data_old = psymodel_data
    psycho_loudness_approx
      jd - 2001 mar 12
   in:  energy   - BLKSIZE/2 elements of frequency magnitudes ^ 2
        gfp      - uses out_samplerate, ATHtype (also needed for ATHformula)
   returns: loudness^2 approximation, a positive value roughly tuned for a value
            of 1.0 for signals near clipping.
   notes:   When calibrated, feeding this function binary white noise at sample
            values +32767 or -32768 should return values that approach 3.
            ATHformula is used to approximate an equal loudness curve.
   future:  Data indicates that the shape of the equal loudness curve varies
            with intensity.  This function might be improved by using an equal
            loudness curve shaped for typical playback levels (instead of the
            ATH, that is shaped for the threshold).  A flexible realization might
            simply bend the existing ATH curve to achieve the desired shape.
            However, the potential gain may not be enough to justify an effort.
</PRE>