数字信号处理基础:采样定理、量化与编码、时域与频域表示、傅里叶变换(DFT/FFT)简介
各位同学,欢迎来到第三讲。
说实话,自适应降噪算法玩得再花哨,根基还是数字信号处理。这一章,咱们就把地基夯实了。我会把采样定理、量化编码、时频域概念和傅里叶变换串起来讲。你想想看,麦克风采集到的声音,从模拟世界进入数字芯片,中间到底经历了什么?
3.1 采样定理:别让信号“说谎”
先问个问题:为什么CD的采样率是44.1kHz?
答案就是奈奎斯特采样定理。简单说:采样频率必须大于信号最高频率的两倍。否则,高频信号会伪装成低频信号混进来,这就是“混叠”。
核心公式: fs > 2 × fmax
工程上一般取 2.5~4 倍,留点余量。
我在项目中遇到过一件事。有一次调试ANC耳机,低频降噪效果很好,但总觉得有“嘶嘶”声。查了半天,发现是ADC采样率设成了32kHz,而麦克风能拾取到15kHz的环境噪声。按照采样定理,15kHz的信号需要至少30kHz的采样率,32kHz勉强够,但抗混叠滤波器不够陡,导致部分高频分量折叠到了可听频段。嗯,后来把采样率提到48kHz,问题就解决了。
避坑指南: 我曾经以为只要采样率够高就行,忽略了抗混叠滤波器。记住:采样定理的前提是信号已经限带。如果前端没有低通滤波器,采样率再高也没用。
3.2 量化与编码:精度与噪声的博弈
采样把时间离散化了,量化则把幅度离散化。说白了,就是把连续的电压值,映射到有限的二进制码上。
量化过程一定会引入误差,我们叫它量化噪声。量化位数每增加1位,信噪比提升约6dB。16位量化,理论动态范围是96dB;24位就是144dB。
| 量化位数 | 动态范围(理论) | 典型应用 |
|---|---|---|
| 8 bit | 48 dB | 语音通信 |
| 16 bit | 96 dB | CD、WAV |
| 24 bit | 144 dB | 专业录音、ANC参考信号 |
我个人习惯在自适应降噪系统中,至少用24位ADC。为什么?因为降噪算法需要处理很微弱的误差信号,如果量化噪声太大,算法会误判,导致收敛不稳定。
编码方式也有讲究。线性PCM最直接,但数据量大。像μ-law、A-law这种非线性编码,在语音通信里很常见——人耳对小声更敏感,所以用小步长量化小声,大步长量化大声。
小技巧: 如果你在做嵌入式降噪,内存紧张,可以考虑用16位线性PCM配合动态范围压缩。我在一个低功耗蓝牙耳机项目里就这么干过,效果还不错。
3.3 时域与频域:同一枚硬币的两面
时域,就是信号随时间怎么变。你看到的一条波形,横轴是时间,纵轴是幅度。频域,则是信号由哪些频率成分组成。横轴是频率,纵轴是幅度或相位。
为什么降噪算法要跑到频域去做?因为人耳对频率的感知是“对数”的,而且噪声往往集中在某些频段。在时域里,噪声和语音混在一起,很难分开。到了频域,你可以精准地“削掉”某个频段的噪声,而不影响其他频段。
举个例子:空调的嗡嗡声,频率大概在50Hz~100Hz。在时域波形里,它和语音叠加在一起,你很难直接滤除。但在频域里,你一眼就能看到那个低频的“尖峰”,直接衰减它就行了。
我的理解: 时域是“原汁原味”的物理世界,频域是“分析加工”的数学世界。做降噪,你得学会在这两个世界之间自由切换。
3.4 傅里叶变换:从时域到频域的“翻译官”
傅里叶变换,就是把时域信号分解成不同频率的正弦波。数学公式看着吓人,但核心思想很简单:任何周期信号,都可以看作一系列正弦波的叠加。
实际系统中,我们处理的是离散的、有限长的数字信号。所以用的是离散傅里叶变换(DFT)。DFT的计算量很大,N点DFT需要N²次复数乘法。直到快速傅里叶变换(FFT)出现,才把计算量降到N·log₂(N)。
举个例子:1024点的DFT,需要约100万次运算。而FFT只需要约1万次。差了100倍!
// 一个简单的FFT使用示例(伪代码)
// 假设 audio_buffer 是时域数据,长度1024
complex[] freq_data = FFT(audio_buffer, 1024);
// 现在 freq_data[0] 是直流分量
// freq_data[1] 对应频率 = 采样率 / 1024
// freq_data[k] 对应频率 = k * 采样率 / 1024
// 做降噪处理:比如衰减低频
for (int k = 0; k < 10; k++) {
freq_data[k].magnitude *= 0.1; // 衰减前10个频点
}
// 逆变换回时域
complex[] output_buffer = IFFT(freq_data, 1024);
我在做ANC滤波器设计时,经常用FFT来观察误差麦克风的频谱。如果看到某个频点有异常凸起,就知道该调整那个频段的滤波器系数了。
注意: FFT有个“频谱泄露”的问题。因为我们对无限长的信号做了“截断”,相当于加了一个矩形窗。这会导致频谱能量扩散到相邻频点。解决办法是加窗函数,比如汉宁窗、海明窗。我习惯用汉宁窗,旁瓣衰减快,适合音频处理。
3.5 知识体系总览
下面这张图,把本章的核心逻辑串起来了。从模拟信号到数字信号,再到频域分析,每一步都有坑,也都有技巧。
好了,这一章的内容就这些。采样定理、量化编码、时频域概念、FFT,这四个点串起来,就是数字信号处理的骨架。后面讲具体降噪算法时,你会发现这些基础概念无处不在。
个人建议: 如果你刚开始接触这些概念,别急着啃公式。先动手用Python或MATLAB写一段代码:生成一个正弦波,加噪声,做FFT看看频谱,再做个低通滤波。亲手跑一遍,比看十遍书都管用。