Skip to content

对数单位

分贝和奈培不是普通单位换算。它们表达的是对数尺度,而且经常带参考值。把它们放进普通乘法单位核心,会让计算规则变得隐蔽且容易出错。

数学视角

对数尺度把线性域中的比例变成加法。纯 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))

这也是 LevelGain 需要分开的原因:一个描述带参考的点,一个描述可以平移 level 的比例变化。

问题

举例来说,30 dBm3 dB 看起来都写着 dB,但含义不同:

  • 30 dBm 是带参考的绝对 level,对应 1 mW 参考下的功率水平。
  • 3 dB 是相对 gain,表示比例变化。

如果把它们都当成普通单位,会混淆“绝对电平”和“相对增益”。两个相等功率源合并时也不是数值相加,而是先回到线性功率再相加。

选择

LunarUnits 把 logarithmic scale 放在独立包中,并区分 LevelGain

  • Level 带参考,可转回线性数量。
  • Gain 是比例,可用于平移 level。
  • 两个 level 的差是 gain。
  • 两个功率 level 的合并走线性域相加。

避免的错误

这个模型避免了几类常见误用:

  • 把 dBm 当作普通 dB 比例。
  • 把两个电平直接做普通加法。
  • 混淆功率比例和根功率比例。
  • 在 formatter 中显示了 dB,却没有保留参考值。

代价

代价是对数尺度不能直接混入 Un/Quantity 的普通乘法系统。用户需要在 logarithmic API 和 linear quantity 之间显式桥接。

这个显式桥接是设计目标:只要进入或离开对数域,代码就应该暴露这个事实。