你有没有想过一个问题:你对着手机唱了一首歌,手机是怎么把「声音」变成「文件」的?
声音是振动 是空气分子被挤压和释放形成的波 这个波是连续的 像一条没有间断的曲线 而计算机是数字的 它只认0和1 只处理离散的数值 一个连续 一个离散 它们之间隔着一道鸿沟
填平这道鸿沟的 是一个叫奈奎斯特-香农采样定理的东西 简称采样定理
采样定理的核心思想其实很朴素 如果你想知道一条连续的曲线长什么样 不需要记住每一个点 只需要每隔一段固定的时间「拍一张快照」 然后用这些快照拼起来 就能还原出原来的曲线
举个例子 假设一段声音的频率是1000Hz(每秒振动1000次) 根据采样定理 你至少要以每秒2000次的速度对它进行采样 这就是著名的「奈奎斯特频率」——采样频率至少要是信号最高频率的两倍
如果你采样率不够 就会发生一个非常有意思的现象 叫做「混叠」 想象一个车轮在电影里看起来在倒转 那是因为摄像机的帧率不够快 车轮每一圈的实际位置被「误读」成了倒退 声音里的混叠也是一样 高频信号会伪装成低频信号混进来 让声音失真
为什么CD用44.1kHz?
人耳能听到的频率范围大约是20Hz到20000Hz(20kHz) 根据采样定理 要完整还原20kHz以内的声音 采样率至少要是40kHz
那为什么CD的标准是44.1kHz而不是刚好40kHz呢 因为抗混叠滤波器不是完美的 它需要一个过渡带 从允许通过的最高频率到完全阻隔的频率之间 有一段「斜坡」 如果采样率卡在40kHz 滤波器的过渡带就会侵入人耳可听范围 影响音质 留出4.1kHz的余量 滤波器就能从容地把20kHz以上的频率干净地切掉
这就解释了为什么44.1kHz成了数字音频的黄金标准
量化:第二步的取舍
采样解决了「什么时候记」的问题 但还有一个问题没解决:每个采样点的值怎么记
声音的振动幅度是连续的 但计算机只能用有限的二进制位数来表示它 这个过程叫量化
如果用的是16位(CD标准) 那就是把振幅范围分成65536个等级 每一个采样点 都被「归入」离它最近的等级
这里就引入了一种不可逆的误差——量化噪声 就像给一座连绵起伏的山脉拍照 像素够高的时候 山峰和山谷的轮廓都清晰 像素不够 山脊就变成了一格一格的锯齿
有意思的是 人类耳朵对量化噪声的敏感度远低于对混叠的敏感度 所以采样定理解决的是「能不能还原」的质变问题 量化解决的是「还原得好不好」的量变问题 一个关乎生死 一个关乎品质
从理论到你口袋里的音乐
今天的流媒体音乐平台 比如Spotify或网易云 通常使用44.1kHz/16位甚至更高的规格来存储母带 但在传输的时候 会用感知编码(比如MP3、AAC)把「人耳听不到的部分」丢掉 基于一个叫心理声学模型的东西
这个模型利用了人类听觉的两个特点:频率掩蔽——一个响亮的频率会盖过它附近较弱的频率 以及时间掩蔽——一个突然的强音会让耳朵在短时间内对弱音不敏感
把这些「听不到」的信息去掉 文件就能压缩到原来的十分之一以下 而人耳几乎察觉不到区别
不止于声音
采样定理的应用远不止音频 数码相机把连续的光信号变成离散的像素 这也是采样 医学上的CT扫描把人体横截面切成一层层的图像 这也是采样 甚至你刷到的这个网页 它显示在屏幕上的每一个字 本质上也是通过采样把矢量轮廓变成了像素点阵
如果说计算机科学有一个最优雅的思想 采样定理一定在其中 它告诉我们:连续的无限世界 可以被离散的有限信息忠实地再现 只要你的采样足够聪明 世界就能在数字空间中完整地活着
而你现在打开音乐APP 点一首歌 耳机里流淌出来的每一个音符 都来自一百多年前 一个数学家对一个物理学问题的回答