# getid3_ac3::heavyCompression

## #Syntax Syntax

getid3_ac3::heavyCompression( int \$compre )

\$compre

(int) (Required)

(float|int)

## #Source Source

```	 *
* @return float|int
*/
public static function heavyCompression(\$compre) {
// The first four bits indicate gain changes in 6.02dB increments which can be
// implemented with an arithmetic shift operation. The following four bits
// indicate linear gain changes, and require a 5-bit multiply.
// We will represent the two 4-bit fields of compr as follows:
//   X0 X1 X2 X3 . Y4 Y5 Y6 Y7
// The meaning of the X values is most simply described by considering X to represent a 4-bit
// signed integer with values from -8 to +7. The gain indicated by X is then (X + 1) * 6.02 dB. The
// following table shows this in detail.

// Meaning of 4 msb of compr
//  7    +48.16 dB
//  6    +42.14 dB
//  5    +36.12 dB
//  4    +30.10 dB
//  3    +24.08 dB
//  2    +18.06 dB
//  1    +12.04 dB
//  0     +6.02 dB
// -1         0 dB
// -2     -6.02 dB
// -3    -12.04 dB
// -4    -18.06 dB
// -5    -24.08 dB
// -6    -30.10 dB
// -7    -36.12 dB
// -8    -42.14 dB

if (\$fourbit == '1') {
\$log_gain = -8 + bindec(substr(\$fourbit, 1));
} else {
\$log_gain = bindec(substr(\$fourbit, 1));
}
\$log_gain = (\$log_gain + 1) * getid3_lib::RGADamplitude2dB(2);

// The value of Y is a linear representation of a gain change of up to -6 dB. Y is considered to
// be an unsigned fractional integer, with a leading value of 1, or: 0.1 Y4 Y5 Y6 Y7 (base 2). Y can
// represent values between 0.111112 (or 31/32) and 0.100002 (or 1/2). Thus, Y can represent gain
// changes from -0.28 dB to -6.02 dB.

\$lin_gain = (16 + (\$compre & 0x0F)) / 32;

// The combination of X and Y values allows compr to indicate gain changes from
//  48.16 - 0.28 = +47.89 dB, to
// -42.14 - 6.02 = -48.16 dB.
```