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 来提取位平面。
我正在尝试对 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 来提取位平面。