声音

感受 [声音 sound] 是人类的本能。音乐、说话、风吹草动虫鸣鸟叫等等声响,都是 [声音 sound]。
与科技装置有关系的声音,则称作 [声音 audio] 。电视播放的声音、电话通话的声音等等,都是 [声音 audio]。

声音源自振动。耳膜感受空气振动,在脑中产生声觉。

右图描绘了一个最基本的正弦图像:$sin(x)$



量化声音

要让电脑处理声音,必须预先让声音变成数字,也就是让声音经过 [取样 Sampling] 与 [量化 Quantization] 两个过程。取样把时间变成离散数据,量化把振幅变成离散数据。

先取样(得到数列),再量化(四舍五入),最后得到一串数列。每个数字称作 [样本 Sample] 或 [信号 Signal]。

在图中,红色点为量化的离散数据,绿色点为取样的离散数据

时间:${-\pi , -\frac{\pi}{2}, 0, \frac{\pi}{2}, \pi}$
振幅:${sin(-\pi) , sin(-\frac{\pi}{2}), 0, sin(\frac{\pi}{2}), sin(\pi)}$

[取样 Sampling] 与 [量化 Quantization] 的关键参数:

  1. Duration (dur) 持续时间:声音总共有多少秒。数值越高,信号越多。
  2. Sampling Rate (fs) 采样率:一秒钟有多少个信号。数值越高,音质越好。电脑的声音档案,通常采用 48000Hz44100Hz 的采样率。手机与电话的声音传输,公定为 8000Hz
  3. Bit Depth (bit) 位深度:一个信号需要多少个位元。数值越高,音质越好。电脑的声音档案,通常是 16-bit24-bit16-bit 的每个信号是 [-32768, +32767] 的整数,符合 C 语言的 short 类型。
  4. Channel 声道:同时播放的声音信号总共几条。

顺便一提,不管是声音或者是其他信息,只要是经过取样与量化得到的数据,总称 PCM data 脉冲编码调制(Pulse Code Modulation, PCM)

这里就使用C++创建一个PCM数组。

int chn = 2;               // channel
int fs = 48000;            // sampling rate (times/second)
int t = 1;                 // duration      (second)
int n = fs * t * chn;      // sample number (times)
auto pcm = new short[n];   // PCM data