Joe Veldhuis wrote: > Hello all. I'm writing a program that needs to capture audio from a > soundcard and run FFTs to determine peak frequency for further processing. > The soundcard's native capture format is 16-bit little-endian signed > integer samples (values 0-65535), and of course the FFT function requires > floating-point values (-1.0 - +1.0). > > So, what is the most efficient way to do the necessary conversion? I'm > using the pyalsaaudio module to access the soundcard, if it matters.
Using numpy should be pretty efficient. Assuming you get your data as a bytestring: >>> import numpy >>> data = "\x00\x80\x00\x00\xff\x7f" >>> a = numpy.fromstring(data, dtype="<h") >>> a array([-32768, 0, 32767], dtype=int16) >>> a/32768. array([-1. , 0. , 0.99996948]) Or, if you don't find the half-open interval acceptable: >>> (a+.5)/32767.5 array([ -1.00000000e+00, 1.52590219e-05, 1.00000000e+00]) If you want to use the full interval and avoid moving the origin: >>> (a>0)*a/32767.+(a<0)*a/32768. array([-1., 0., 1.]) (There may be a better way as I'm not very familiar with numpy and found the above by trial and error) Peter _______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: http://mail.python.org/mailman/listinfo/tutor