技术博客

音频总线效果器:自带 DSP 一览,混响和压缩器的参数含义

第 128 / 149 篇 · 2025-05-21 · godot · 音频系统DSP效果器

八-1 讲了效果器实例挂在 bus 链上就地处理 AudioFrame 流,这篇盘点 Godot 4.x 自带的效果器家族(servers/audio/effects/,二十来个类),重点拆两个最常用的——Reverb 和 Compressor——把参数和背后的 DSP 概念对齐。调音不是玄学,每个 slider 对应信号处理里的一个具体量。

按用途分组的全景

自带效果器大致分四组:

空间与氛围:Reverb(混响)、Chorus(合唱)、Phaser、Echo(回声)。Reverb 是房间的声学指纹,下面细讲;Echo 是离散的重复(有明确 delay time),和混响的密集反射不同。

动态控制:Compressor(压缩器)、Limiter(限幅器)、Gate(噪声门)、Desser(去齿音)、Transient(瞬态整形)。这组管的是"音量包络的整形",是混音的胶水。

频率整形:EQ(参量均衡器,六个频段)、Filter(低通/高通/带通)、PitchShift(变调,八-4 说了这是重采样路径)、Distortion(失真,波形整形)。EQ 是最常用的修复工具,浑浊的 BGM 往往 200–400Hz 过重,切掉 2–3dB 就干净。

分析与特殊:SpectrumAnalyzer(频谱,只分析不发声)、Record(录 bus 输出到 WAV)、Capture(八-8 讲回采)、StereoEnhance(立体声宽度)。Record 和 Capture 是工具型效果器,游戏逻辑里用来取混音结果做可视化或回放。

效果器实例每帧在音频线程被 process,成本各不相同:Filter/EQ 是每采样几次乘加,几乎免费;Reverb/Chorus 内部有延迟线,也是轻量;最贵的 PitchShift 和 ConvolutionReverb(4.x 有卷积混响,吃 IR 响应样本)在大 buffer 下也就零点几个百分点 CPU。一个 bus 上挂五六个效果器是常态,不用抠。

Reverb:三个核心参数,一个物理图景

混响的物理图景是:声音在房间里经过多次反射,形成越来越密集、越来越弱的回声尾。Godot 的 AudioEffectReverb 用 Schroeder 型算法模拟——几组并联的梳状滤波器(模拟多路径反射)再串全通滤波器(把反射打散)。参数虽然多,物理意义就三个维度:

Room size(房间尺寸):决定反射的平均间隔,也就是梳状滤波器的延迟线长度。小房间 20–50ms 的首次反射间隔,大教堂 100ms+。它和 decay 强耦合——房间越大,衰减自然越长,所以调大 room size 后 decay 通常跟着补。

Decay time(衰减时间,RT60):声压衰减 60dB 所需的时间。小房间 0.3–0.5s,音乐厅 2s+,游戏场景 1–2s 最常见。直觉锚点: decay = 1.0s 意味着尾音一秒后还有原始响度的千分之一——足够在 BGM 下面垫出空间感,又不会糊掉下一个音符。

Pre-delay(预延迟):直达声之后、第一次反射之前的干净间隙。0–20ms 是"你在房间里";30–80ms 是"舞台在房间前面,你是观众"——人声加 40ms pre-delay 能保持歌词清晰同时有空间包裹感。这是游戏语音混音最常用的单参数技巧。

剩下的 diffusion(扩散,反射的密集程度,低值像空体育馆的 flutter echo,高值像挂满窗帘的客厅)、damping(高频衰减,空气和家具吸高频,damping 高则尾音发闷发暗)、wet/dry(效果声与原始声的比例)都是细调。

Compressor:阈值、比率、时间与增益补偿

压缩器是自动音量骑师:超过阈值的信号被按比率压下来。四个核心参数:

  • Threshold:触发压缩的门槛。−18dB 意味着只有峰值超过 −18dB 的部分被处理。设 0dB 等于关闭(永远超不过);
  • Ratio:压缩强度。4:1 表示输入超出阈值 4dB,输出只超出 1dB。总线胶水压缩用 2:1–4:1,限制爆音用 20:1+(即 Limiter 的极端);
  • Attack / Release:压缩器开始 / 停止动作的毫秒数。Attack 太快(<5ms)会压掉鼓的 transient(打击感变棉花糖),游戏 SFX 总线我常设 10–30ms;Release 太短会"pumping"(音量可闻地起伏),太长则压缩器永远回不去,总线发闷;
  • Gain(补偿增益):压缩把响度拉下来了,通常要补回去。这里有个响度战争的陷阱:压缩 + 补偿增益 = 整体更响 = 主观上"更好听",和实际改善动态无关。做 A/B 对比时记得把补增益后的响度对齐再判断。

Limiter 是 ratio → ∞ 的压缩器,只有一个 threshold(ceiling)。它应该永远挂在 Master 链的最后——前面所有 bus 混出来的峰值在这里被硬削平,保护输出不削波(数字削波是硬性失真,极难听)。

Compressor 输入-输出曲线:阈值以上按比率折线 输入电平(dB) 输出电平(dB) threshold 比率 1:1(不受影响) 比率 4:1

一条实用的 bus 模板

给一个可以直接抄的起点(2D 游戏,SFX/Music/Voice 三路):

  • SFX bus:Compressor(ratio 3:1, attack 15ms, release 150ms)——大量短音效叠加时自动收峰值,防止爆音;
  • Music bus:EQ(200Hz 削 2dB 防浑浊)+ Reverb(room size 0.5, decay 1.2s, wet 15%)——极低剂量的混响给 BGM 和空间音效一个共同的"房间";
  • Voice bus:EQ(高通 80Hz 去低频轰隆)+ Desser(6–8kHz 齿音);
  • Master:Limiter(ceiling −1dB)兜底。

这套东西十分钟能搭完,比"感觉音量不对就手调每个 player 的 volume_db"高明到不知道哪里去了——动态控制在总线做,语义化管理在代码做(AudioServer.set_bus_volume_db(AudioServer.get_bus_index("SFX"), ...)),两层各司其职。

本文基于 Godot 4.2–4.4,效果器实现见 servers/audio/effects/;Schroeder 混响与压缩器参数为通用 DSP 概念,Godot 参数命名与行业标准一致。