Python: как объединить два подписанных массива int16 в один без переполнения - PullRequest
0 голосов
/ 27 сентября 2019

У меня есть несколько потоков int16 в строках, и я хочу, чтобы они суммировались вместе (без переполнения) и возвращали его как строку int16.Фон смешивает несколько волновых файлов в один поток.

decodeddata1 = numpy.fromstring(data, numpy.int16)
decodeddata2 = numpy.fromstring(data2, numpy.int16)
newdata = decodeddata1 + decodeddata2
return newdata.tostring()

Есть ли способ сделать это с помощью numpy или есть другая библиотека?

Обработка каждого отдельного значения в python слишком медленная и приводит к результатамв заикании.

Самая важная вещь - это производительность, так как этот код используется в методе обратного вызова, подающем аудио.

@ edit:

test input data:
a = np.int16([20000,20000,-20000,-20000])
b = np.int16([10000,20000,-10000,-20000])
print a + b -->   [ 30000 -25536 -30000  25536]

но я хочучтобы сохранить максимальные уровни: [30000 40000 -30000 -40000]

1 Ответ

1 голос
/ 28 сентября 2019

Очевидным следствием смешения двух сигналов с динамическим диапазоном -32768<x<32767 является результирующий сигнал с диапазоном -65537<x<65536 - для его представления требуется 17 бит.

Чтобы избежать ограничения, вам нужно будет масштабировать входы - очевидный способ - разделить сумму (или оба входа) на 2.

numpy взглядыкак и предполагалось, это должно быть достаточно быстрым для этого - по крайней мере, быстрее, чем встроенный в Python целочисленный тип переменного размера.Если дополнительная арифметика связана с производительностью, вам следует подумать о выборе языка.

...