Как правильно расшифровать.wav с Python
Я кодирую базовый частотный анализ волновых аудиофайлов, но у меня возникают проблемы, когда речь заходит о преобразовании волновых кадров в целочисленные.
Вот соответствующая часть моего кода:
import wave
track = wave.open('/some_path/my_audio.wav', 'r')
byt_depth = track.getsampwidth() #Byte depth of the file in BYTES
frame_rate = track.getframerate()
buf_size = 512
def byt_sum (word):
#convert a string of n bytes into an int in [0;8**n-1]
return sum( (256**k)*word[k] for k in range(len(word)) )
raw_buf = track.readframes(buf_size)
'''
One frame is a string of n bytes, where n = byt_depth.
For instance, with a 24bits-encoded file, track.readframe(1) could be:
b'xffxfexfe'.
raw_buf[n] returns an int in [0;255]
'''
sample_buf = [byt_sum(raw_buf[byt_depth*k:byt_depth*(k+1)])
- 2**(8*byt_depth-1) for k in range(buf_size)]
Проблема заключается в следующем: когда я строю sample_buf
для одного синусоидального сигнала, я получаю
альтернативный, разрушенный синусоидальный сигнал .
Я не могу понять, почему сигнал перекрывает UDP-вниз.
Есть идеи?
P.S.: Так как я француз, мой английский довольно неуверенный. Не стесняйтесь редактировать, если есть ужасные ошибки.2 ответа:
Это может быть потому, что вам нужно использовать беззнаковое значение для представления 16-битных образцов. См. https://en.wikipedia.org/wiki/Pulse-code_modulation
Попробуйте добавить 32767 к каждому образцу.
Также вы должны использовать python struct module для декодирования буфера.
import struct buff_size = 512 # 'H' is for unsigned 16 bit integer, try 'h' also sample_buff = struct.unpack('H'*buf_size, raw_buf)
Самый простой способ-использовать библиотеку, которая выполняет декодирование за вас. Есть несколько доступных библиотек Python, Мой любимый модульsoundfile :
import soundfile as sf signal, samplerate = sf.read('/some_path/my_audio.wav')