用matlab进行定点二元运算

fixed point binary operation with matlab

我有这些十进制值:

x1=-43.00488
x4=11.5048
y1=-11.5048
y4=-43.004  

我将它们转换为相等的二进制值,格式为 Q7.10

所以,这些是二进制值:

% 所有二进制值均已签名并采用 Q7.10 格式。

x1=1010100_1111111011   
x4=0001011_1000000101
y1=1110100_0111111011
y4=1010100_1111111011

我想在 matlab 中用二进制值做这个操作:

%这一行等于将“((x1-x4) / (y1-y4))”乘以2^10;

 x1x4_div_y1y4 = ((x1-x4) / (y1-y4)) << 10  

在尝试执行此操作时遇到了一些困难,

首先,我无法在 Matlab 中声明负二进制值。 其次,我们是否可以对二进制值进行数学运算,还是应该对十进制值进行运算,然后将它们转换为二进制值?

但是我需要的是用二进制操作来完成这个操作,这样我就可以在verilog hdl中实现它。

  a= ((-43.00488-11.5048) / (-11.5048+43.00488))*(2^10)

a =

  -1.7720e+03

我不确定这些陈述是否给出了正确的答案。我应该将它乘以 2^10 左右吗...

我想用二进制值做同样的操作。我可以在 Matlab 中这样做吗?以及如何做到这一点?

提前谢谢你。

你的问题不是很清楚。我认为您可能需要考虑您希望 x1x4_div_y1y4 的定点格式是什么。我不确定你是否真的想乘以 2^10,或者你只是因为认为你需要这样做。

但是,既然你说这是你想做的操作,我假设你真的想乘以 2^10。

下面的代码将二进制数转换为定点数,进行您想要的计算,然后将结果转换回二进制。

您的小数结果 (-1772) 是正确的。您只需要将其转换回带符号的二进制文件。但是要小心,因为这个数字不能用 Q7.10 格式表示(因为你乘以 2^10,所以现在它太大了)。

在下面的代码中,我只是假设您需要带符号的 Q16.8 格式的结果(我将其解释为 1 个符号位 + 16 个整数位 + 8 个小数位)。如果你想要不同的东西,你可以改变这些数字。

close all; clear all; clc;

% All of  the binary values are signed and in Q7.10 format.
x1 = '10101001111111011';
x4 = '00010111000000101';
y1 = '11101000111111011';
y4 = '10101001111111011';

% Convert to signed integers
x1 = -bin2dec(x1(1))*2^16 + bin2dec(x1(2:end));
x4 = -bin2dec(x4(1))*2^16 + bin2dec(x4(2:end));
y1 = -bin2dec(y1(1))*2^16 + bin2dec(y1(2:end));
y4 = -bin2dec(y4(1))*2^16 + bin2dec(y4(2:end));

% Convert from integer to fixed point values
x1 = x1 / 2^10;
x4 = x4 / 2^10;
y1 = y1 / 2^10;
y4 = y4 / 2^10;

% The operation I want to do
x1x4_div_y1y4 = ((x1-x4) / (y1-y4)) * 2^10; % << 10

% Convert back to binary...

% Let's assume we want signed Q16.8 output
INTEGER_BITS = 16;
FRACTIONAL_BITS = 8;

% Convert from fixed-point to integer
x1x4_div_y1y4 = round(x1x4_div_y1y4 * 2^FRACTIONAL_BITS);

% Handle the sign bit
if x1x4_div_y1y4 < 0
    x1x4_div_y1y4 = x1x4_div_y1y4 + 2*2^(INTEGER_BITS + FRACTIONAL_BITS);
end

% Convert to binary
x1x4_div_y1y4 = dec2bin(x1x4_div_y1y4, 1+INTEGER_BITS+FRACTIONAL_BITS)