1. 音频DSP基础概念:数字信号处理到底在做什么?

各位同学好,我是老周。做音频DSP这行十几年了,今天咱们聊聊最基础的东西——数字信号处理。说白了,就是把声音这种连续的物理量,变成计算机能处理的数字,然后再变回来。

你可能会问:声音不是耳朵听的吗?为什么要折腾成数字?嗯,因为数字信号稳定、可复制、还能做各种神奇的运算。我当年刚入行时也觉得这玩意儿抽象,直到第一次用DSP芯片把一段嘈杂的录音变得清晰可辨——那种感觉,就像变魔术。

1.1 什么是数字信号处理?

数字信号处理,英文叫Digital Signal Processing,简称DSP。它研究的是怎么用数字方式对信号进行变换、分析和增强。

拿音频来说:

  • 模拟信号:麦克风拾取的声音,是连续变化的电压
  • 数字信号:ADC(模数转换器)把电压变成一串数字
  • 处理:CPU或DSP芯片对这些数字做运算(滤波、压缩、降噪等)
  • 还原:DAC(数模转换器)把处理后的数字变回模拟信号

核心思想:数字信号处理就是用数学运算替代物理电路。同样的算法,可以跑在手机、电脑、专用芯片上,这就是数字化的魅力。

1.2 采样定理:为什么是44.1kHz?

把模拟信号变成数字信号,第一步就是采样。采样定理(也叫奈奎斯特定理)告诉我们:采样频率必须大于信号最高频率的两倍,否则就会出问题。

公式很简单:f_s > 2 × f_max

人耳能听到的频率范围大约是20Hz~20kHz。所以CD音频的采样率定为44.1kHz,刚好大于40kHz。为什么不是40kHz整?因为还要留一点余量给抗混叠滤波器。

避坑指南:我曾经在一个项目中,为了省存储空间,把采样率降到32kHz。结果高频乐器声全变了味,听起来像隔着一层纱。后来查了半天才发现是采样率不够,高频成分发生了混叠(Aliasing)。从那以后,我设计系统时采样率至少留20%的余量。

混叠是什么?想象一下:你用一个慢速相机拍快速旋转的风扇,看起来风扇好像在倒转。这就是采样率不够导致的假象。音频里也一样,高频信号会被“伪装”成低频信号,混进你的音频里。

1.3 量化噪声:精度与代价的博弈

采样解决了时间上的离散化,量化解决的是幅度上的离散化。ADC把连续的电压值映射到有限的数字等级上,这个映射过程必然有误差——这就是量化噪声。

量化位数(bit depth)决定了动态范围:

量化位数 动态范围(理论) 常见应用
8-bit 48 dB 早期游戏、语音
16-bit 96 dB CD音频
24-bit 144 dB 专业录音、混音
32-bit float 理论无限 DAW内部处理

动态范围每增加6dB,相当于量化位数增加1位。公式是:动态范围(dB) ≈ 6.02 × N + 1.76,其中N是量化位数。

个人经验:我习惯在算法内部用32-bit浮点,输出时再转成16-bit或24-bit。这样中间计算过程的误差不会被放大。有一次我偷懒直接用16-bit做滤波,结果信噪比差了将近20dB——教训啊。

量化噪声听起来像什么?像背景里持续的“嘶嘶”声。信号越弱,噪声越明显。所以录音时要保证信号足够大,但又不能超过0dBFS(满量程),否则会削波失真。

1.4 时域与频域:看波形 vs 看频谱

同一个音频信号,可以从两个角度观察:

  • 时域:横轴是时间,纵轴是幅度。你看到的是波形
  • 频域:横轴是频率,纵轴是幅度(或能量)。你看到的是频谱

时域直观,但信息有限。比如一段录音里有50Hz的交流声,时域波形上你很难看出来,但频域里一目了然——50Hz处会有一个尖峰。

时域和频域之间靠傅里叶变换连接。快速傅里叶变换(FFT)是DSP里最常用的工具之一。

// 一个简单的FFT使用示例(伪代码)
// 输入:时域信号 samples[]
// 输出:频域幅度谱 magnitude[]

void computeSpectrum(float* samples, int N, float* magnitude) {
    // 1. 加窗(防止频谱泄漏)
    applyWindow(samples, N, HANNING);
    
    // 2. 执行FFT
    complex* spectrum = fft(samples, N);
    
    // 3. 计算幅度
    for (int i = 0; i < N/2; i++) {
        magnitude[i] = sqrt(spectrum[i].real * spectrum[i].real + 
                           spectrum[i].imag * spectrum[i].imag);
    }
}

你想想看,时域和频域就像同一枚硬币的两面。有些问题在时域里处理很麻烦(比如去除特定频率的噪声),转到频域就简单了——直接把这个频率的幅度置零,再转回时域就行。

关键理解:时域告诉你“什么时候发生了什么”,频域告诉你“什么频率发生了什么”。做音频DSP,两个视角都要熟练切换。

1.5 本章知识体系总览

下面这张图把本章的核心概念串起来了。我建议你把它存下来,后面学滤波、降噪、压缩时,随时回来对照。

音频DSP基础概念知识体系 数字信号处理 采样定理 量化与噪声 时域与频域 f_s > 2 × f_max 混叠(Aliasing) 抗混叠滤波器 量化位数(bit depth) 动态范围 = 6.02N + 1.76 dB 量化噪声(嘶嘶声) 时域:波形 频域:频谱 FFT:时域 ↔ 频域 三个概念相互关联:采样率决定频宽,量化位数决定动态范围,时频域分析决定处理策略

这张图把本章的三个核心概念——采样定理、量化噪声、时域与频域——串在了一起。你会发现,它们不是孤立的。采样率决定了你能处理的最高频率,量化位数决定了你能达到的信噪比,而时频域分析则是你处理问题的两种武器。

学习建议:刚开始接触DSP时,别急着写代码。先把采样定理和量化噪声搞透。我见过太多工程师,算法写得飞起,结果采样率设错了,或者量化精度不够,最后全白干。基础不牢,地动山摇。