【发布时间】:2019-10-15 07:22:19
【问题描述】:
我对如何处理一些定点计算有疑问。我不知道如何解决它。我知道浮点数很容易,但我想弄清楚如何在定点数中做到这一点。
我有一个定点系统,我在其中对信号 (vSignal) 执行以下方程:
Signal_amplified = vSignal * 10^Exp
vSignal 的最大振幅约为 4e+05,
系统允许表示 2.1475e+09(32 位)信号。所以 Signal_amplified 有一些空间。
为了简单起见,不要假设 Exp 可以从 0 到 10。
假设第一个值为 2.8928。该值在浮点计算时效果很好,因为表达式 10^2.8928 结果为 781。当使用舍入浮点值 781 时,我得到的信号幅度为 3.0085e+08,完全在信号范围内。
如果我尝试用 Q 格式表示值 2.8928,可以说 Q12。该值更改为 11849。现在 10^11849 导致溢出。
应该如何处理这些大数字?我可以使用像 Q4 这样的另一种格式,但即便如此,数字也会变得非常大,而且我变得很差。我非常希望能够以 .001 的精度进行计算,但我只能看到应该如何完成。
最小的工作示例:
int vSignal = 400000
// Floatingpoint -> Goes well
double dExp = 2.89285
double dSignal_amplified = vSignal * std::pow(10,dExp)
// Fixedpoint -> Overflow
int iExp = 11848 // Q12 format
int iSignal_amplified = vSignal * std::pow(10,iExp)
iSignal_amplified = iSignal_amplified>>12
有什么想法吗?
【问题讨论】:
-
我对您使用的语言感到困惑。您已经标记了 both C 和 C++,然后在 Python 中提供了一个示例。
-
是的,很抱歉。我用 Python 模拟,但我用 C/C++ 实现。但同样的问题在两种语言中都存在。这只是提供一个例子。
-
10^Exp是通过什么方法定点计算的?这个计算不应该考虑定点单位吗?它不像 10^(2^(-k)) 有任何好的表示可以让你直接将二进制位置从输入转移到输出(你打算之后除以10^(2(-k))吗?),那么这一切怎么办?首先工作? -
即使没有溢出,您的定点示例代码也是错误的(我猜这回答了我的上述问题)。
10^(x/y)与(10^x) / y不同(在这种情况下为y = 2^k)。 [注意:这里使用^求幂,而不是xor。] -
“数值变为 11849”。不,它没有。表示更改为
0x2e49。该值更改为 2.892822265625。您混淆了定点数及其二进制表示。
标签: c++ c signal-processing fixed-point