首页 > 解决方案 > 在 MATLAB 中将二进制数据读取为三个 UBYTE(8 位无符号字节)并使用位移运算符得到两个 12 位流

问题描述

我需要在 MATLAB 中将数据读取为 UBYTE(8 位无符号字节),然后使用位移运算符获得两个 12 位流,样本数为 3600000。我必须通过一个命令来做到这一点,即前 3 个 UBYTE 中包含前两个 12 位值,第一个字节中的 8 位,第二个字节中的前 4 位,然后是字节 2 中的前 4 位,所有 8字节 3 中的位。然后该过程重复接下来的 3 个字节(字节 4-6 等),依此类推。

第一个 12 位值:字节 1 |+ (( 字节 2 & 0xf0) << 4)

第二个 12 位值: (( byte 2 & 0xf) << 4) |+ ((byte 3 & 0xf0) >> 4) |+ ((byte 3 & 0xf) << 8)

如何在MATLAB中应用此命令?

标签: matlabbit-shift8-bit

解决方案


如果我理解正确,那么这样的事情可能会起作用:

% Some data for testing
data = randi([0, 256], 1, 9, 'uint8');

% Reshape data so two 12-bit values are in each column
data = reshape(data, 3, []);

m1 = uint16(hex2dec('0f'));
m2 = uint16(hex2dec('f0'));

first_values = uint16(data(1, :)) + bitshift(bitand(uint16(data(2, :)), m2), 4);
second_values = bitshift(bitand(uint16(data(2, :)), m1), 4) ...
  + bitshift(bitand(uint16(data(3, :)), m2), -4) ...
  + bitshift(bitand(uint16(data(3, :)), m1), 8);

我可能在掩码上犯了一个错误,但是bitshiftandbitand命令可能是您正在寻找的。

输出是 unit16 的两个数组。如果您需要输出为 12 位类型,我不确定如何在 matlab 中最好地做到这一点。


推荐阅读