1. 音频基础与数字信号入门

各位同学好,我是你们这门课的主讲。在正式开始之前,我想先聊聊——为什么我们要花一整章来讲这些看似基础的东西?

我见过太多做语音算法的同学,上来就调模型、跑特征,结果采样率设错了、量化精度不对,折腾半天才发现是基本功没打牢。说白了,音频特征提取的根,就扎在今天的这些概念里。根扎得深,后面才能长得好。

1.1 声音的物理特性:频率、振幅、相位

声音的本质是什么?是振动。空气分子被推来推去,形成疏密波,传到我们耳朵里。这个波有三个核心属性,你搞懂了它们,后面看频谱、看波形图就跟看老朋友一样。

  • 频率(Frequency):单位时间内振动的次数,单位是赫兹(Hz)。人耳能听到的大概是 20 Hz 到 20 kHz。频率决定了音调——频率越高,声音越尖。我在做语音增强项目时,经常要关注 8 kHz 以上的高频噪声,那玩意儿听着刺耳,处理起来也麻烦。
  • 振幅(Amplitude):振动的幅度,决定了音量大小。振幅越大,声音越响。但要注意,人耳对音量的感知不是线性的,这就是为什么我们常用分贝(dB)而不是直接用幅度值。
  • 相位(Phase):描述波形在某个时刻的位置状态,单位是角度或弧度。相位单独听不出来,但它决定了多个声波叠加后的结果。我记得有一次调试麦克风阵列的波束成形,相位差算错了一点点,结果指向性完全偏了——嗯,那是个教训。

核心理解:频率、振幅、相位,这三个参数可以完整描述任何一个正弦波。而任何复杂的音频信号,都可以看作无数个不同频率、振幅、相位的正弦波的叠加——这就是后面傅里叶变换的思想基础。

1.2 模拟信号与数字信号

自然界的声音是连续的,这叫模拟信号。但计算机只能处理离散的0和1。所以我们需要一个转换过程:把连续的模拟信号变成离散的数字信号。

这个过程叫模数转换(ADC)。反过来,把数字信号还原成模拟信号叫数模转换(DAC)。

你想想看,我们平时用的麦克风、扬声器,本质上就是在做这两件事。我早期做嵌入式音频开发时,最头疼的就是ADC的选型——采样率、位深、信噪比,每一项都直接影响最终效果。

特性 模拟信号 数字信号
连续性 连续(时间和幅度都连续) 离散(时间和幅度都量化)
存储 磁带、黑胶唱片 硬盘、内存、SD卡
抗干扰 差,易受噪声影响 强,可纠错、可压缩
处理 模拟电路(运放、滤波器) DSP、CPU、GPU

1.3 采样定理与量化

好,现在问题来了:要把模拟信号变成数字信号,该怎么做?两个关键步骤:采样和量化。

采样定理(Nyquist-Shannon)

采样定理说:要无失真地重建一个信号,采样频率必须至少是信号最高频率的两倍。

公式很简单:f_s ≥ 2 × f_max

举个例子:人声的最高频率大约在 8 kHz,所以电话系统用 8 kHz 采样就够了。但音乐里有 20 kHz 的高频,所以 CD 用 44.1 kHz 采样。为什么是 44.1?不是刚好 40?这里面有历史原因,跟录像带的格式有关——我当年看到这个数字也觉得奇怪,后来查了资料才明白。

避坑指南:我曾经在一个项目里,为了省存储空间,把采样率从 16 kHz 降到了 8 kHz。结果语音识别准确率直接掉了 15 个点。后来才发现,8 kHz 虽然能覆盖人声基频,但很多辅音(比如 /s/、/f/)的高频信息被切掉了。所以,采样率的选择一定要看你的应用场景。

量化

采样把时间离散化了,量化则把幅度离散化。每个采样点的幅度值,用一个有限位数的二进制数来表示。

  • 位深(Bit Depth):常用 8 bit、16 bit、24 bit、32 bit。位深越大,动态范围越大,量化噪声越小。
  • 量化噪声:量化过程会引入误差,这个误差表现为噪声。每增加 1 bit,信噪比大约提升 6 dB。

我个人的习惯是:语音识别用 16 bit 就够了,音乐制作至少 24 bit,做声学测量或科研实验,我会用 32 bit 浮点。

小技巧:如果你在 Python 里用 librosa.load() 读音频,默认会转成 32 bit 浮点(范围 -1.0 到 1.0)。但写回文件时,记得根据目标格式做缩放和类型转换,否则会听到爆音。

1.4 音频文件格式解析

讲完采样和量化,我们来看看实际工程中常见的音频文件格式。你可能会觉得这很简单,不就是个文件后缀吗?但格式选不对,轻则浪费存储,重则影响算法效果。

WAV(Waveform Audio File Format)

WAV 是微软和 IBM 联合开发的,本质上是 RIFF(Resource Interchange File Format)的一种。它不压缩(或者用无损压缩),所以音质最好,但文件也最大。

WAV 文件结构很简单:一个文件头 + 数据块。文件头里记录了采样率、位深、声道数等信息。

// WAV 文件头结构(44 字节)
// 偏移  长度  描述
// 0      4     "RIFF" 标识
// 4      4     文件大小 - 8
// 8      4     "WAVE" 标识
// 12     4     "fmt " 子块标识
// 16     4     子块大小(16 或 18)
// 20     2     音频格式(1 = PCM)
// 22     2     声道数
// 24     4     采样率
// 28     4     字节率
// 32     2     块对齐
// 34     2     位深
// 36     4     "data" 子块标识
// 40     4     数据大小
// 44     ...   音频数据

我在做嵌入式开发时,经常要手动解析 WAV 头——因为有些低端 MCU 没有现成的库。你如果也遇到类似情况,记住这个结构就够了。

MP3(MPEG-1 Audio Layer 3)

MP3 是有损压缩格式。它利用人耳的听觉掩蔽效应,把听不到或不太敏感的频率成分去掉,从而大幅压缩数据。

压缩比通常在 10:1 到 12:1 之间。128 kbps 的 MP3 听起来跟 CD 差别不大,但文件只有原来的十分之一。

但要注意:MP3 是有损的,不适合做精确的声学分析。我见过有人拿 MP3 做语音情感识别,结果特征提取出来全是压缩伪影——那效果,不提也罢。

AAC(Advanced Audio Coding)

AAC 是 MP3 的继任者,在相同码率下音质更好。它是 MPEG-4 标准的一部分,也是 YouTube、iTunes 等平台的首选格式。

AAC 支持更多采样率、更多声道(最高 48 声道),编码效率比 MP3 高 30% 左右。

格式 压缩方式 典型码率 适用场景
WAV 无压缩 / 无损 1411 kbps (CD) 专业录音、算法开发、科研
MP3 有损 128 - 320 kbps 音乐分发、播客、便携播放
AAC 有损 64 - 256 kbps 流媒体、视频、移动设备

工程建议:做音频算法开发时,永远用 WAV 格式作为中间存储。等算法稳定了,再根据产品需求决定是否转成 MP3 或 AAC。这样可以避免压缩带来的不确定性。

1.5 本章知识体系总览

下面这张图,把今天讲的核心概念串起来了。你可以把它当作一个思维导图,后面每学一个新知识点,都可以往这张图上挂。

音频基础与数字信号入门知识体系 音频信号处理 声音物理特性 模数转换 文件格式 频率 (Hz) 振幅 (dB) 相位 (°) 采样定理 量化 (bit) WAV (无损) MP3 (有损) AAC (有损) 核心思想 任何音频信号都可以分解为不同频率、振幅、相位的正弦波叠加 数字化的本质:采样(时间离散化)+ 量化(幅度离散化) 格式选择取决于应用场景:开发用 WAV,产品用 MP3/AAC

好了,第一章的内容就到这里。这些概念看起来简单,但它们是后面所有算法的基础。我建议你找个 WAV 文件,用 Python 的 struct 库手动解析一下文件头,看看采样率、位深、声道数是不是跟文件属性里显示的一致——这个练习能帮你把今天讲的东西真正吃透。