Decoding Bitstream


  1. syncword=0xfff constant 12 bits
  2. ID=1 constant 1 bit
  3. layer 2 bits, 00=reserved,01=Layer 3,10=Layer 2, 11=Layer 1
  4. protection_bit 1 bit
  5. 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]
  6. sampling_frequency 2 bits. 0=44.1 kiloHertz, 1=48 kHz, 2=32 kHz, 3=reserved
  7. padding_bit 1 bit
  8. private_bit 1 bit
  9. mode 2 bits
  10. mode_extension 2 bits
  11. copyright 1 bit
  12. original 1 bit
  13. emphasis 2 bits

Audio Data

Layer I Audio Data

Three arrays are stored in the audio data:

  1. allocation[channel,subband] The allocation array that determines the number of bits allocated for samples in each channel and subband
  2. scaleindex[channel,subband] The scalefactor array that determines the scaling that is applied to the subband
  3. 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 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)
  • 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)
    • for subband in bound..31:
      • if(allocation[0,subband]>0):
        • sample[0,subband,sample_n) = getbits(allocation[channel,subband]+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.

$ fractionalizednumber=\frac{s}{2.0^{numberbits-1}}+adder $ $ sample = (2.0^{1.0-scaleindex/3.0})*\frac{2.0^{numberbits}}{2^{numberbits}-1}*\left(fractionalizednumber+2.0^{-numberbits+1}\right) $

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 $ s*20*e^{-(l/112)^2}*sin(l*pi*2/112)/l $ 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.


#!/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"

hex_file = open(sys.argv[1],"rt")
binary_file = open(sys.argv[2],"wb")

queue = ""
char = " "
while len(char) > 0:
    if len(queue) == 2:
        queue = ""
    char =
    if "0" <= char <= "9" or "A" <= char <= "F":
        queue += char