Fast 12 bit to 16 bit sample conversion?

Peter Heitzer peter.heitzer at rz.uni-regensburg.de
Mon Jul 20 15:10:10 CEST 2015


I am currently writing a python script to extract samples from old Roland 12 bit sample
disks and save them as 16 bit wav files.

The samples are layouted as follows

0 [S0 bit 11..4] [S0 bit 3..0|S1 bit 3..0] [S1 bit 11..4]
3 [S2 bit 11..4] [S2 bit 3..0|S3 bit 3..0] [S3 bit 11..4]

In other words 
sample0=(data[0]<<4)|(data[1]>>4)
sample1=(data[2]<<4)|(data[1] & 0x0f)

I use this code for the conversion (using the struct module)

import struct
from array import array

def getWaveData(diskBuffer):
  offset=0
  words=array('H')
  for i in range(len(diskBuffer)/3):
    h0=struct.unpack_from('>h',diskBuffer,offset)
    h1=struct.unpack_from('<h',diskBuffer,offset+1)
    words.append(h0[0] & 0xfff0)
    words.append(h1[0] & 0xfff0)
    offset+=3
  return words

I unpack the samples in an array of unsigned shorts for I later can use the byteswap() method
if the code is running on a big endian machine.

What options using pure python do I have to make the conversion faster?
I thought of unpacking more bytes at once e.g. using a format '>hxhxhxhx' for 4 even samples
and '<xhxhxhxh' for 4 odd samples vice versa.
Can I map the '& 0xfff0' to the whole array?




More information about the Python-list mailing list