## Decoding Bitstream

### Header

- syncword=0xfff constant 12 bits
- ID=1 constant 1 bit
- layer 2 bits, 00=reserved,01=Layer 3,10=Layer 2, 11=Layer 1
- protection_bit 1 bit
- bitrate_index 4 bits. kbits/s. 0 is variable bit rate, 0xf is forbidden. Otherwise unsigned int value b. Layer 1=b*32 kbits/s, Layer 2={32,48,56,64,80,96,112,128,160,192,224,256,320,384}[b-1],Layer 3={32,40,48,56,64,80,96,112,128,160,192,224,256,320}[b-1]
- sampling_frequency 2 bits. 0=44.1 kiloHertz, 1=48 kHz, 2=32 kHz, 3=reserved
- padding_bit 1 bit
- private_bit 1 bit
- mode 2 bits
- mode_extension 2 bits
- copyright 1 bit
- original 1 bit
- emphasis 2 bits

### Audio Data

#### Layer I Audio Data

Three arrays are stored in the audio data:

- allocation[channel,subband] The allocation array that determines the number of bits allocated for samples in each channel and subband
- scaleindex[channel,subband] The scalefactor array that determines the scaling that is applied to the subband
- sample[channel,subband,sample_n] Is the actual data used for later decoding of the data

The number of subbands is always 32, the number of sample_n is 12, and the number of channels is determined by the mode in the header (?how?). getbits is a procedure that returns the unsigned int value of the number of bits, and advances the file pointer.

- number_channels determined by header information
- bound determined by header information
- for subband in 0..bound-1:
- for channel in 0..number_channels-1:
- allocation[channel,subband] = getbits(4)

- for channel in 0..number_channels-1:
- for subband in bound..31:
- allocation[0,subband] = getbits(4)

- for subband in 0..31:
- for channel in 0..number_channels-1:
- if(allocation[channel,subband]>0):
- scaleindex[channel,subband] = getbits(6)

- if(allocation[channel,subband]>0):

- for channel in 0..number_channels-1:
- for sample_n in 0..11:
- for subband in 0..bound-1:
- for channel in 0..number_channels-1:
- if(allocation[channel,subband] > 0:
- sample[channel,subband,sample_n] = getbits(allocation[channel,subband]+1)

- if(allocation[channel,subband] > 0:

- for channel in 0..number_channels-1:
- for subband in bound..31:
- if(allocation[0,subband]>0):
- sample[0,subband,sample_n) = getbits(allocation[channel,subband]+1)

- if(allocation[0,subband]>0):

- for subband in 0..bound-1:

## Requantization of Samples

### Layer 1

First the numberbits of bits are gotten from the stream based on the number specified in the audio data. These are converted to a fractionalizednumber, which is then converted to a sample number. The numbers are stored as a sign bit (which gives adder=-1 if the bit = 1, and adder=0 if the sign bit = 0), and a integer s which together are used to get the fractionalized number.

In the above, numberbits is the number of bits in s plus the sign bit (and this ranges from 2 to 15), adder is -1 if the sign bit is set, and 0 otherwise, s is the unsigned integer value of the nb-1 bits after the sign bit, and sample is the end result.

## Synthesis Subband Filter

First the 32 new samples are gotten from the previous algorithm and put in the array S.

Then, the vector V is shifted (Note: array slices are in python format array[start:end+1]):

V[64:1023] = V[0:959]

V is initialized to zero at the start of a frame.

Figure out V[0:64]:

for i in 0..63: sum = 0 for k in 0..31: sum = sum + S[k]*cos((16+i)*(2*k+1)*pi/64) V[i] = sum

Figure out the 512 element U array:

for i in 0..7: U[i*64:i*64+32] = V[i*128:i*128+32] U[i*64+32:i*64+64] = V[i*128+96:i*128+128]

Figure out the 512 element W array:

for i in 0..512: W[i] = U[i]*D[i]

D is a table that can be gotten the iso software simulation zip (see references) in audio/tables/dewindow. The equation is something like where l=i-256 and s is either 1 or -1 and alternates sign every 64 numbers.

Figure out the 32 element SF array:

for j in 0..31: sum = 0 for i in 0..15: sum = sum + W[j+32*i] SF[j] = sum

The SF array is the final samples for output.

## References

- ISO/IEC 11172-3-1993 standard ANSI store ISO store
- ISO's sample implementation
- Layer II audio sample implementation
- Sample MPEG-1 Audio Layer I,II,and III files for testing implementations
- Description of Pseudo QMF Cosine Modulation Filter

#!/usr/bin/env python # Program to convert ISO's hex file examples to binary files. import sys if len(sys.argv) != 3: print sys.argv[0]," hex_file binary_file" sys.exit(-1) hex_file = open(sys.argv[1],"rt") binary_file = open(sys.argv[2],"wb") queue = "" char = " " while len(char) > 0: if len(queue) == 2: binary_file.write(chr(int(queue,16))) queue = "" char = hex_file.read(1) if "0" <= char <= "9" or "A" <= char <= "F": queue += char binary_file.close()