0

我想为我的 uint16 信号添加噪声,但我想避免溢出,以防某些信号值为零:

np.seterr(all='raise')
noise = np.random.normal(0,2,9*9).reshape(9,9)
noise = np.around(noise,out=noise)
noise = noise.astype(np.uint16,copy=True)
signal = np.zeros((9,9), dtype=np.uint16)
try:
    signal += noise
except FloatingPointError:
    print("Overflow Detected")
    # Handle overflows
print(test)

不幸的是,没有提出例外。文档中的示例有效。

>>> np.int16(32000) * np.int16(3)
---------------------------------------------------------------------------
FloatingPointError                        Traceback (most recent call last)
<ipython-input-84-5e468485740e> in <module>
----> 1 np.int16(32000) * np.int16(3)

有没有办法为 uint16 添加启用异常?

或者是否有一种有效的方法来检查不涉及逐个元素遍历数组的溢出?

4

1 回答 1

0

Numpy 支持广播比较运算符。因此,可以通过检查结果中的非法值来解决问题。在我的情况下,信号实际上是 12 位的,所以上面的任何值2**12-1都必须来自溢出。

noise = np.random.normal(0,2,9*9).reshape(9,9)
noise = np.around(noise,out=noise)
noise = noise.astype(np.uint16,copy=True)
test = np.zeros((9,9), dtype=np.uint16)
test += noise
check = test > 2**12-1
if check.any():
    print("Overflow detected")

如果您有实际的 16 位值,则可以在 32 位数组中执行算术运算(例如加法);然后,您可以以相同的方式检查非法值。

您还可以使用np.where()立即处理溢出:

np.where(a > OVERFLOW_BOUNDARY, f(a), a)

请注意,您可能希望在处理函数中区分溢出和下溢。

于 2021-01-26T13:06:40.060 回答