首页 > 解决方案 > Python:如何将两个有符号 int16 数组相加为一个而不会溢出

问题描述

我在字符串中有几个 int16 流,我希望它们相加(没有溢出)并将其作为 int16 字符串返回。背景是将多个波形文件混合到一个流中。

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

有没有办法用 numpy 做到这一点,还是有另一个库?

在 python 中处理每个单个值太慢并导致口吃。

最重要的是性能,因为此代码用于提供音频的回调方法中。

@编辑:

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]

标签: pythonperformancenumpyaudiowav

解决方案


将两个信号与动态范围混合在一起的明显结果-32768<x<32767是产生范围为的信号-65537<x<65536- 这需要17位来表示它。

为避免削波,您需要对输入进行增益缩放 - 显而易见的方法是将总和(或两个输入)除以2.

numpy看起来它应该非常快 - 至少比 python 的内置可变大小整数类型快。如果附加算术是性能问题,您应该考虑您选择的语言。


推荐阅读