【问题标题】:fixed point binary operation with matlabmatlab定点二元运算
【发布时间】:2021-05-21 23:06:54
【问题描述】:

我有这些十进制值:

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 中做到这一点吗?以及如何做到这一点?

提前谢谢你。

【问题讨论】:

  • 第一步看起来不对劲。在二进制中,x1 是一个负数,但在十进制中它写为正数43.00488
  • 另外,这部分不是有效的 MATLAB 代码:// &lt;&lt; 2^10。你的意思是这是评论吗?如果是这样,请使用% 开始评论。另外,如果你想说“左移 10 位”,那么应该是 &lt;&lt; 10 而不是 &lt;&lt; 2^10
  • @Harry 我修好了。
  • @harry 是的,我的意思是作为评论。应该是“%”对不起。你是如何在 cmets 中制作 x1 和 43.00488 灰色的背景的?我可以学吗?
  • 你可以像这样使用`:`hello`会这样显示:hello

标签: matlab math binary fixed-point


【解决方案1】:

你的问题不是很清楚。我认为您可能需要考虑您希望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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    • 2021-12-11
    • 2016-04-29
    相关资源
    最近更新 更多