夜雨聆风学习资料网

ARTICLE · 1292913

白噪音最该量的,不是 App 标的分贝,是你床头的读数

白噪音最该量的,不是 App 标的分贝,是你床头的读数

> 第八篇 · 亲手量一次分贝

上篇你跑通了那段生成脚本,手里有了白、粉红、棕三种噪音,还有一段 1kHz 校准音。这期顺着它往前走一步。

先说结论,免得你滑到末尾。

这期不卖焦虑,给你一个能读数、能对答案的办法。手机能粗略量出房间的分贝,但别迷信它吐的那个数字。

要用第七篇那段校准音当尺,才知道读数是不是靠谱。你可能会问,既然第五、第六篇已经把分贝的概念讲清楚了,为什么还要自己量。

因为概念是别人的,读数是你自己的。前面让你知道 85、75、30 分贝大概是什么量级。这期让你亲手读出,你床头现在到底是哪一个。

01 手机能当声级计吗

能,但它是没校准过的那一种。

手机麦克风没经过声学校准,它吐出来的数字,不能直接当成 dB。但相对变化是准的,同一个手机、同一个距离,数字涨了就说明响了一点,这一点骗不了人。

问题出在绝对刻度。不同手机的麦克风增益不一样,同一声压在不同手机上,数字怎么会一样?

这就像两把没校准的尺,量同一张桌子,读出来的厘米数不同。

你要的不是厘米数精确,是同一把尺量出来的涨跌看得清。

很多声级计 App 标着 dB,其实大多没做 A 加权。

人耳对低频不敏感,A 加权才是我们真正在意的那种响度感。

没做这步,低频会虚高,读数比听感更吓人。

它们也没校准,误差能有好几 dB。

所以手机读数的正确用法,是看走向、看量级,不是死磕那个精确值。

这里说的 dB,是声压级,和第七篇文件里的 dBFS 不是一回事,别混了。

声压级量的是空气被推得多狠,和文件里那个相对电平不是一码事。

所以别拿手机数字去和厂家的参数硬比,比不出对错。

专业声级计贵,但原理一样,都是麦克风加算法。

手机只是省了校准这一步,也省了那份准。

A 加权说到底是在模拟人耳。把你不敏感的低频压下去,量出来才接近你真实觉得的响。

02 校准音就是那把尺

第四篇讲过,1kHz 校准音的本职,是标定麦克风、对照分贝表。它是“尺子”,不是枕头。第七篇你生成的那段 cal_1kHz.wav,就是已知电平的基准。

它不解决绝对值,但能解决可比性。

用法不复杂。

在固定条件下,手机离扬声器十厘米、音量拧到固定一档,播放它并录音,量出这段录音的相对电平,记为 L_cal。

你已知它在文件里约 -14 dBFS。

但真实声压还取决于你扬声器多响、离多远。

这一步,没法靠代码凭空变出绝对值。

没有第二台校准过的声级计,精确的绝对分贝从哪来?

诚实说一句,你拿不到精确 SPL,但你能拿到“相对刻度”。举个具体的例子,假如你借到一台校准过的声级计,测出某条件下扬声器是 60 dB。

而手机录这段 cal 的相对电平是 -20 dBFS。

那么偏移就是 60 减 -20,等于 80。

以后手机量什么都加上这个 80,读数就接近真实声压了。

脚本里的 CAL_OFFSET,就是刚才那个 80,填进去,读数才有绝对值的意义。

配合已知的安静卧室约 30 dB(A)、床头默认档约 75 分贝这些参照,量级判断已经够了。

填 0 也没关系,那样输出的是相对读数,看变化照样够用。

固定距离是为了让每次录音的衰减一样。

不然十厘米和三十厘米,差出来的不是声音变了,是位置变了。

你要的是刚能盖住环境,不是盖住一切。

03 完整代码,和七个会坑你的细节

下面这段,存成 measure_level.py,装了 Python 就能跑。它读一段 WAV,算出 RMS 响度、相对电平 dBFS、峰值电平,再叠加校准偏移,给出近似 dBA。

三步跑起来:一,电脑装好 Python,勾选“添加到 PATH”;二,把手机录的音频转成 WAV,m4a 或 mp3 先用格式工具转一下;三,命令行进到文件夹,敲 python measure_level.py 录音.wav。

# -*- coding: utf-8 -*- """ measure_level.py — 粗略读取一段录音的响度(近似声压级) 纯标准库,零依赖。用法:  python measure_level.py 录音.wav 会输出 RMS、相对电平 dBFS、峰值电平,以及叠加校准偏移后的近似 dBA。  校准偏移 CAL_OFFSET 怎么来(见正文): 用第七篇生成的 cal_1kHz.wav,在固定条件(手机离扬声器固定距离、固定音量) 下播放并录音,量出这段录音的 dBFS,记为 L_cal;再减去你知道的真实 SPL, 得到 CAL_OFFSET = SPL_real - L_cal。没有第二台校准设备就先填 0, 此时输出的是相对读数,只能看变化,不能当绝对值。 """  import wave import struct import math import sys  CAL_OFFSET = 0.0   # 校准偏移(dB)。填法见上方说明。   def read_samples(path):     """读 WAV,归一化到 [-1, 1];立体声取左声道。"""     with wave.open(path, 'r') as w:         n = w.getnframes()         ch = w.getnchannels()         raw = w.readframes(n)         fmt = '<%dh' % n if ch == 1 else '<%dh' % (n * ch)         vals = struct.unpack(fmt, raw)         if ch == 2:             vals = vals[0::2]   # 立体声只取左声道         return [v / 32767.0 for v in vals]   def rms(samples):     if not samples:         return 0.0     return math.sqrt(sum(s * s for s in samples) / len(samples))   def to_dbfs(x):     return -99.9 if x <= 0 else 20.0 * math.log10(x)   def main():     if len(sys.argv) < 2:         print('用法:python measure_level.py 录音.wav')         return     path = sys.argv[1]     samples = read_samples(path)     r = rms(samples)     peak = max((abs(s) for s in samples), default=0.0)     L = to_dbfs(r)     Lpk = to_dbfs(peak)     print('文件        :', path)     print('采样数      :', len(samples))     print('RMS(响度) :', '%.5f' % r)     print('相对电平    : %.1f dBFS' % L)     print('峰值电平    : %.1f dBFS' % Lpk)     if CAL_OFFSET != 0.0:         print('校准偏移    : %+.1f dB' % CAL_OFFSET)         print('近似声压级  : %.1f dBA(粗略,仅供参考)' % (L + CAL_OFFSET))     else:         print('近似声压级  : 未校准,仅相对读数(填 CAL_OFFSET 才有绝对值)')   if __name__ == '__main__':     main()

几个容易踩的坑,单列出来。

第一,麦克风增益没校准,绝对值不可信,只能看相对。别拿它当专业声级计使。

第二,手机大多没做 A 加权,低频会虚高,读出来比听感响度偏大。看走向,别看绝对值。

第三,录音时手机壳别挡住底部麦克风。离声源的距离要固定,才有可比性。

第四,风噪、衣物摩擦会瞬间爆表。室外或贴身录,要避开这些。

第五,录音别削波,波形顶到天花板就失真,读数偏高。离远一点录更安全。

第六,手机录音常见 m4a 或 mp3,脚本只认 WAV,先用格式工具转一下再喂进去。

第七,同一段音,床头外放和耳机贴耳是两个世界。量的时候,说清楚你量的是哪一种。

给婴儿卧室量更要注意,目标低于 50 分贝,把这段单独记一下,别和成人混在一起看。

录音别太短,三五秒就够,太长反而把环境起伏平均没了。脚本按整段算平均,短一点更灵敏。

RMS 是均方根,说白了就是这段录音的平均响度。峰值电平是那一瞬间最响的一下,比平均更能暴露削波。

脚本读的是 16 位单声道 WAV。手机录的若是立体声,它会自动取左声道,不影响读数。手机录音常见的 44.1k 采样率它也能直接读,不用先转采样率,省一步麻烦。

04 读数到底意味着什么

第六篇那项 2024 年睡眠医学研究量过。

24 台机器加 6 个 App,最大档全过 85 分贝。App 默认大多在 75 分贝上下。

这些不是吓人的数字,是真实的剂量。

声音不是响一下就完,它按小时往耳朵里累计。

WHO 建议卧室不超 30 dB(A)。NIOSH 给的八小时安全线是 85 dBA。

你亲手量出床头播放时 70 分贝,对照这些数,结论很清楚。

大多数默认档,对着耳朵太响。

NIOSH 那条 85,指的是八小时累计的安全上限,不是睡一晚的阈值。可对着耳朵放一整夜,剂量是按小时往里灌的,低一点才稳。

你量出来的那个数,就是证据,不是商家的宣传。

30 分贝大概是一间安静卧室本来的底噪。75 分贝,差不多是城市主干道贴着窗的量级。

分贝这东西,从第五、第六篇的概念,变成你手里一个能读的数。判断就从“听说”,变成“看见”。

05 今晚可以做的一件事

不用买声级计。手机下个免费声级计 App,或者直接用本篇脚本配手机录音,都行。

量三下。

安静卧室、床头播第七篇那段 pink、播你常听的 App 默认档。你常听的 App 默认档,到底几十分贝?

把三个数字记下来对比,你大概就明白,第六篇为什么说机器默认档往往太响。分析器和生成脚本、测量脚本一样,都是纯标准库,能直接接上。

量的时候手机别贴耳,举在床头和你脑袋差不多的高度最像。一次量不准没关系,连着量三晚,你就能看出自己常待的卧室到底是几十分贝。

对比时别只看一个数。安静卧室、播放时、你常听的 App 档,三个摆一起,差距才看得清。

下一篇,我打算讲怎么把音量拧到安全区。

睡眠这事儿,能自己掌握的部分,尽量自己掌握。

你量出来的床头分贝,记得告诉我。

留言告诉我,我帮你对照那条安全线。晚安。

回首页,搜索你想要的文档

在首页搜索框输入关键词,快速定位资料

文库首页搜索指引 立即搜索

相关学习资料