1. 课程导入
各位同学好,我是老张。做音频DSP这行快十五年了,踩过的坑比走过的路还多。今天咱们开始第一讲,聊聊数字音频最底层的那些事儿。
很多人觉得基础不重要,上来就撸代码。我年轻时也这样,结果调一个降噪算法调了三个月,最后发现是采样率配置错了。嗯,从那以后我再也不敢跳过基础了。
1.1 数字音频原理:从模拟到数字
声音本质上是空气的振动。麦克风把这种振动变成连续的电压信号,这就是模拟音频。但计算机不认连续的东西,它只认0和1。所以我们必须把模拟信号变成离散的数字序列。
这个过程分三步:
- 采样:在时间轴上每隔固定间隔取一个值
- 量化:把采样得到的连续幅度值近似成有限个离散等级
- 编码:把量化后的数值用二进制表示
说白了,就是用一串数字去"骗"过你的耳朵。只要数字够密、够精确,人耳就听不出区别。
核心公式:数字音频数据量 = 采样率 × 位深度 × 声道数
举个例子:CD音质是 44100 Hz × 16 bit × 2 = 1411200 bps ≈ 172 KB/s
1.2 采样定理:奈奎斯特的"铁律"
采样定理是音频DSP的基石。它说:要无失真地重建一个信号,采样频率必须至少是信号最高频率的两倍。
为什么会这样?我画个图你就明白了。
你想想看,如果采样频率不够,高频信号会被"伪装"成低频信号。这就是混叠(Aliasing)。我在做车载麦克风阵列时遇到过这个问题——风噪的高频成分混叠到了语音频段,怎么降噪都去不掉。后来加了一级模拟抗混叠滤波器才解决。
避坑指南:我曾经在一个项目里直接用44.1kHz采样率采集22kHz以上的超声波信号,结果解调出来的全是假信号。记住:采样前必须做抗混叠滤波,这是铁律。
1.3 量化与编码:精度与噪声的博弈
采样解决了时间离散化的问题,量化解决幅度离散化的问题。量化就是把连续的幅度值映射到有限个离散等级上。
| 位深度 | 量化等级数 | 动态范围 | 典型应用 |
|---|---|---|---|
| 8 bit | 256 | 48 dB | 语音通信、对讲机 |
| 16 bit | 65536 | 96 dB | CD、WAV标准格式 |
| 24 bit | 16777216 | 144 dB | 录音棚、专业音频 |
| 32 bit float | 约4.3×10⁹ | 理论无限 | DSP内部处理、DAW |
量化会产生误差,这个误差就是量化噪声。量化噪声的功率是固定的:
量化噪声功率 = Δ² / 12
其中 Δ = 满量程电压 / 2^(位深度)
每增加1 bit,信噪比提升约6 dB。16 bit的理论信噪比是96 dB,这已经超过了人耳的动态范围。但为什么还要用24 bit?因为DSP处理过程中会有中间计算误差,多出来的bit是留给算法"挥霍"的。
我的习惯:在定点DSP上做算法时,我一般用Q15格式(16 bit定点)做输入输出,但内部累加器至少保留32 bit。这样既能保证精度,又不会溢出。这个习惯帮我避免了很多次"听起来有爆音"的bug。
1.4 音频DSP系统架构
一个完整的音频DSP系统,从麦克风到扬声器,中间要经过好几道关卡。我画个架构图给你看。
这个架构图里,我特别想强调几个点:
- 模拟前端:很多人只关注DSP算法,忽略了模拟前端。其实模拟前端的噪声和失真,数字域再怎么处理也救不回来。我见过一个项目,ADC的SNR是120 dB,但前端运放只用了便宜的型号,结果系统底噪高了20 dB。
- ADC/DAC:采样率和位深度的选择直接影响系统性能。我个人习惯在选型时留20%的余量——比如目标带宽20 kHz,我会选48 kHz采样率,而不是刚好44.1 kHz。
- DSP核心:这是算法的战场。定点还是浮点?单核还是多核?要不要硬件加速器?这些选择决定了你能跑多复杂的算法。
- 控制总线:I²C用来配置codec参数,SPI用来传输音频流。延迟要求高的场景,我建议用I²S直连,绕过控制总线的握手开销。
性能优化的第一原则:在系统架构层面,瓶颈往往不在DSP算力,而在数据搬运。我曾经把一个算法的计算量优化了50%,但帧率只提升了5%。后来发现瓶颈在DMA传输——数据从ADC到内存的路径上有个不必要的memcpy。去掉之后,帧率直接翻倍。
1.5 本章小结
这一章我们聊了数字音频的三大基石:采样、量化、编码。采样定理告诉我们频率要够,量化告诉我们精度要够,编码告诉我们格式要选对。系统架构则把这些串起来,形成一个完整的信号链路。
你想想看,从麦克风振动到扬声器发声,中间经历了模拟→数字→模拟的转换,每一步都有取舍。做音频DSP优化,本质上就是在这些取舍中找到最佳平衡点。