gpt4 book ai didi

c - 定点: out_Q15 = antilog( in_Q25 ) 计算,避免溢出?

转载 作者:行者123 更新时间:2023-11-30 16:50:56 28 4
gpt4 key购买 nike

我正在使用第 3 方定点 antilog() 函数来计算分贝 out_mag = 10^( in_db/20 ) 的幅度。 antilog() 采用 Q6.25 格式作为输入,并在输出时提供 Q16.15

问题在于,antilog() 对于某些较高的 dB 值(例如 100 dB)会快速溢出:10^( 100/20 ) = 100000Q16.15 格式的最高值是 2^16-1=65535,因此 100000 不适合。

有什么技巧可以避免溢出吗?预分频输入值不知何故?

最佳答案

我设法找到了解决方案。这有点棘手。

首先,需要一个保存输出结果的结构:

typedef struct
{
q15 v; // Value (within the [MIN, MAX] range for Q16.15).
int32 s; // Scalefactor.
} q15_t;

这个想法是提供结果作为带有比例因子的输出,其中

Output = 10^y
Scale = 2^scalefactor

最终输出是Output左移scalefactor倍。

这是数学计算。

输入 Q31 格式是缩放至 [-1,1] 的 dB 值,缩放比例为 2^scalefactor。我们需要计算:

Out = 10^(2^scalefactor * in/20.0)

= 10^(p+y) // rewriting as sum
= 10^p * 10^y // to enable exponent multiplication
= 2^scalefactor * 10^y // making it power of 2 to be able to just shift

这样我们就不受 Q16.15 最大值的限制。

我们已经知道2^scalefactor,但需要找到y:

2^scalefactor * in = p + y

10^p = 2^scalefactor => p = scalefactor*log(2) // rewrite as power of 2
2^scalefactor * in = scalefactor*log(2) + y // replace p
y = 2^scalefactor*in - scalefactor*log(2) // and find y

计算 y,并将其输入反对数

如果输入为 100 dB,则输出幅度应为 100.000,这不符合 Q16.15 格式。使用上述解决方案,Output = 50.000(这适合 Q16.15!)和 scalefactor = 1,这意味着最终输出为 50.000 移至左侧 1 位置。最终结果为 100.000。根据您的实现,您可能会得到与 25.000scalefactor = 2 等相同的结果。这个想法就在那里。

关于c - 定点: out_Q15 = antilog( in_Q25 ) 计算,避免溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41977852/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com