要求未压缩采样声音的大小,把 采样率 × 位深度 × 时长(秒)× 声道数 相乘,再除以 8 得到字节。当题目给出录音长度和质量设置,并问需要多少存储时,就会用到它。
它的思路与图像大小相同:数出项目的个数,乘以每个项目的位数,再换算单位。
计算机如何存储声音?
声音是连续的波。要存储它,计算机每秒多次测量声波的高度。每一次测量就是一个采样,每秒的采样数就是采样率(sample rate),单位是赫兹(Hz)。
每个采样存成一个二进制数。所用的位数称为采样分辨率或位深度。采样率和位深度越高,声波捕捉得越准确,文件也越大。
一步一步怎么算?
- 把时间换成秒(分钟 × 60)。
- 求采样总数: 采样率 × 秒数。
- 乘以位深度,得到每个声道的位数。
- 乘以声道数(单声道为 1,立体声为 2)。
- 除以 8 得到字节,再按指定约定换算单位。
同一个方法写成剑桥风格的伪代码:
INPUT Rate, Depth, Seconds, Channels
Bits ← Rate * Depth * Seconds * Channels
Bytes ← Bits / 8
OUTPUT Bytes
追踪 Rate = 44100、Depth = 16、Seconds = 10、Channels = 1:Bits = 44 100 × 16 × 10 × 1 = 7 056 000,所以 Bytes = 882 000。
例题
一段语音备忘录长 30 秒,以单声道、8 000 Hz、8 位采样分辨率录制。求未压缩大小,分别用字节和 KiB 表示(1 KiB = 1 024 字节)。
第 1 步,采样数: 8 000 × 30 = 240 000 个采样。
第 2 步,位数: 240 000 × 8 = 1 920 000 位。
第 3 步,字节数: 1 920 000 ÷ 8 = 240 000 字节。
第 4 步,KiB: 240 000 ÷ 1 024 = 234.375 KiB。
检查: 每个采样是 8 位,正好是 1 字节,所以字节数等于采样数:240 000。结果一致。
假设: 没有压缩、没有元数据、单声道。
要留意的错误
常见的失误是时间仍用分钟。
错误的答案: 一段 2 分钟的片段,44 100 Hz、16 位、单声道。位数 = 44 100 × 16 × 2 = 1 411 200。
学生乘了 2 分钟,但采样率计算的是每秒的采样数。
纠正:2 分钟 = 120 秒。
位数 = 44 100 × 16 × 120 = 84 672 000 位 = 10 584 000 字节。错误的答案小了 60 倍。计算时在每个数字旁边写上单位,就能发现这个错误。
自我检测
写出每一步,然后打开答案。
1. 一段 1 分钟的单声道录音以 22 050 Hz、16 位采样录制。需要多少字节?
显示答案
秒数 = 60。位数 = 22 050 × 16 × 60 = 21 168 000。字节数 = 21 168 000 ÷ 8 = 2 646 000 字节。
2. 一段 5 秒的立体声片段以 48 000 Hz、24 位采样录制。需要多少字节?
显示答案
位数 = 48 000 × 24 × 5 × 2 = 11 520 000。字节数 = 11 520 000 ÷ 8 = 1 440 000 字节。
3. 一段录音在采样率 40 000 Hz 时为 100 KiB。同一段录音改用 20 000 Hz 重录,其他条件不变。新的大小是多少?
显示答案
大小与采样率成正比,采样率减半,所以大小也减半:50 KiB。
接下来学什么
庞大的原始文件正是压缩存在的原因,所以接着学习无损压缩与有损压缩。你也可以在 Python 推理沙盒里把公式写成代码来核对算术,再到练习集里检验全部内容。
如果你知道公式,却在考试压力下漏掉一个因子,老师可以观察你的过程,找出你容易跳过的是哪个量,这是线上一对一计算机科学补习可以做到的。