【发布时间】:2015-02-26 12:10:20
【问题描述】:
我正在开发 C++ 中的定点算法。我知道,对于 N 位整数,定点二进制整数表示为 U(a,b)。例如,对于一个 8 位整数(即 256 个样本),如果我们用 U(6,2) 的形式表示它,则表示二进制点在从形式右侧开始的第 2 位的左侧:
b5 b4 b3 b2 b1 b0 . b(-1) b(-2)
因此,它有 6 个整数位和 2 个小数位。在 C++ 中,我知道有一些移位运算符可以使用,但它们基本上用于移位输入流的位,我的问题是,如何定义形式为 fix 或 U(6,2)。所有主要的处理操作都将在小数部分进行,我只是在寻找一种在 C++ 中进行此修复的方法。对此的任何帮助将不胜感激。谢谢!
示例:假设我有一个输入离散信号,x 轴上有 1024 个采样点(现在只是认为这个输入信号来自某个传感器)。每个样本点都有一个特定的幅度。假设时间 2(x 轴)的样本具有 3.67(y 轴)的幅度。现在我有一个变量“int *input;”它采用样本 2,二进制为 0000 0100。所以基本上我想通过在 C++ 中对样本 2 执行 U(5,3) 将其设为 00000.100。这样我就可以对输入采样周期或时间的一部分执行插值操作。
PS - 我不想为此创建一个单独的类或使用外部库。我只想从我的输入信号中取出每 8 位,对其执行 U(a,b) 修复,然后在小数部分完成其余操作。
【问题讨论】:
-
我知道我可以使用一些移位运算符,但它们基本上用于移位输入流的位 嗯不......这一切都取决于你重载了操作员要做的事情。
x << 1其中x是一个 int 将移动 int 的位,不涉及流。 -
据我了解,我的意思是如果我传递输入信号或样本或比特流。因此,如果特定时刻的输入是一个样本值(每个这样的值的大小为 1 字节,即 8 位),那么我想对输入的每个这样的输入样本执行 U(a,b) 修复。我是编程初学者(C 和 C++)。一般比较习惯在simulink中做这些东西。如有错误请纠正我。
-
我不明白你在问什么。
-
@DigitalGeeK - 使用定点或浮点总是施加约束。提及您的用例可能有助于选择不会有害的用例。就目前而言,要将无符号 8 位整数转换为 6:2 定点表示 - 您需要做的就是清除最低 2 位。即
uint8_t myVal = 255; myVal &= 0x03;然后您需要将值向右移动两位以获取整数部分 - 当然,您现在已经将范围除以 4。您现在可以表示的最大数字是 63.75 而不是255.跨度> -
假设我有一个输入离散信号,在 x 轴上有 1024 个采样点(现在只是认为这个输入信号来自某个传感器)。每个样本点都有一个特定的幅度。假设时间 2(x 轴)的样本具有 3.67(y 轴)的幅度。现在我有一个变量“int *input;”它采用样本 2,二进制为 0000 0100。所以基本上我想通过在 C++ 中对样本 2 执行 U(5,3) 将其设为 00000.100。这样我就可以对输入采样周期或时间的一部分执行插值操作。希望这可以清除它,如果不是请询问。
标签: c++ visual-c++ fixed-point