3. 声卡硬件基础:数字信号处理(DSP)、数模转换(DAC)、模数转换(ADC)、采样率、位深、声道数
在深入 ALSA 工具链之前,必须理解声卡硬件的核心构成。声卡的本质是一个混合信号系统,它同时处理数字信号和模拟信号。本章将拆解声卡的关键硬件单元:DSP、DAC、ADC,以及决定音频质量的三大参数:采样率、位深、声道数。
核心概念: 数字音频信号在进入扬声器(模拟)之前,必须经过“数字→模拟”的转换;麦克风采集的模拟声音进入计算机前,必须经过“模拟→数字”的转换。DSP 则负责在数字域对音频数据进行加工。
3.1 声卡硬件架构总览
现代声卡(无论是独立声卡还是 SoC 内置编解码器)通常遵循以下数据流架构。理解这个流程是配置 ALSA 参数的前提。
3.2 数字信号处理 (DSP)
DSP 是声卡的数字大脑。它不直接处理模拟信号,而是对 PCM(脉冲编码调制)数据进行运算。在嵌入式 Linux 声卡中,DSP 可能是一个独立的硬件单元,也可能是 SoC 中的协处理器。
3.2.1 DSP 的典型功能
- 采样率转换 (SRC): 将音频流从一个采样率转换为另一个采样率(例如 48kHz → 44.1kHz)。
- 混音 (Mixer): 将多个数字音频流叠加成一个输出流。
- 滤波与均衡 (EQ): 实现低通、高通、带通滤波或图形均衡器。
- 音量控制: 在数字域调整增益,避免模拟电路的噪声。
- 效果处理: 回声、混响、噪声抑制等。
ALSA 视角: 在 ALSA 中,DSP 功能通常通过
dmix(混音)、plug(采样率/格式转换)等插件层实现。硬件 DSP 则通过 snd_kcontrol 接口暴露给用户空间。
3.3 数模转换 (DAC) 与模数转换 (ADC)
DAC 和 ADC 是连接数字世界与模拟世界的桥梁。它们的性能直接决定了声卡的音质上限。
| 特性 | DAC (数模转换) | ADC (模数转换) |
|---|---|---|
| 方向 | 数字 → 模拟 | 模拟 → 数字 |
| 应用 | 播放音频到扬声器/耳机 | 从麦克风/线路输入录音 |
| 关键指标 | 信噪比(SNR)、总谐波失真(THD+N)、动态范围 | 信噪比(SNR)、总谐波失真(THD+N)、动态范围 |
| 时钟要求 | 低抖动时钟,保证模拟输出波形平滑 | 低抖动时钟,保证采样精度 |
| ALSA 设备 | hw:0,0 (播放子设备) |
hw:0,0 (录音子设备) |
3.4 采样率 (Sample Rate)
采样率表示每秒对模拟信号采样的次数,单位是 Hz(赫兹)。根据奈奎斯特采样定理,采样率必须至少为信号最高频率的两倍,才能无失真地重建信号。
3.4.1 常见采样率标准
| 采样率 | 常用场景 | 理论最高频率 |
|---|---|---|
| 8 kHz | 电话语音、对讲系统 | 4 kHz |
| 16 kHz | VoIP、语音识别 | 8 kHz |
| 44.1 kHz | CD 音频、MP3 文件 | 22.05 kHz |
| 48 kHz | DVD、电影、专业音频设备 | 24 kHz |
| 96 kHz | 高清音频、录音棚 | 48 kHz |
| 192 kHz | 超高保真音频、专业母带 | 96 kHz |
驱动配置陷阱: 声卡硬件支持的采样率是有限的。ALSA 驱动必须正确报告硬件支持的采样率列表。如果应用程序请求硬件不支持的采样率,驱动需要返回错误,或者通过
plug 插件进行隐式采样率转换(这会增加 CPU 负载和延迟)。
3.5 位深 (Bit Depth)
位深决定了每个采样点能够表示的动态范围(音量精度)。位深越大,量化噪声越低,信噪比越高。
3.5.1 位深与动态范围
动态范围的理论计算公式:动态范围 (dB) ≈ 6.02 × N + 1.76,其中 N 为位深。
| 位深 | 理论动态范围 | 量化等级数 | 常见用途 |
|---|---|---|---|
| 8 位 | ~49.9 dB | 256 | 早期游戏、低质量语音 |
| 16 位 | ~96.3 dB | 65,536 | CD 音频、标准 WAV 文件 |
| 24 位 | ~144.5 dB | 16,777,216 | 录音棚、高清音频、混音 |
| 32 位浮点 | ~1528 dB (理论) | 极高精度 | DAW 内部处理、音频插件 |
ALSA 格式表示: 在 ALSA 中,位深通过
snd_pcm_format_t 枚举定义。例如 SND_PCM_FORMAT_S16_LE 表示有符号 16 位小端格式,SND_PCM_FORMAT_S24_LE 表示有符号 24 位小端格式。驱动必须正确设置 format 掩码。
3.6 声道数 (Channels)
声道数表示音频流中包含的独立音频通道数量。每个声道对应一个独立的扬声器或麦克风信号。
3.6.1 常见声道配置
| 声道数 | 名称 | 布局 | 应用 |
|---|---|---|---|
| 1 | 单声道 (Mono) | 中央 | 语音、电话、对讲 |
| 2 | 立体声 (Stereo) | 左、右 | 音乐、电影、游戏 |
| 4 | 四声道 (Quad) | 前左、前右、后左、后右 | 早期环绕声 |
| 6 | 5.1 环绕声 | 前左、前右、中置、低音、后左、后右 | 家庭影院、游戏 |
| 8 | 7.1 环绕声 | 前左、前右、中置、低音、侧左、侧右、后左、后右 | 高端游戏、专业影院 |
3.7 三参数的关系与 ALSA 配置
采样率、位深、声道数共同决定了音频数据流的带宽(比特率)。
比特率计算公式: 比特率 (bps) = 采样率 (Hz) × 位深 (bits) × 声道数
例如:CD 音质的比特率 = 44100 × 16 × 2 = 1,411,200 bps ≈ 1.41 Mbps。
在 ALSA 驱动中,这三个参数通过 snd_pcm_hw_params_t 结构体进行配置。驱动必须提供硬件支持的参数范围(最小/最大值),应用程序在此范围内选择具体值。
// ALSA 驱动中设置硬件参数的典型流程
snd_pcm_hw_params_t *params;
snd_pcm_hw_params_any(handle, params);
// 设置采样率
unsigned int rate = 48000;
snd_pcm_hw_params_set_rate_near(handle, params, &rate, 0);
// 设置位深 (格式)
snd_pcm_hw_params_set_format(handle, params, SND_PCM_FORMAT_S16_LE);
// 设置声道数
unsigned int channels = 2;
snd_pcm_hw_params_set_channels_near(handle, params, &channels);
// 应用参数
snd_pcm_hw_params(handle, params);
硬件约束检查: 并非所有采样率、位深、声道数的组合都是硬件支持的。例如,某些声卡在 192kHz 采样率下只支持 2 声道,不支持 6 声道。驱动开发者在实现
hw_params 回调时,必须严格校验参数组合的合法性,避免硬件进入未定义状态。
3.8 本章小结
- 声卡硬件由 DSP(数字处理)、DAC(播放转换)、ADC(录音转换)三大核心单元组成。
- 采样率 决定频率响应上限,位深 决定动态范围,声道数 决定空间维度。
- ALSA 驱动通过
hw_params接口暴露硬件支持的参数范围,应用程序在此范围内选择配置。 - 理解这些硬件基础是后续配置 ALSA 工具链(如
aplay、arecord、amixer)的前提。