ARTICLE · 1292913
白噪音最该量的,不是 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 档,三个摆一起,差距才看得清。
下一篇,我打算讲怎么把音量拧到安全区。
睡眠这事儿,能自己掌握的部分,尽量自己掌握。
你量出来的床头分贝,记得告诉我。
留言告诉我,我帮你对照那条安全线。晚安。















































































