对数单位
分贝和奈培不是普通单位换算。它们表达的是对数尺度,而且经常带参考值。把它们放进普通乘法单位核心,会让计算规则变得隐蔽且容易出错。
数学视角
对数尺度把线性域中的比例变成加法。纯 gain 描述的是两个线性量之间的比例,level 则是在比例之外固定了参考值。
text
gain = 10 * log10(P2 / P1)
level = 10 * log10(P / Pref)因此 3 dB 可以表示一个功率比例,而 30 dBm 表示相对于 1 mW 的功率水平。前者没有绝对参考值,后者必须携带参考值才能回到线性数量。
对数域中的加法也不等同于线性域中的相加。两个功率 level 合并时,需要先回到线性功率,相加之后再取对数:
text
combine(L1, L2) = 10 * log10(10^(L1 / 10) + 10^(L2 / 10))这也是 Level 和 Gain 需要分开的原因:一个描述带参考的点,一个描述可以平移 level 的比例变化。
问题
举例来说,30 dBm 和 3 dB 看起来都写着 dB,但含义不同:
30 dBm是带参考的绝对 level,对应 1 mW 参考下的功率水平。3 dB是相对 gain,表示比例变化。
如果把它们都当成普通单位,会混淆“绝对电平”和“相对增益”。两个相等功率源合并时也不是数值相加,而是先回到线性功率再相加。
选择
LunarUnits 把 logarithmic scale 放在独立包中,并区分 Level 和 Gain。
Level带参考,可转回线性数量。Gain是比例,可用于平移 level。- 两个 level 的差是 gain。
- 两个功率 level 的合并走线性域相加。
避免的错误
这个模型避免了几类常见误用:
- 把 dBm 当作普通 dB 比例。
- 把两个电平直接做普通加法。
- 混淆功率比例和根功率比例。
- 在 formatter 中显示了 dB,却没有保留参考值。
代价
代价是对数尺度不能直接混入 Un/Quantity 的普通乘法系统。用户需要在 logarithmic API 和 linear quantity 之间显式桥接。
这个显式桥接是设计目标:只要进入或离开对数域,代码就应该暴露这个事实。