16 位二进制补码有符号整数信号数据的位平面分解?

Bitplane decomposition of 16 bit two's complement signed integer signal data?

我正在尝试对 python 中的 16 位二进制补码有符号整数信号数据(心电图)进行位平面分解,因此我将得到 16 位信号数据位平面。我知道如何分解一个 8 位无符号整数图像信号,并且我重新实现了这个问题中的代码。我认为我应该得到其值包含负值的位平面数据,因为它最初是一个 16 位有符号整数,但我得到的结果是 16 位无符号整数信号而不是 16 位有符号整数信号。
这是我的代码:

import numpy as np
def intToTcbin16(value):
    return format(value % (1 << 16), '016b')
def Tcbin16ToInt(bin):
    while len(bin)<16 :
            bin = '0'+bin
    if bin[0] == '0':
            return int(bin, 2)
    else:
            return -1 * (int(''.join('1' if x == '0' else '0' for x in bin), 2) + 1)
def bitplanedecomposesignal(ecgdat):
    lst = []
    for j in range(len(ecgdat)):
        lst.append(intToTcbin16(ecgdat[j]))
    sixteen = (np.array([Tcbin16ToInt(i[0]) for i in lst],dtype = np.int16)*32768)
    fiveteen = (np.array([Tcbin16ToInt(i[1]) for i in lst],dtype = np.int16)*16384)
    fourteen = (np.array([Tcbin16ToInt(i[2]) for i in lst],dtype = np.int16)*8192)
    thirteen = (np.array([Tcbin16ToInt(i[3]) for i in lst],dtype = np.int16)*4096)
    twelve = (np.array([Tcbin16ToInt(i[4]) for i in lst],dtype = np.int16)*2048)
    eleven = (np.array([Tcbin16ToInt(i[5]) for i in lst],dtype = np.int16)*1024)
    ten = (np.array([Tcbin16ToInt(i[6]) for i in lst],dtype = np.int16)*512)
    nine = (np.array([Tcbin16ToInt(i[7]) for i in lst],dtype = np.int16)*256)
    eight = (np.array([Tcbin16ToInt(i[8]) for i in lst],dtype = np.int16)*128)
    seven = (np.array([Tcbin16ToInt(i[9]) for i in lst],dtype = np.int16)*64)
    six = (np.array([Tcbin16ToInt(i[10]) for i in lst],dtype = np.int16)*32)
    five = (np.array([Tcbin16ToInt(i[11]) for i in lst],dtype = np.int16)*16)
    four = (np.array([Tcbin16ToInt(i[12]) for i in lst],dtype = np.int16)*8)
    three = (np.array([Tcbin16ToInt(i[13]) for i in lst],dtype = np.int16)*4)
    two = (np.array([Tcbin16ToInt(i[14]) for i in lst],dtype = np.int16)*2)
    one = (np.array([Tcbin16ToInt(i[15]) for i in lst],dtype = np.int16)*1)
    return sixteen,fiveteen,fourteen,thirteen,twelve,eleven,ten,nine,eight,seven,six,five,four,three,two,one

这是分解前的信号图:

例如,这是分解后的第16位平面信号图:

我做错了什么?如何做对?以及如何重新组合?

sixteen 行中,将 32768 更改为 -32768。其他一切看起来都不错。

如您所说,现有 bitplanedecomposesignal() 代码的平面将值重构为无符号 16 位数据而不是有符号数据。但是,如果最高有效位打开,则表示的值为负,我们应该从无符号值中减去 2^16 = 65536。所以最高位应该贡献 32768 - 65536 = -32768 而不是 +32768.

示例:

value = −32700 decimal
      = 1000000001000100 binary int16
        ↑        ↑   ↑
       −2^15   2^6   2^2

       −2^15 + 2^6 + 2^2 = −32700 decimal = value

旁注:Numpy 具有您可能会觉得有用的高效按位函数。我会考虑使用 np.bitwise_and 来提取位平面。