Как сохранить только 12 наиболее значимых бит 16-битных аудиоданных PCM? - PullRequest
0 голосов
/ 21 января 2019

Я пытаюсь выяснить, как уменьшить разрядность 16-битного файла WAV до 12 бит путем усечения данных и отбрасывания 4 младших значащих бит.Мое лучшее предположение заключается в том, что мне нужно преобразовать данные (которые, как представляется, в виде короткого целого числа со знаком) в 16-разрядное без знака и сдвинуть биты вправо на 4, а затем преобразовать обратно в короткое.

Но я действительно запутался в том, как это реализовать, я новичок в концепциях Python и DSP, поэтому, пожалуйста, потерпите меня.

import array
import numpy as np
import struct
from pydub import AudioSegment

sound = AudioSegment.from_file("original.wav")

# get raw data from the wav file
samples = sound.get_array_of_samples()
bitSamples = []

# iterate over the data
for i in range (0, len(samples)):
    # convert to 16bit (?)
    sixteen = struct.unpack('H', struct.pack('h', samples[i]))
    # bitwise right shift
    twelve = np.right_shift(sixteen, 4)
    # populate new array
    bitSamples.append(twelve)

shifted_samples_array = array.array(sound.array_type, bitSamples)

new_sound = sound._spawn(shifted_samples_array)
new_sound.export("out-depth.wav", format="wav")

Вот что я пробовал,но все, что, кажется, делает, это резко увеличивает громкость звука и делает его звучание крайне искаженным.

Чего я ожидаю достичь, так это в основном просто уменьшенный динамический диапазон (то есть промежуточное звено между 8-битным и 16-битным качеством звука).

Заранее благодарим за любую помощь.

...