第2章 声学基础回顾:声音的物理特性、传播与噪声模型
各位同学好,我是你们的老朋友。今天咱们聊聊声学基础。别急着翻白眼,我知道很多人觉得声学是玄学。但做车载麦克风阵列,这块绕不过去。我当年刚入行时也觉得声学太虚,直到在实车上被回声和混响折磨得欲哭无泪……嗯,从那以后我老老实实把基础补上了。
2.1 声音的物理三要素:频率、波长、声速
声音的本质是什么?说白了就是机械振动在介质中的传播。空气分子被推来推去,形成疏密波,传到我们耳朵里。
三个核心参数,我建议你刻在脑子里:
- 频率 f:单位 Hz,表示每秒振动次数。人耳能听到的大约是20Hz到20kHz。车载麦克风阵列主要关心100Hz到8kHz这个范围——再高也没啥用,车内噪声主要集中在这段。
- 波长 λ:一个完整波形的空间长度。λ = c / f,c是声速。
- 声速 c:在空气中大约340m/s(15°C时)。温度每升高1°C,声速增加约0.6m/s。这个细节我在做冬季标定时吃过亏,后面会讲。
核心公式(请默写):
c = f × λ
记住这个,波束成形、时延估计全得靠它。
举个例子:1kHz的声音,波长大约是34cm。你想想看,如果两个麦克风距离34cm,那这个频率的信号到达两个麦克风时刚好差一个波长。这对阵列设计很关键。
2.2 声波传播与反射
声波在车内怎么跑?不是直线传播那么简单。它会反射、绕射、散射。车内空间狭小,到处都是反射面——玻璃、座椅、顶棚、仪表台……
我个人习惯把车内声场分成三部分:
- 直达声:从声源直接到麦克风,这是我们要的信号。
- 早期反射:经过一次或两次反射到达,延迟通常在5-50ms。这个对语音清晰度影响很大。
- 混响声:多次反射后形成,听起来像“嗡嗡”的尾音。
我在项目中遇到过最头疼的情况:驾驶员说话,副驾玻璃反射回来的声音比直达声还大。麦克风阵列直接懵了,定位全错。后来怎么解决的?调整麦克风安装位置,避开强反射路径。
避坑指南:我曾经在某个车型上发现,麦克风装在A柱附近时,风噪和反射声特别严重。后来改到顶灯位置,效果好了很多。记住:麦克风位置决定了你信号质量的上限。
2.3 混响模型
混响是车载语音系统的头号敌人。什么叫混响?就是声音发出去后,在空间里弹来弹去,迟迟不消失。
描述混响有两个关键参数:
| 参数 | 含义 | 车内典型值 |
|---|---|---|
| RT60 | 混响时间,声音衰减60dB所需时间 | 0.3-0.6秒(轿车) |
| D/R比 | 直达声与混响声的能量比 | 5-15dB(取决于位置) |
RT60越长,语音越“糊”。你想想看,在浴室里唱歌和在大厅里唱歌的区别。车内RT60一般控制在0.5秒以内,但有些豪华车为了隔音好,内饰吸音不够,混响反而严重。
常用的混响模型有:
- 统计混响模型:假设混响是指数衰减的。简单好用,但不够精确。
- 镜像法:把反射面当成镜子,计算虚拟声源。精度高,但计算量大。
- 射线追踪法:模拟声线在空间中的传播路径。最接近真实,但实时做不了。
做算法仿真时,我建议先用统计模型快速验证,最后再用镜像法或实测数据做最终调优。
2.4 噪声模型
车内噪声比混响更麻烦。为什么?因为噪声种类多,而且是非平稳的。
常见的车载噪声类型:
- 发动机噪声:低频为主,50-200Hz。怠速时明显,高速时被风噪盖过。
- 风噪:宽频带,200Hz-4kHz。车速超过80km/h后成为主要噪声源。
- 胎噪:中低频,100-500Hz。路面粗糙度影响很大。
- 空调噪声:中高频,1-3kHz。风量开大时特别烦人。
- 电子噪声:来自麦克风本身和电路,通常是白噪声。
注意:千万不要用高斯白噪声来模拟所有车载噪声。我见过有人论文里用白噪声做测试,结果实车上一塌糊涂。真实噪声是有色噪声,频谱特性完全不同。
我个人常用的噪声建模方法:
- 实测法:在实车上录一段噪声,直接当样本用。最真实,但费时费力。
- 参数模型:用AR模型或高斯混合模型拟合噪声统计特性。适合仿真。
- 混合模型:把几种典型噪声按比例叠加。我一般用这个做快速验证。
举个代码例子,生成一个简单的车内噪声仿真信号:
// 伪代码:生成模拟的车内噪声
// 包含发动机噪声(低频)+ 风噪(中频)+ 白噪声
float sample_rate = 16000; // 16kHz采样率
float engine_freq = 80; // 发动机基频80Hz
float wind_center = 1500; // 风噪中心频率1.5kHz
for (int n = 0; n < N; n++) {
// 发动机噪声:正弦波加谐波
noise[n] += 0.3 * sin(2*PI*engine_freq*n/sample_rate);
noise[n] += 0.15 * sin(2*PI*2*engine_freq*n/sample_rate);
// 风噪:带限噪声(用滤波器实现)
noise[n] += 0.2 * bandpass_noise(wind_center, 500, n);
// 电子噪声:白噪声
noise[n] += 0.05 * randn();
}
这段代码虽然简单,但已经能模拟出车内噪声的基本特征了。实际项目中,我会根据实测数据调整各成分的幅度和频谱。
2.5 小结与思考
这一章的内容,说白了就是让你明白:声音在车里不是乖乖听话的。它会反射、混响、被噪声污染。做麦克风阵列算法,本质上就是在和这些物理现象做斗争。
我建议你课后做两件事:
- 找一辆车,用录音笔在驾驶位录一段语音,同时录一段环境噪声。听听看混响和噪声长什么样。
- 用Python或MATLAB写一个简单的混响生成器,试试不同RT60对语音的影响。
下一章我们讲麦克风阵列的几何构型。到时候你会发现,理解了声学基础,阵列设计才有根。
一句话总结:声学基础不是理论课,是实战课。你越早理解声音在车内的真实行为,你的算法就越靠谱。