python - 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]
解决方案
将两个信号与动态范围混合在一起的明显结果-32768<x<32767
是产生范围为的信号-65537<x<65536
- 这需要17
位来表示它。
为避免削波,您需要对输入进行增益缩放 - 显而易见的方法是将总和(或两个输入)除以2
.
numpy
看起来它应该非常快 - 至少比 python 的内置可变大小整数类型快。如果附加算术是性能问题,您应该考虑您选择的语言。
推荐阅读
- redux - Flutter Redux Middleware
- asp.net-identity - 使用 Identity Server 4 和 Identity 简化 OIDC
- wordpress - Custom Post Type Slug clash
- javascript - ES6 class inheritance without "extends" keyword
- jquery - 在滚动问题上添加类
- angular - 重复的 RxJS 导入警告
- html - Razor Page 和 Bootstrap,链接之间没有空格
- python - 如何使用 XlsxWriter 将多种格式添加到相同的文本
- java - 未找到 AWS S3 凭证提供程序(Java 开发工具包)
- asp.net - Docker for Windows 为 COPY 添加前缀`/var/lib/docker/tmp/`?