2. DSP与降噪基础
各位同学,欢迎来到实战课的第二讲。今天我们要聊的,是DSP移植联调中最基础、也最绕不开的一块——音频信号和噪声模型。说白了,你连信号长什么样、噪声从哪来都搞不清楚,后面调滤波器就是瞎调。
我刚开始做音频算法移植那会儿,就吃过这个亏。有一次把一个降噪算法从PC端往嵌入式平台搬,PC上跑得好好的,一上板子效果全变味。查了三天,最后发现是ADC采样率配置错了,信号已经混叠了,滤波器再努力也白搭。嗯,从那以后,我每次移植第一件事就是检查采样率和信号链路。
2.1 模拟信号与数字信号
咱们先捋清楚这两个概念。
模拟信号,就是自然界里真实存在的信号。比如你说话时声带振动产生的声波,它在时间和幅度上都是连续的。麦克风拾取到的电压变化,也是模拟信号。
数字信号,则是把模拟信号经过采样、量化后得到的离散序列。它在时间上是离散的,在幅度上也是离散的(量化到有限个电平)。
为什么要把好好的模拟信号转成数字的?因为数字信号抗干扰能力强,容易存储、传输和处理。DSP芯片只能处理数字信号,所以ADC(模数转换器)是音频系统的第一道关卡。
核心要点:
- 模拟信号:连续时间 + 连续幅度
- 数字信号:离散时间 + 离散幅度
- ADC完成从模拟到数字的转换
我个人习惯,在项目初期就会把整个信号链路的模拟/数字分界点画清楚。哪一段是模拟域,哪一段是数字域,中间ADC/DAC的参数是什么,心里要有数。
2.2 采样定理——奈奎斯特的底线
采样定理,也叫奈奎斯特采样定理。内容很简单:采样频率必须大于信号最高频率的两倍。
用公式表达就是:
fs > 2 * fmax
其中fs是采样频率,fmax是信号中最高频率分量。
为什么必须这样?因为如果采样率不够,就会发生混叠(Aliasing)——高频信号会伪装成低频信号混进来,你根本分不清哪个是真哪个是假。
避坑指南:
我曾经在一个语音采集项目中,用了8kHz采样率去采集一个包含4.5kHz成分的信号。结果4.5kHz的信号被混叠成了3.5kHz(8-4.5=3.5),滤波器设计全乱套。后来我养成了一个习惯:采样率至少留20%的余量,并且ADC前端一定要加抗混叠滤波器。
常见的音频采样率:
| 采样率 | 典型应用 | 奈奎斯特频率 |
|---|---|---|
| 8 kHz | 电话语音 | 4 kHz |
| 16 kHz | 宽带语音 | 8 kHz |
| 44.1 kHz | CD音质 | 22.05 kHz |
| 48 kHz | 专业音频 | 24 kHz |
你想想看,如果采样率是44.1kHz,理论上能采集22.05kHz以内的信号。人耳能听到20kHz左右,所以CD音质够用了。
2.3 常见噪声类型
噪声无处不在。在DSP移植联调中,你遇到的噪声主要有这么几种。
2.3.1 白噪声
白噪声的功率谱密度在整个频率范围内是常数。也就是说,每个频率上的能量都一样。听起来像收音机没信号时的“嘶嘶”声。
白噪声在时域上,相邻采样点之间是不相关的。它的自相关函数是一个冲激函数。
小技巧:
在测试滤波器时,我经常用白噪声作为输入信号。因为它包含所有频率成分,可以快速检验滤波器的频率响应是否正常。如果白噪声通过滤波器后频谱形状不对,那滤波器肯定有问题。
2.3.2 粉红噪声
粉红噪声的功率谱密度与频率成反比,每倍频程下降3dB。低频能量更多,听起来比白噪声“暖”一些,像瀑布声或雨声。
自然界中很多声音都接近粉红噪声,比如心跳、海浪。音频测试中也常用粉红噪声来模拟真实环境。
2.3.3 脉冲噪声
脉冲噪声是时域上短暂、幅度大的尖峰。比如开关电源的毛刺、静电放电、接触不良时的“咔嗒”声。
这种噪声在频域上能量分布很广,容易干扰整个频段。对付脉冲噪声,通常用中值滤波或限幅器,而不是传统的线性滤波器。
避坑指南:
我曾经在移植一个降噪算法时,发现算法对白噪声和粉红噪声效果很好,但一遇到脉冲噪声就崩溃。后来排查发现,算法里有一个自适应步长更新逻辑,脉冲噪声导致步长瞬间跳变,滤波器发散。解决方案是在算法前端加一个脉冲检测和限幅模块。
三种噪声的对比:
| 噪声类型 | 频谱特性 | 时域特性 | 典型来源 |
|---|---|---|---|
| 白噪声 | 平坦 | 随机、不相关 | 热噪声、量化噪声 |
| 粉红噪声 | 每倍频程-3dB | 低频能量多 | 自然声、环境噪声 |
| 脉冲噪声 | 宽频带 | 短暂尖峰 | 开关毛刺、静电 |
2.4 信噪比(SNR)概念
信噪比,英文Signal-to-Noise Ratio,缩写SNR。它衡量的是有用信号和噪声的功率比值。
公式很简单:
SNR(dB) = 10 * log10( P_signal / P_noise )
其中P_signal是信号功率,P_noise是噪声功率。单位是dB。
举个例子:如果信号功率是噪声功率的100倍,那么SNR = 10 * log10(100) = 20 dB。
SNR越高,说明信号越干净,噪声越少。一般语音通信要求SNR在15dB以上才能听清。高保真音频系统SNR能做到90dB以上。
实际工程中的SNR:
- SNR < 0 dB:信号被噪声淹没,基本不可用
- SNR 0-10 dB:噪声明显,需要降噪处理
- SNR 10-20 dB:可以通信,但质量一般
- SNR > 20 dB:信号质量较好
- SNR > 60 dB:高保真级别
在DSP移植联调中,我经常用SNR来评估降噪效果。算法处理前后的SNR提升量,就是降噪量。比如输入SNR是5dB,输出SNR是15dB,那降噪量就是10dB。
但要注意,SNR只是一个宏观指标。有时候SNR提升了,但语音失真了,听起来反而更差。所以除了SNR,还要结合主观听感来评估。
2.5 本章知识体系
下面这张图,把本章的核心知识点串起来了。你可以把它当作一个快速索引。
这张图从信号基础和噪声模型两个分支展开,最终汇聚到DSP移植联调中的工程实践。你可以看到,采样定理、抗混叠滤波器、SNR评估,这些都是环环相扣的。任何一个环节出问题,最终效果都会打折扣。
好了,这一章的内容就到这里。音频信号和噪声模型是后面所有滤波器设计的基础,把这些概念吃透了,后面调滤波器的时候你才能心里有底。