如何在MATLAB中编码/解码复数到比特流?

时间:2016-02-19 20:25:05

标签: matlab compression complex-numbers bitstream

如何将像0.0332815625326639 + 0.000694052654051097i之类的复数压缩到比特流中,然后对其进行解码以获得相同的数字?

1 个答案:

答案 0 :(得分:0)

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

  1. 分开实部和虚部。
  2. 使用num2hex将数字转换为十六进制表示形式,并将每个字符用作一行(将其转置为.')。
  3. 使用hex2dec将每一行转换为小数。这是下一步所必需的。
  4. 使用dec2bin为每个小数创建二进制表示。我们需要将最小长度设置为4,因为十六进制中的一个字符占用4位。
  5. 将每行的值放在一起。现在我们已经将十六进制字符串转换为长度为64的二进制表示。
  6. 在实部之后附加虚部,它给出了长度为128的比特流。
  7. 解码比特流并获取号码,您可以撤消上述步骤:

    1. 将比特流拆分为两个长度为64的长度。第一个是实部(1:64),第二个代表虚部(65:128)。
    2. 重塑字符串以形成四个字符的行。
    3. 使用bin2dec将行转换为十进制数。
    4. 使用dec2hex将十进制数转换为十六进制数。
    5. 使用hex2num将十六进制字符串转换回原始数字。
    6. 使用complex获取由实部和虚部组成的复数。您也可以使用realpart+imagpart*i
    7. 现在让我们看看所有这些的代码:

      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