2. 信号与噪声基础:分贝(dB)概念、信号功率计算、噪声类型、信噪比(SNR)
做噪声门限设计,说白了就是跟信号和噪声打交道。你得先搞清楚它们各自长什么样,才能谈怎么把噪声压下去。这一节,我把最基础的概念掰开揉碎了讲给你听。
2.1 分贝(dB)概念:为什么音频世界离不开它?
你想想看,人耳能听到的声音范围,从最微弱的呼吸声到震耳欲聋的摇滚乐,功率差了上亿倍。如果直接用线性数值去描述,那数字会大到离谱,小到可怜。所以,我们用了分贝这个对数单位。
分贝的定义很简单:dB = 10 * log10(P1 / P2)。P1是你要测量的功率,P2是参考功率。在音频里,我们经常用dBFS(满量程分贝),参考值是数字系统能表示的最大信号。
核心换算表(记住这几个就够了)
| 功率比 | dB值 | 实际意义 |
|---|---|---|
| 2倍 | +3 dB | 功率翻倍,人耳感觉音量明显变大 |
| 10倍 | +10 dB | 功率提升10倍,音量感觉翻倍 |
| 0.5倍 | -3 dB | 功率减半,通常叫半功率点 |
| 0.1倍 | -10 dB | 功率降到1/10 |
| 0.01倍 | -20 dB | 功率降到1/100 |
我个人习惯,在代码里处理信号时,全程用dB值做比较。比如设置门限阈值,我直接写 -40 dB,而不是去算那个0.0001的线性值。为什么?因为dB值更符合人耳的听觉特性,也更容易调试。
实战小技巧: 我在项目中遇到过,新手容易把dB和dBm搞混。记住,在数字音频处理里,我们几乎只用dBFS。0 dBFS就是数字信号能表示的最大值,超过它就会削波失真。所以你的信号峰值,最好留个-3 dB到-6 dB的余量。
2.2 信号功率计算:别被公式吓到
计算一段音频信号的功率,其实就两步:先求平方,再求平均。对于离散的数字信号,公式是:
P = (1/N) * Σ x[n]²
其中x[n]是采样点,N是总采样数。嗯,这里要注意,如果你用的是16位整型信号,取值范围是-32768到32767。直接平方再平均,得到的数值会很大。我建议先把信号归一化到-1到1之间,再算功率。
举个例子,你有一段1秒钟的音频,采样率44100 Hz,想算它的平均功率:
import numpy as np
# 假设 signal 是归一化后的浮点数组
power = np.mean(signal ** 2)
power_dB = 10 * np.log10(power + 1e-12) # 加个小常数防止log(0)
print(f"平均功率: {power_dB:.2f} dBFS")
我曾经在调试一个降噪算法时,发现门限怎么调都不对。后来一查,原来是功率计算时忘了加那个 1e-12,导致静音段算出来是负无穷,程序直接崩了。这种小坑,踩过一次就记住了。
2.3 噪声类型:白噪声、粉红噪声、环境噪声
噪声不是铁板一块。不同类型的噪声,频谱特性天差地别。你设计的门限,必须针对特定的噪声类型来调整。
2.3.1 白噪声
白噪声的功率谱密度是平的,也就是说,每个频率上的能量都一样。听起来像老式电视机没信号时的沙沙声。在时域上,它的瞬时值完全随机,服从高斯分布或均匀分布。
白噪声是理论分析的好工具,但现实世界里很少见。我一般用它来做算法的基准测试,比如测试门限检测的响应速度。
2.3.2 粉红噪声
粉红噪声的功率谱密度每倍频程下降3 dB。说白了,低频能量多,高频能量少。听起来比白噪声更「暖」,像下雨声或瀑布声。
为什么粉红噪声很重要?因为很多自然界的噪声,比如风声、水流声,甚至音乐信号,都更接近粉红噪声的频谱分布。如果你用白噪声的参数去处理粉红噪声,门限很容易误触发。
2.3.3 环境噪声
环境噪声是最复杂的。它可能是空调的嗡嗡声(低频)、键盘的敲击声(中高频)、或者马路上的车流声(宽频)。没有固定的频谱模板。
避坑指南: 我曾经在做一个车载免提系统时,用粉红噪声模拟环境噪声来调门限。结果上车实测,发现门限完全失效。为什么?因为车内噪声主要是发动机的低频轰鸣和风噪,跟粉红噪声差远了。后来我改成现场录制真实噪声来调试,问题才解决。
2.4 信噪比(SNR):衡量信号质量的标尺
信噪比,就是信号功率与噪声功率的比值,单位也是dB。公式很简单:
SNR (dB) = 10 * log10(P_signal / P_noise)
SNR越高,信号越干净。比如SNR = 20 dB,意味着信号功率是噪声功率的100倍。SNR = 0 dB,信号和噪声一样强,听起来已经很难受了。
在噪声门限设计里,SNR是决定门限值的关键参数。我一般会先估算当前环境的SNR,然后根据这个值来设置门限的偏移量。
经验法则:
- SNR > 20 dB:门限可以设得比较低,比如-40 dBFS,能捕捉到微弱信号
- SNR 10-20 dB:门限需要适当提高,比如-30 dBFS,避免噪声误触发
- SNR < 10 dB:噪声已经很强了,单纯靠门限很难分离信号,需要配合降噪算法
你想想看,如果环境噪声很大,你还把门限设得很低,那门限就会一直开着,等于没起作用。反过来,如果环境很安静,门限设高了,会把弱信号也切掉。所以,SNR是门限设计的「指南针」。
2.5 知识体系总览
下面这张图,把这一节的核心逻辑串起来了。你可以把它当作一个思维导图来理解。
这一节的内容,说白了就是给你一把尺子(dB)、一个计算器(功率)、一张地图(噪声类型)和一个指南针(SNR)。有了这些,你才能开始真正设计噪声门限。下一节,我们会把这些工具用起来,看看门限到底怎么设才合理。
我的建议: 学完这一节,你可以打开一个音频文件,用Python或MATLAB算一下它的平均功率和SNR。动手做一遍,比看十遍理论都管用。我在带新人时,第一周就让他们做这个练习,效果很好。
公众号:蓝海资料掘金营,微信deep3321