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

Posted

技术标签:

【中文标题】16位二进制补码有符号整数信号数据的位平面分解?【英文标题】:Bitplane decomposition of 16 bit two's complement signed integer signal data? 【发布时间】:2021-03-27 08:27:03 【问题描述】:

我正在尝试在 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 位平面信号图:

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

【问题讨论】:

【参考方案1】:

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 来提取位平面。

【讨论】:

以上是关于16位二进制补码有符号整数信号数据的位平面分解?的主要内容,如果未能解决你的问题,请参考以下文章

整数编码

数电:原码反码补码以及运算中的位宽问题

剑指offer-11-二进制中1的个数

c++中的位运算计算问题

原始数据类型

计算机实现32位整数加减乘除的方法