如何修改有符号数的后3位

How to modify the last 3 bits of signed numbers

当我在图像上应用函数 dwt2() 时,我得到了四个子带系数。通过选择四个子带中的任何一个,我使用带符号数的二维矩阵。

在这个矩阵的每个值中,我想在最后 3 个最低有效位中嵌入 3 位信息,即十进制数字 0 到 7。但是,当我处理负数时,我不知道该怎么做。如何修改系数?

首先,你想使用一个Integer Wavelet Transform,所以你只需要处理整数。这将允许您在两个空格之间进行无损转换,而无需舍入浮点数。

在整数中嵌入位对于二元运算来说是一个简单的问题。通常,您要使用模式

(number AND mask) OR bits

bitwise AND operation clears out the desired bits of number, which are specified by mask. For example, if number is an 8-bit number and we want to zero out the last 3 bits, we'll use the mask 11111000. After the desired bits of our number have been cleared, we can substitute them for the bits we want to embed using the bitwise OR操作。

接下来,你需要知道有符号数是如何represented in binary的。请务必阅读二进制补码部分。我们可以看到,如果要清除最后 3 位,我们要使用掩码 ...11111000,它始终为 -8。这与我们是否使用 8、16、32 或 64 位来表示我们的有符号数无关。通常,如果要清除有符号数的最后 k 位,掩码必须是 -2^k.

让我们用一个简单的例子把所有的东西放在一起。首先,我们为系数子带和嵌入比特流生成一些数字。由于系数值可以取 [-510, 510] 中的任何值,我们将使用 'int16' 进行运算。比特流是 [0, 7] 范围内的数字数组,因为这是 [000, 111] 的十进制范围。

>> rng(4)
>> coeffs = randi(1021, [4 4]) - 511

coeffs =

   477   202  -252   371
    48  -290   -67   494
   483   486   285  -343
   219  -504  -309    99

>> bitstream = randi(8, [1 10]) - 1

bitstream =

     0     3     0     7     3     7     6     6     1     0

我们通过覆盖必要的系数来嵌入比特流。

>> coeffs(1:numel(bitstream)) = bitor(bitand(coeffs(1:numel(bitstream)), -8, 'int16'), bitstream, 'int16')

coeffs =

   472   203  -255   371
    51  -289   -72   494
   480   486   285  -343
   223  -498  -309    99

然后我们可以使用简单的掩码 ...00000111 = 7 来提取比特流。

>> bitand(coeffs(1:numel(bitstream)), 7, 'int16')

ans =

     0     3     0     7     3     7     6     6     1     0