2017-02-24 84 views
0

我正在处理WMSN中的错误控制。我想通过具有错误概率p的二进制对称信道传输视频。所以我在每个GOP中都有一个矩阵显示的帧(图像)。将十进制值转换为二进制

每个矩阵元素都有十进制值,可能是正数或负数。如解释here我需要将整个矩阵转换为二进制流。我用

reshape(dec2bin(typecast(b,'uint8'),8).',1,[])

转换元件,以二进制流,但我不能回去使用

typecast(uint8(bin2dec(reshape(m,8,[]).')),'double')的确切人数。另一方面,我认为为了获得正确的误码率,我必须将整个矩阵转换为一个比特流,我不知道该怎么做。并将它们再次转换为图像的测量值矩阵。

+0

我想你需要'米=重塑(DEC2BIN(类型转换(二(:), 'UINT8'),8)。',1,[])',然后用'重塑转换回(如果从此注释中粘贴,请注意可能不需要的零宽度字符最后一个逗号) –

+0

@LuisMendo感谢您的回答。但有错误'输入字符在MATLAB语句或表达式中无效'。 – Hanna

+0

正如我在之前的评论中所述,某些不需要的零宽度字符以某种方式蠕变。我已经发布了它作为答案,这可以避免那 –

回答

0

我想你需要

m = reshape(dec2bin(typecast(b(:),'uint8'),8).',1,[]); 

注意,此读取Matlab的标准矩阵,column-major订单(下降,然后在)。

然后你就可以转换回来

b_recovered = reshape(typecast(uint8(bin2dec(reshape(m,8,[]).')),'double'),size(b)); 

由于typecast转换数据类型在不改变基础数据,这个过程需要不会损失精度。例如,

>> b = randn(2,3) 
b = 
    -0.241247174335006 0.540703471823211 0.526269662140438 
    0.908207564087271 -0.507829312416083 -1.067884765919437 

>> m = reshape(dec2bin(typecast(b(:),'uint8'),8).',1,[]) 
m = 
101100101011100000000010111110100010111111100001110011101011111101001010100000100011011101001111000010010001000011101101001111110010100100001111000010100101111001110001010011011110000100111111001011101101111100011000010000100010001101000000111000001011111100010010101001010111100001111001001100111101011111100000001111110101110001010100000110000101011000001110000101101111000110111111 

>> b_recovered = reshape(typecast(uint8(bin2dec(reshape(m,8,[]).')),'double'),size(b)) 
b_recovered = 
    -0.241247174335006 0.540703471823211 0.526269662140438 
    0.908207564087271 -0.507829312416083 -1.067884765919437 

>> b==b_recovered 
ans = 
    2×3 logical array 
    1 1 1 
    1 1 1 
>> 
+0

我可以在恢复的十进制数更精确吗? – Hanna

+0

@Hanna没有精度损失。请参阅编辑答案 –

+0

我需要知道MSB在转换后的位置。我用很多数字对它进行了测试,但我无法理解它是如何工作的。例如1变成了'0000000000000000000000000000000000000000000000001111000010111111' – Hanna