0

如何将复数压缩0.0332815625326639 + 0.000694052654051097i成比特流,然后对其进行解码以取回相同的数字?

4

1 回答 1

0

生成比特流,您可以使用以下方法:

  1. 分离实部和虚部。
  2. 将数字转换为其十六进制表示,num2hex并将每个字符用作一行(用 转置.')。
  3. 用 将每一行转换为小数hex2dec。这是下一步所需要的。
  4. 用 为每个小数创建二进制表示dec2bin。我们需要将最小长度设置为 4,因为十六进制中的一个字符占用 4 位。
  5. 将每一行的值一个接一个。现在我们已经将十六进制字符串转换为长度为 64 的二进制表示。
  6. 在实部之后附加虚部,得到长度为 128 的比特流。

解码比特流并取回数字,您可以颠倒上述步骤:

  1. 将比特流分成两个长度为 64 的垃圾。第一个是实部 ( 1:64),第二个表示虚部 ( 65:128)。
  2. 重塑字符串以形成四个字符的行。
  3. 使用 将行转换为十进制数bin2dec
  4. 使用 .将十进制数转换为十六进制表示dec2hex
  5. 使用 将十六进制字符串转换回原始数字hex2num
  6. 用于complex获得由实部和虚部组成的复数。你也可以用realpart+imagpart*i

现在让我们看看所有这些的代码:

function the_demo

x = 0.0332815625326639 + 0.000694052654051097i;

bitstream = cb_encode(x)
value = cb_decode(bitstream)

check = x-value    % see if we succeeded


function bin = cb_encode(x)
a1 = dec2bin(hex2dec(num2hex(real(x)).'),4);
a2 = dec2bin(hex2dec(num2hex(imag(x)).'),4);
bin = [reshape(a1.',1,[]),reshape(a2.',1,[])];

function y = cb_decode(bin)
b1 = reshape(bin(1:64),4,[]).';
b1 = hex2num(dec2hex(bin2dec(b1)).');
b2 = reshape(bin(65:128),4,[]).';
b2 = hex2num(dec2hex(bin2dec(b2)).');
y = complex(b1,b2);

运行它,给出以下输出:

>> the_demo
bitstream =
00111111101000010000101001000111111011010100011001101111101000000011111101000110101111100010001010111001101101011000000000110010
value =
   0.0333 + 0.0007i
check =
     0
于 2016-02-20T21:57:16.060 回答