Более быстрый способ преобразования из 24-битного формата wav pcm в формат с плавающей запятой?

Мне нужно прочитать данные из wav-файла в 24-битном формате PCM и преобразовать в float. Я использую Python 2.7.2.

Пакет волны считывает данные в виде строки, поэтому я пробовал:

import wave
import numpy as np
import array
import struct

f = wave.open('filename.wav')
# read in entire wav file
wdata = f.readframes(nFrames) 
f.close()

# unpack into signed integers and convert to float      
data = array.array('f')
for i in range(0,nFrames*3,3):
    data.append(float(struct.unpack('<i', '\x00'+ wdata[i:i+3])[0]))

# normalize sample values
data = np.array(data)
data = data / 0x800000

Это немного быстрее, чем мои предыдущие подходы, но все же довольно медленно. Может ли кто-нибудь предложить более эффективный метод?


person LMO    schedule 19.03.2012    source источник
comment
Очевидно, у вас есть NumPy. Почему бы не использовать его до конца?   -  person Ignacio Vazquez-Abrams    schedule 20.03.2012


Ответы (1)


Это кажется довольно быстрым, он обрабатывает 24-битные значения и выполняет нормализацию:

from scikits.audiolab import Sndfile
import numpy as np

f = Sndfile(fname, 'r')
data = np.array(f.read_frames(f.nframes), dtype=np.float64)
f.close()
return data
person LMO    schedule 20.03.2012
comment
Вам не нужно преобразовывать в np.array, потому что read_frames() уже возвращает np.array. Вы даже можете указать аргумент dtype, но имейте в виду, что в настоящее время (версия 0.11.0) существует ошибка, если вы используете тип, отличный от np.float64: github.com/cournape/audiolab/issues/3 - person Matthias; 06.11.2013
comment
scikits.audiolab похоже больше не поддерживается. В качестве альтернативы (скорее всего, такой же быстрой) вы можете попробовать PySoundFile. - person Matthias; 17.09.2015