【问题标题】:Python: How to sum two signed int16 arrays into one without overflowPython:如何将两个带符号的 int16 数组相加为一个而不会溢出
【发布时间】:2019-09-27 11:12:53
【问题描述】:

我在字符串中有几个 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]

【问题讨论】:

  • 您能否提供一些示例输入和预期输出数据?
  • 所以你想用剪裁求和?
  • 但这没有多大意义,int16 的最大值是 32767,你不会有 40000 作为 int16

标签: python performance numpy audio wav


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    • 2019-06-26
    相关资源
    最近更新 更多