Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.python > #94235

Re: Fast 12 bit to 16 bit sample conversion?

Subject Re: Fast 12 bit to 16 bit sample conversion?
References <d14a9iF9nfgU1@mid.individual.net>
From MRAB <python@mrabarnett.plus.com>
Date 2015-07-20 15:43 +0100
Newsgroups comp.lang.python
Message-ID <mailman.787.1437403400.3674.python-list@python.org> (permalink)

Show all headers | View raw


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
> 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):

If the 2 12-bit values are [0xABC, 0xDEF], the bytes will be [0xAB, 
0xCF, 0xDE].

>      h0=struct.unpack_from('>h',diskBuffer,offset)

This gives 0xABCF, which is ANDed to give 0xABC0. Good.

>      h1=struct.unpack_from('<h',diskBuffer,offset+1)

This gives 0xDECF, which is ANDed to give 0xDEC0. Not what you want.

>      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.

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.

Back to comp.lang.python | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

Fast 12 bit to 16 bit sample conversion? "Peter Heitzer" <peter.heitzer@rz.uni-regensburg.de> - 2015-07-20 13:10 +0000
  Re: Fast 12 bit to 16 bit sample conversion? MRAB <python@mrabarnett.plus.com> - 2015-07-20 15:43 +0100
    Re: Fast 12 bit to 16 bit sample conversion? "Peter Heitzer" <peter.heitzer@rz.uni-regensburg.de> - 2015-07-20 15:23 +0000
  Re: Fast 12 bit to 16 bit sample conversion? edmondo.giovannozzi@gmail.com - 2015-07-20 08:14 -0700
  Re: Fast 12 bit to 16 bit sample conversion? Mark Lawrence <breamoreboy@yahoo.co.uk> - 2015-07-21 03:45 +0100

csiph-web