声学计权网络:A/C/Z 计权

1. 前言:为什么需要计权网络

当我们进行声压测量的时候,声压级 SPL 的基本定义是:

Lp = 20 log10(p_rms / p0)
p0 = 20 uPa

SPL 是物理量,它只描述声压有效值相对 20 uPa 的大小;但人的听觉系统对不同频率的敏感度不同。同样的声压级,比如 60 dB SPL,频率不同时(比如50 Hz 和 1 kHz) 给人感觉是不一样的。中频,尤其是几百 Hz 到几 kHz,人耳比较敏感;很低的低频和很高的高频,即使物理声压不小,主观响度也可能没有同等声压的中频明显。

计权网络的作用就是,把“纯物理声压”转换成更适合某类评价目标的声级,使客观测量值与主观感受相匹配。A 计权让结果更接近常规噪声评价和人耳敏感度;C 计权保留更多低频和强声信息;Z 计权提供平直参考。本文以IEC 61672规定的计权网络作为标准,通过Python代码生成三种计权网络曲线,并与IEC 61672计权进行对比验证;在此基础上说明三种计权方式的区别和使用场景。

本文和仿真代码同步发在个人博客网站 VoxWorking · 声学与音频知识平台,网站定期更新音频处理、语音处理和声学相关知识,欢迎大家浏览交流~

2. IEC 61672 的 A/C/Z 计权公式

IEC 61672 使用以下频率常数:

f1 = 20.598997 Hz
f2 = 107.65265 Hz
f3 = 737.86223 Hz
f4 = 12194.217 Hz

A 计权的幅频响应可以写成:

WA(f) = 20 log10[
    f4^2 f^4 /
    ((f^2 + f1^2)
     sqrt(f^2 + f2^2)
     sqrt(f^2 + f3^2)
     (f^2 + f4^2))
] - A1000

A1000 = -2.0 dB

C 计权为:

WC(f) = 20 log10[
    f4^2 f^2 /
    ((f^2 + f1^2)(f^2 + f4^2))
] - C1000

C1000 = -0.062 dB

Z 计权最简单:

WZ(f) = 0 dB

这里的 A1000C1000 是归一化补偿,使 1 kHz 附近的计权增益为 0 dB。声级计以 1 kHz 为参考点,这也能解释为什么 1 kHz 校准音常用于声级计校准。

3. Python 代码实现计权曲线

核心函数如下:

def a_weighting_db(frequency_hz):
    f = np.asarray(frequency_hz, dtype=float)
    f2 = f * f
    numerator = (F4 * F4) * (f2 * f2)
    denominator = (
        (f2 + F1 * F1)
        * np.sqrt(f2 + F2 * F2)
        * np.sqrt(f2 + F3 * F3)
        * (f2 + F4 * F4)
    )
    return 20.0 * np.log10(numerator / denominator) - A1000


def c_weighting_db(frequency_hz):
    f = np.asarray(frequency_hz, dtype=float)
    f2 = f * f
    numerator = (F4 * F4) * f2
    denominator = (f2 + F1 * F1) * (f2 + F4 * F4)
    return 20.0 * np.log10(numerator / denominator) - C1000

另外代码也实现了一个离线分析用的 FFT 计权:

weighted = irfft(rfft(signal) * weighting_gain)

但这只是作为计权网络的应用演示,真正的声级计通常会把同一响应实现成时域滤波器,再配合 Fast/Slow 等时间计权进行实时测量。

4. 结果说明

生成的 A/C/Z 曲线如下:

由上图可以看出:A 计权在低频处衰减非常明显,例如几十 Hz 会被压低几十 dB;C 计权在中低频区域更平直,直到很低频和很高频才明显衰减;Z 计权全频保持 0 dB;A/C 都在 1 kHz 附近归一到 0 dB。

运行结果:

Max absolute A-weighting table error: 0.2784 dB
Max absolute C-weighting table error: 0.1387 dB
A(1000 Hz) = 0.000344 dB
C(1000 Hz) = 0.000098 dB
PASS: formula values agree with rounded IEC table values within 0.3 dB

误差图如下:

由误差图可看到,代码生成的计权曲线与基准IEC 61672计权误差很小,基本一致。

5. 各自适用场景

场景 推荐计权 原因
环境噪声、法规限值、产品噪声标注 A 最常用,和多数噪声评价标准一致
职业噪声长期暴露 A 常用于等效连续声级和噪声剂量
演出、爆破、冲击声峰值 C 对高声级和低频不过度压低
低频轰鸣、设备振动感明显 C + Z 频谱 A 计权可能低估低频问题
算法验证、频响测试、原始声压分析 Z 不引入额外频率权重
判断低频是否突出 A 与 C 同时测 LC - LA 越大,低频占比通常越明显

6. 小结

声学计权网络可以理解为“测量前的标准化滤波器”,把“纯物理声压”转换成更适合某类评价目标的声级,使客观测量值与主观感受相匹配。A 计权最常用于环境噪声和普通噪声评价;C 计权更适合观察强声和低频成分;Z 计权则提供平直参考。本文代码从 IEC 61672 的连续公式出发,生成 A/C/Z 曲线,并与公开的 IEC 1/3 倍频程参考表对比,结果在 0.3 dB 内一致,可以说明实现是正确的。

参考资料