1. 音频信号基础:采样率、量化位数、声道数、奈奎斯特定理
各位同学好,欢迎来到《声学特征提取实战技巧》的第一章。
做音频处理这么多年,我见过太多人一上来就调库、跑模型,结果数据预处理那关就翻车了。说白了,音频信号的基础概念就像房子的地基——你地基没打牢,后面盖多高的楼都得塌。今天咱们就把这四个核心概念掰开揉碎了讲清楚。
1.1 采样率:时间轴上的「快照」频率
先问个问题:声音明明是连续的波,计算机怎么存?
答案是——每隔一小段时间拍一张「快照」,记录下当时的振幅值。这个拍快照的频率,就是采样率。
采样率定义:每秒从连续信号中提取的样本点数,单位是 Hz(赫兹)。
例如 44100 Hz,意思是一秒钟拍了 44100 张「快照」。
常见的采样率有哪些?我整理了一张表,你一看就明白:
| 采样率 | 常见场景 | 最高可还原频率 |
|---|---|---|
| 8000 Hz | 电话语音 | 4000 Hz |
| 16000 Hz | 语音识别、语音助手 | 8000 Hz |
| 44100 Hz | CD 音质、音乐 | 22050 Hz |
| 48000 Hz | 影视、专业音频 | 24000 Hz |
| 96000 Hz | 高解析度音频 | 48000 Hz |
我个人习惯做语音特征提取时用 16000 Hz,做音乐分析用 44100 Hz。为什么?因为人声的主要能量集中在 4-8 kHz 以内,16000 Hz 的采样率足够覆盖了,再高就是浪费算力。
1.2 奈奎斯特定理:采样率的「天花板」
好,采样率定下来了,那它能采到多高的频率?
这就引出了数字信号处理里最核心的一条定理——奈奎斯特定理。
奈奎斯特定理:采样率必须大于信号最高频率的两倍,才能无失真地重建原始信号。
公式:f_s > 2 × f_max
换句话说,如果你用 44100 Hz 采样,能还原的最高频率是 22050 Hz。人耳能听到的上限大约是 20000 Hz,所以 CD 音质定在 44100 Hz 是有道理的。
我曾经在项目里踩过一个坑:采集超声波传感器数据时,信号频率是 30 kHz,我随手用了 48 kHz 的采样率。结果数据出来全是混叠失真,根本没法用。后来才反应过来——48 kHz 只能采到 24 kHz,30 kHz 的信号被「折叠」回来了。嗯,从那以后我每次选采样率之前,都会先确认信号的最高频率。
避坑指南:采样前一定要加抗混叠滤波器!把高于 f_s/2 的频率成分滤掉,否则混叠失真会让你怀疑人生。
1.3 量化位数:振幅轴上的「精度」
采样解决了时间轴上的连续性问题,那振幅轴呢?
量化位数决定了每个样本点用多少 bit 来表示。常见的量化位数有:
- 8 bit:256 个等级,早期电话、低质量语音
- 16 bit:65536 个等级,CD 音质、WAV 文件标准
- 24 bit:16777216 个等级,录音棚、专业制作
- 32 bit float:浮点数表示,动态范围极大,常用于内部处理
量化位数越高,动态范围越大,信噪比越高。每增加 1 bit,动态范围大约提升 6 dB。
公式很简单:动态范围 ≈ 6.02 × N + 1.76 dB,其中 N 是量化位数。
举个例子:16 bit 的动态范围大约是 96 dB,24 bit 大约是 144 dB。你想想看,一个安静的录音棚背景噪声可能只有 20 dB,而交响乐高潮能到 120 dB,这 100 dB 的动态范围,16 bit 刚好够用,24 bit 就游刃有余了。
我的建议:做特征提取时,如果原始数据是 16 bit,直接读进来用就行。如果是 24 bit,建议先归一化到 [-1, 1] 的浮点数范围,再进行处理。32 bit float 格式在 Python 里处理最方便,但文件体积也最大。
1.4 声道数:空间维度的「耳朵」数量
声道数这个概念最简单,但也最容易被人忽略。
- 单声道 (Mono):1 个声道,所有声音混在一起
- 立体声 (Stereo):2 个声道,左 + 右
- 多声道 (5.1 / 7.1):多个声道,环绕声
做声学特征提取时,大部分情况下我们会把多声道混成单声道来处理。为什么?因为特征提取关注的是声音本身的频率和能量分布,声道信息反而会增加计算量。
不过也有例外。我记得有一次做声源定位项目,需要利用左右声道的相位差来估计声源方向,这时候就必须保留立体声信息。
实用技巧:用 Python 读取音频时,可以用 soundfile 或 librosa 指定 mono=True 自动混音。如果后续需要做空间音频分析,再保留多声道。
1.5 知识体系总览
这四个概念之间的关系,我画了一张图帮你理清思路:
从这张图可以看得很清楚:模拟信号经过采样和量化,变成了数字信号。而采样率、量化位数、声道数,就是描述这个数字信号的三个核心维度。
1.6 实战:用 Python 查看音频文件属性
光说不练假把式。咱们用 Python 实际读一个音频文件,看看这些参数长什么样。
import soundfile as sf
import librosa
# 方法一:用 soundfile 读取
file_path = "example.wav"
data, sr = sf.read(file_path)
print(f"采样率: {sr} Hz")
print(f"数据形状: {data.shape}") # (样本点数, 声道数)
print(f"数据类型: {data.dtype}") # 量化位数信息
# 方法二:用 librosa 读取(自动混音为单声道)
data_mono, sr = librosa.load(file_path, sr=16000, mono=True)
print(f"重采样后采样率: {sr} Hz")
print(f"单声道数据长度: {len(data_mono)} 个样本")
print(f"时长: {len(data_mono) / sr:.2f} 秒")
小提示:librosa.load 默认会重采样到 22050 Hz,并且混音为单声道。如果你需要保留原始采样率和声道数,记得设置 sr=None 和 mono=False。
1.7 本章小结
好,咱们把这一章的核心内容捋一遍:
- 采样率:决定时间轴上的分辨率,也决定了能还原的最高频率(奈奎斯特定理)
- 量化位数:决定振幅轴上的精度,影响动态范围和信噪比
- 声道数:决定空间维度,大部分特征提取场景会混音为单声道
- 奈奎斯特定理:采样率必须大于信号最高频率的两倍,否则会产生混叠失真
这四个概念是音频处理的基石。你以后不管做什么——语音识别、音乐信息检索、声学场景分类——都绕不开它们。把基础打扎实了,后面的路就好走了。