Fast 12 bit to 16 bit sample conversion?
python at mrabarnett.plus.com
Mon Jul 20 16:43:16 CEST 2015
On 2015-07-20 14:10, Peter Heitzer wrote:
> 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
> sample1=(data<<4)|(data & 0x0f)
> I use this code for the conversion (using the struct module)
> import struct
> from array import array
> def getWaveData(diskBuffer):
> for i in range(len(diskBuffer)/3):
If the 2 12-bit values are [0xABC, 0xDEF], the bytes will be [0xAB,
This gives 0xABCF, which is ANDed to give 0xABC0. Good.
This gives 0xDECF, which is ANDed to give 0xDEC0. Not what you want.
> words.append(h0 & 0xfff0)
> words.append(h1 & 0xfff0)
> 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.
You could try using lookup tables to decode even-numbered and
odd-numbered pairs of bytes.
> Can I map the '& 0xfff0' to the whole array?
That's something the numpy could do.
More information about the Python-list