Scratchpad

If you are new to Scratchpad, and want full access as a Scratchpad editor, create an account!
If you already have an account, log in and have fun!!

READ MORE

Scratchpad
Advertisement

Decoding Bitstream[]

Header[]

  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.

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[]



#!/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()
Advertisement