AtomGit Flutter 鸿蒙客户端:高斯噪声模拟自然音效的数学原理 📅 2026/7/13 12:41:13 雨声不是随机噪声——它是经过精确滤波和调制的信号。本文揭示 E-Brufen 中四种自然音效背后的数学原理和算法实现。一、为什么高斯噪声而非均匀噪声1.1 Box-Muller 变换final_randRandom();double_gauss(){finalu1_rand.nextDouble();// [0, 1) 均匀分布finalu2_rand.nextDouble();// [0, 1) 均匀分布returnsqrt(-2*log(max(u1,0.0001)))*cos(2*pi*u2);}这是经典的Box-Muller 变换——将两个独立的 [0,1) 均匀随机数转换为标准正态分布 N(0,1)。1.2 为什么自然音效需要高斯分布均匀噪声 (Random.nextDouble) ├─ 频谱所有频率等概率 ├─ 听感刺耳的静电声 └─ 原因自然界不存在等概率的频谱分布 高斯噪声 (Box-Muller) ├─ 频谱能量集中在均值附近 ├─ 听感柔和的沙沙声 └─ 原因自然界的大多数随机过程遵循正态分布★ Insight ─────────────────────────────────────自然界的声音之所以自然是因为它们遵循中心极限定理——大量独立随机因素的叠加趋于正态分布。雨滴落下的声音是成千上万个小水滴的叠加 → 高斯分布。直接使用均匀分布的Random.nextDouble()生成的声音听起来不自然根因就在这里。─────────────────────────────────────────────────二、雨声高通滤波 低频包络2.1 算法流程高斯白噪声 → 低通滤波(LPF) → raw - LPF×0.5 高通 → × 双正弦包络 → 雨声 × 随机大水滴 (0.3%)2.2 完整实现Listint_generateRain(Stringpath,int sr,int durSec){finalnsr*durSec;finalsamplesint[];double lpf0;// 一阶低通滤波器记忆for(vari0;in;i){finalti/sr;// 包络两个不同频率正弦波的乘积 → 不规则的疏密变化finalenvelope0.60.4*sin(2*pi*0.07*t)*sin(2*pi*0.13*t);finalraw_gauss();lpf0.3*raw0.7*lpf;// 一阶 IIR 低通y[n] 0.3x[n] 0.7y[n-1]finalhighraw-lpf*0.5;// 高通 原始 - 低通分量varvalhigh*envelope*0.5;// 偶尔的大水滴——模拟雨滴打在屋檐/窗户上的声音if(_rand.nextDouble()0.003){val_gauss()*1.8;}samples.add((val*18000).toInt());}_writeWav(path,sr,samples);returnsamples;}2.3 参数解析参数值作用lpf系数 (0.3, 0.7)y[n] 0.3x[n] 0.7y[n-1]截止频率约 1kHz包络 sin(0.07t)×sin(0.13t)~14s 和 ~7.7s 周期时大时小的雨势变化大水滴概率0.3%平均每秒 6-7 个突出滴声三、海浪布朗噪声1/f² 频谱3.1 布朗噪声的数学定义布朗噪声 白噪声的积分累积和brown[n] brown[n-1] white[n] × 步长频谱特性power ∝ 1/f²即频率每翻一倍能量降为 1/4。这产生了极其低沉、隆隆的声音。3.2 实现Listint_generateOcean(Stringpath,int sr,int durSec){finalnsr*durSec;finalsamplesint[];double brown0;for(vari0;in;i){finalti/sr;brown_gauss()*0.02;// 积分步长 0.02brownbrown.clamp(-3.0,3.0);// 防止数值漂移// 海浪包络两个慢波相乘finalwave1(sin(2*pi*0.08*t)1)/2;// 12.5s 周期finalwave2(sin(2*pi*0.05*t1.5)1)/2;// 20s 周期finalenvelope0.20.8*wave1*wave2;samples.add((brown*envelope*0.7*25000).toInt());}_writeWav(path,sr,samples);returnsamples;}★ Insight ─────────────────────────────────────包络使用两个不同频率、不同相位的正弦波相乘而非相加——这是关键。相加产生的波形规则可预测“听几秒就知道下一个浪什么时候来”而相乘产生不规则的复合波“浪高浪低没有固定规律”。真正的海浪正是如此——受月球引力、风速、海底地形等多因素影响永远不会呈现完美的周期性。─────────────────────────────────────────────────3.3 参数分析参数值效果积分步长0.02控制隆隆的强度clamp 范围[-3.0, 3.0]防止长时间积分漂移导致失真wave1 频率0.08 Hz主浪周期 ~12.5 秒wave2 频率0.05 Hz次浪周期 ~20 秒相位偏移1.5 rad避免两波同步叠加四、篝火稀疏事件模型4.1 三层声音结构篝火声音模型 ├─ 底层持续低频底噪 (base) → 火焰的身体 ├─ 中层4% 概率的噼啪脉冲 (2-22样本) → 小木柴爆裂 └─ 顶层0.2% 概率的大爆裂 (2.5×振幅) → 大木块崩裂4.2 实现Listint_generateFire(Stringpath,int sr,int durSec){finalnsr*durSec;finalsamplesint[];for(vari0;in;i){finalbase_gauss()*0.15;// 持续低频底噪varcrackle0.0;if(_rand.nextDouble()0.04){// 4% 噼啪概率finalcrackLen2_rand.nextInt(20);// 2-22 样本finalcrackAmp0.3_rand.nextDouble()*1.2;for(varj0;jcrackLenijn;j){finaldecay1-(j/crackLen);samples.add(((basecrackAmp*decay*(_gauss()*2))*14000).toInt());}icrackLen;// 跳过已生成的样本continue;}// 偶尔的大块爆裂if(_rand.nextDouble()0.002){crackle_gauss()*2.5;}samples.add(((basecrackle)*0.8*18000).toInt());}returnsamples;}4.3 稀疏事件模型的关键参数参数含义调大效果0.04噼啪概率更活跃的篝火2-22 样本噼啪持续时长噼啪声更长decay 1 - j/crackLen线性衰减控制噼啪声的脆度0.002大爆裂概率更多的砰声五、森林调频FM鸟鸣合成5.1 为什么用 FM 合成真正的鸟鸣不是纯音——鸟类的鸣管syrinx通过肌肉调节产生频率微变。在合成中这通过调频Frequency Modulation实现carrier(t) sin(2π × fc × t) // 载波基频 modulator(t) 300 × sin(2π × 0.01 × t) // 调制信号 bird(t) sin(2π × (fc modulator(t)) × t) // FM 结果5.2 实现Listint_generateForest(Stringpath,int sr,int durSec){finalnsr*durSec;finalsamplesint[];double lpf0;for(vari0;in;i){finalraw_gauss();lpf0.3*raw0.7*lpf;// 中频环境噪声finalambiencelpf*0.25;if(_rand.nextDouble()0.015){// 1.5% 鸟鸣概率finalbirdFreq1200_rand.nextDouble()*2000;// 1.2kHz - 3.2kHzfinalbirdLen150_rand.nextInt(400);// 150-550 样本for(varj0;jbirdLenijn;j){finaldecay1-(j/birdLen);finalfreqbirdFreq300*sin(2*pi*0.01*j);// FM!finalchirpsin(2*pi*freq*(ij)/sr)*decay*0.35;samples.add(((ambience*0.6chirp)*14000).toInt());}ibirdLen;continue;}samples.add((ambience*18000).toInt());}returnsamples;}六、四种算法的频谱对比频率 (Hz) 20 50 100 200 500 1000 2000 5000 10000 ───────────────────────────────────────────────────────────── 雨声 (高通) ░ ░ ░░ ░░░ ████ ███ ██ ░ · 海浪 (1/f²) ████ ██ █ ░ ░ · · · · 篝火 (混合) ██ ██ █░ █░ ░░ ░ · · · 森林 (中频) ░ █ ██ ███ ██ ░ ░░ · ·雨声在高频段能量集中 → 清脆感海浪在极低频能量集中 → 低沉感篝火在中低频有持续能量 高频随机尖峰 → 温暖 噼啪森林在中频有持续能量 高频调频啁啾 → 宁静 鸟鸣七、总结噪声 → 滤波 → 调制四种自然音效本质上都是噪声 滤波器 调制的排列组合音效噪声源滤波器调制方式雨声高斯白噪声高通 (raw - LPF)双正弦包络 随机脉冲海浪布朗噪声 (积分)自然低频 (1/f²)双波相乘包络篝火高斯噪声低频保留概率事件 衰减包络森林高斯噪声中频 (LPF)FM 啁啾 衰减包络理解这三个要素你就能合成任何自然声——雷声低频 稀疏强脉冲、溪流中频 密集小脉冲、蝉鸣高频正弦 AM 调制。上一篇程序化生成音频用 Dart 手写 WAV 编码器下一篇PNG 图片格式详解作者简介E-Brufen DevFlutter 鸿蒙开发者。本文中的信号处理知识参考了 Julius O. Smith 的《Physical Audio Signal Processing》,项目地址AtomGit - E-Brufen。