3. 信号处理基础:时域与频域分析、傅里叶变换(FFT)、短时傅里叶变换(STFT)、数字滤波器基础(FIR/IIR)

各位同学好,欢迎来到第三章。这一章是咱们整个声学自适应处理的地基。说实话,很多做语音算法的朋友,最后调不通模型,回头一看,往往是时频域的基本功不够扎实。今天我就带大家把这些基础概念彻底捋一遍。

本章核心脉络:我们从“信号怎么看”出发,先理解时域和频域是同一枚硬币的两面;然后掌握从时域跳到频域的核心工具——傅里叶变换及其快速实现FFT;接着解决非平稳信号的时频分析需求,引出短时傅里叶变换(STFT);最后,学会用数字滤波器(FIR/IIR)在频域里“修剪”信号。这套流程,几乎贯穿所有声学场景自适应系统。

第3章 信号处理基础知识体系 信号处理基础:时域 ↔ 频域 核心工具链 时域信号 x(t) 或 x[n] 频域分析 X(f) 或 X(k) 傅里叶变换 (FT/FFT) 时域→频域的桥梁 FT FFT 短时傅里叶变换 (STFT) 时频联合分析 加窗分帧 数字滤波器 FIR / IIR 频域设计 声学场景自适应中的角色 时域:实时检测、VAD、AEC误差信号 频域/STFT:噪声估计、波束形成、特征提取 | 滤波器:回声消除、降噪

3.1 时域与频域:同一枚硬币的两面

咱们做声学处理的,天天跟波形打交道。时域,就是看信号幅度随时间怎么变。你打开录音软件,看到的那条上下跳动的曲线,就是时域波形。频域呢?它告诉你这个信号里有哪些频率成分,每个频率有多强。

我举个例子。你听到一段音乐,时域波形看起来就是一堆乱糟糟的锯齿。但如果你做一次傅里叶变换,转到频域一看——哦,基频是440Hz,那是A4音,还有一堆泛音。信息瞬间就清晰了。

为什么会这样?因为很多声学现象在时域里纠缠在一起,到了频域反而分得开。比如人声和空调噪声,时域上完全重叠,但频域里一看,空调噪声集中在低频段,人声在中高频,一刀切下去就分开了。

我的经验:刚入行时,我总习惯盯着时域波形看,觉得直观。后来做回声消除,发现时域里根本看不出回声路径的变化,转到频域做自适应滤波,效果立竿见影。从那以后,我养成了“先看频域,再回时域”的习惯。

3.2 傅里叶变换与FFT:从理论到工程

傅里叶变换的数学公式大家应该都见过:

连续时间傅里叶变换 (CTFT):
X(f) = ∫ x(t) · e^(-j2πft) dt   (从 -∞ 到 +∞)

离散傅里叶变换 (DFT):
X(k) = Σ x[n] · e^(-j2πkn/N)   (n = 0 到 N-1)

说白了,就是把信号分解成不同频率的正弦波之和。每个频率分量用一个复数表示,幅度对应能量,相位对应时间偏移。

但在实际工程里,我们不可能算无穷积分。计算机只能处理离散的、有限长的序列。这就是DFT登场的原因。DFT的计算量是O(N²),N稍微大一点——比如1024点——就要算一百多万次乘法,实时系统根本扛不住。

所以有了FFT(快速傅里叶变换)。它利用旋转因子的对称性和周期性,把计算量降到O(N log₂N)。N=1024时,FFT只需要约一万次运算,比DFT快了两个数量级。

变换类型 适用信号 计算复杂度 工程场景
CTFT 连续、无限长 理论分析 公式推导、教科书
DFT 离散、有限长 O(N²) 理论定义
FFT 离散、有限长 O(N log₂N) 所有实时系统

避坑指南:我曾经在一个项目里直接用DFT做频谱分析,采样率48kHz,帧长4096点,结果DSP芯片算到冒烟,延迟飙到200ms。换成基2-FFT后,延迟降到5ms以内。记住:工程里永远用FFT,别自己写DFT。另外,FFT要求输入长度是2的幂次,不是的话要做补零或截断。

3.3 短时傅里叶变换(STFT):给信号加一扇滑动窗

FFT有个前提:信号是平稳的,也就是统计特性不随时间变化。但声学信号——语音、音乐、环境噪声——都是非平稳的。一段语音里,元音和辅音的频谱天差地别。你用一整段的FFT去看,得到的是平均频谱,细节全丢了。

怎么办?加窗分帧。这就是STFT的核心思想。

STFT的做法很简单:

  1. 把信号切成短段(帧),每帧通常20-40ms,保证帧内近似平稳。
  2. 每帧加一个窗函数(汉宁窗、海明窗),减少频谱泄漏。
  3. 对每一帧做FFT,得到该时刻的频谱。
  4. 帧与帧之间重叠50%-75%,保证连续性。

结果就是一个三维的时频谱图:横轴是时间,纵轴是频率,颜色深浅代表能量大小。你想想看,这就像给信号拍了一张“频率随时间变化”的照片。

STFT 的数学表达:
X(m, k) = Σ x[n] · w[n - mR] · e^(-j2πkn/N)

其中:
- m: 帧索引
- k: 频率索引
- w[n]: 窗函数
- R: 帧移(hop size)
- N: FFT长度

关键参数选择:

  • 帧长:20-40ms。太短则频率分辨率差,太长则时间分辨率差。语音处理常用32ms(采样率16kHz时对应512点)。
  • 帧移:通常为帧长的25%-50%。我习惯用50%重叠,信息冗余度够,计算量也适中。
  • 窗函数:汉宁窗(Hanning)是默认选择,旁瓣衰减快,适合大多数场景。海明窗(Hamming)旁瓣稍高但主瓣窄,适合需要频率分辨率的场景。

我的习惯:做STFT时,我一般先画一帧的加窗前后对比图,看看窗函数有没有把帧边缘削得太狠。如果后续要做逆变换(ISTFT)恢复波形,一定要保证窗函数满足“常数重叠相加(COLA)”条件,否则恢复出来的信号会有幅度调制噪声。这个坑我踩过,调了一整天才发现是窗函数没选对。

3.4 数字滤波器基础:FIR与IIR

有了频域分析工具,接下来就要学会怎么“修”信号了。数字滤波器就是干这个的。

数字滤波器分两大类:FIR(有限脉冲响应)和IIR(无限脉冲响应)。

特性 FIR IIR
脉冲响应长度 有限(N阶) 无限(有反馈)
稳定性 绝对稳定 可能不稳定(需设计保证)
相位特性 可做到严格线性相位 非线性相位
计算量 较大(N次乘加/样本) 较小(通常2-10次乘加/样本)
设计难度 简单(窗函数法、最小二乘法) 中等(模拟原型映射)
典型应用 波束形成、均衡器、匹配滤波 降噪、回声消除、低通/高通

FIR的差分方程:

y[n] = b₀·x[n] + b₁·x[n-1] + ... + b_N·x[n-N]

没有反馈,只有前向路径。所以它天生稳定,而且可以做到线性相位——所有频率的延迟一样,波形不会畸变。这在声学场景里很重要,比如波束形成,相位失真会破坏指向性。

IIR的差分方程:

y[n] = b₀·x[n] + b₁·x[n-1] + ... - a₁·y[n-1] - a₂·y[n-2] - ...

有反馈,所以效率高。一个二阶IIR就能实现很陡的截止特性,而FIR可能需要上百阶。但IIR的相位是非线性的,而且设计不好会振荡甚至发散。

避坑指南:我曾经在一个降噪项目里用IIR滤波器做高通,截止频率设得太靠近通带,结果滤波器在低频段产生了自激振荡,输出信号里多了一段低频嗡鸣。排查了两天才发现是极点太靠近单位圆了。从那以后,我对IIR的设计原则是:极点距离单位圆至少留0.05的余量。如果对相位有要求,老老实实用FIR。

3.5 滤波器设计实战:从规格到代码

讲完理论,咱们来点实际的。假设你要设计一个低通滤波器,用于去除8kHz以上的噪声,采样率16kHz。

FIR设计步骤(窗函数法):

  1. 确定通带截止频率:7.5kHz(留过渡带)
  2. 确定阻带起始频率:8.5kHz
  3. 选择窗函数:汉宁窗,旁瓣衰减约44dB
  4. 计算阶数:N ≈ 3.3 / (Δf · T) = 3.3 / (1000/16000) ≈ 53阶
  5. 生成理想低通脉冲响应,加窗截断
// Python 示例:FIR低通滤波器设计
import numpy as np
import scipy.signal as signal

fs = 16000
cutoff = 7500  # 通带截止频率
numtaps = 55   # 滤波器阶数+1

# 窗函数法设计
fir_coeff = signal.firwin(numtaps, cutoff, fs=fs, window='hann')

# 查看频率响应
w, h = signal.freqz(fir_coeff, fs=fs)
# h 就是频响,可以画图验证

IIR设计步骤(巴特沃斯):

  1. 确定通带截止频率:7.5kHz
  2. 确定阻带衰减:40dB
  3. 选择原型:巴特沃斯(最大平坦通带)
  4. 计算阶数:通常4-6阶即可
  5. 用双线性变换法映射到数字域
// Python 示例:IIR低通滤波器设计
fs = 16000
cutoff = 7500
order = 4

# 巴特沃斯设计
b, a = signal.butter(order, cutoff, btype='low', fs=fs)

# 检查稳定性
poles = np.roots(a)
if np.any(np.abs(poles) >= 1):
    print("警告:滤波器不稳定!")

我的建议:初学者先从FIR入手。虽然计算量大一点,但稳定、线性相位、设计直观。等你把FIR玩熟了,再碰IIR。而且现在很多DSP和ARM芯片都有硬件乘加器,跑几十阶FIR根本不是问题。我在一个Cortex-M4上跑64阶FIR,单通道只占不到5%的CPU。

3.6 本章小结

这一章我们走完了信号处理的基础链路:从时域看到频域,用FFT高效完成变换,用STFT处理非平稳信号,最后用FIR/IIR在频域里做“修剪”。这套工具链,是后续所有声学自适应算法——回声消除、噪声抑制、波束形成、声源定位——的基石。