- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用第 3 方定点 antilog()
函数来计算分贝 out_mag = 10^( in_db/20 )
的幅度。 antilog()
采用 Q6.25
格式作为输入,并在输出时提供 Q16.15
。
问题在于,antilog()
对于某些较高的 dB 值(例如 100 dB)会快速溢出:10^( 100/20 ) = 100000
。 Q16.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.000
和 scalefactor = 2
等相同的结果。这个想法就在那里。
关于c - 定点: out_Q15 = antilog( in_Q25 ) 计算,避免溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41977852/
当我在定点 Z3Py 中启用解释生成选项时,我收到包含以下消息的核心转储。 Error setting 'DL_GENERATE_EXPLANATIONS', reason: unknown opti
我正在开发一些代码,可以从 HW 获取浮点或定点数据。目前我们将其作为 float 。 底层API都是定点的。所以我们必须将数据作为定点传回。我们使用的算法是 Cholesky。我想知道为什么我们必须
我有一个关于在 MATLAB 中为 Texas Instruments TMS320C64xx DSP 编写算法的问题: 我在 MATLAB 中草率地实现了我的过滤器。我的目标是使用 MATLAB E
我需要将 float 转换为Q31定点,Q31表示1个符号位,0位表示整数部分,31位表示小数部分。这意味着 Q31 只能表示 [-1,0.9999] 范围内的数字。 根据定义,从浮点转换为定点时,会
我正在使用第 3 方定点 antilog() 函数来计算分贝 out_mag = 10^( in_db/20 ) 的幅度。 antilog() 采用 Q6.25 格式作为输入,并在输出时提供 Q16.
我想将一个定点数(Q31/int32 表示具有 31 个小数位的小数)除以另一个 Q31/int32。我想计算z = y/x,知道abs(x)>abs(y)。因此,z<1,因此可以表示为另一个Q31/
我是一名优秀的程序员,十分优秀!