FIR 滤波器是数字信号处理中非常重要的一类滤波器,它具有无条件稳定和严格线性相位的特性,这使其在许多应用中非常受欢迎。
🧐 FIR 滤波器基础
FIR 滤波器通过将输入信号与滤波器的冲激响应进行卷积来实现滤波功能。
- 冲激响应 (Impulse Response):它的长度是有限的,因此得名“有限冲激响应”。
- 结构类型:FIR 滤波器属于非递归系统(Non-recursive System),这意味着它的输出只依赖于当前的输入和过去的输入样本,而不依赖于过去的输出样本。
y [ n ] = ∑ k = 0 M b k ⋅ x [ n − k ] y[n] = \sum_{k=0}^{M} b_k \cdot x[n-k]y[n]=k=0∑Mbk⋅x[n−k]
其中:
- y [ n ] y[n]y[n]是时刻n nn的输出信号。
- x [ n ] x[n]x[n]是时刻n nn的输入信号。
- b k b_kbk是滤波器的系数(通常称为“抽头”或“Taps”),它们就是滤波器的冲激响应h [ k ] h[k]h[k]。
- M MM是滤波器的阶数,滤波器的长度(抽头数)为N = M + 1 N = M + 1N=M+1。
🏛️ FIR 滤波器的典型架构:直接形式 I (Direct Form I)
最常见和最直观的 FIR 滤波器架构是直接形式 I,也称为横向结构(Transversal Structure)。
这种结构由以下基本单元组成:
- 延迟单元 (Delay Elements,z − 1 z^{-1}z−1):用于存储输入信号的过去M MM个样本。在数字实现中,这通常是一个移位寄存器或环形缓冲区。
- 在时刻n nn,移位寄存器存储了输入信号的{ x [ n ] , x [ n − 1 ] , … , x [ n − M ] } \{x[n], x[n-1], \dots, x[n-M]\}{x[n],x[n−1],…,x[n−M]}这些样本。
- 乘法器 (Multipliers):每个延迟的输入样本x [ n − k ] x[n-k]x[n−k]都与相应的滤波器系数b k b_kbk相乘。
- 加法器 (Summers/Accumulators):所有乘法的结果被累加起来,产生最终的输出样本y [ n ] y[n]y[n]。
架构特点总结:
- 简单直观:这种结构直接对应于 FIR 滤波器的卷积求和公式。
- 计算量:对于一个N NN阶(M = N − 1 M=N-1M=N−1)的滤波器,每个输出样本需要N NN次乘法和N − 1 N-1N−1次加法。
- 存储需求:需要存储N NN个输入样本和N NN个系数b k b_kbk。
📐 线性相位 FIR 滤波器的对称结构
FIR 滤波器的一个最大优点是可以轻松设计成严格线性相位。线性相位意味着滤波器的群延迟是常数,不会引起信号的相位失真(即信号中不同频率分量的延迟时间相同)。
当滤波器系数满足对称或反对称关系时,即可实现线性相位:
- 对称:b k = b M − k b_k = b_{M-k}bk=bM−k
- 反对称:b k = − b M − k b_k = -b_{M-k}bk=−bM−k
利用这种对称性,可以设计出简化的结构来减少乘法器的数量,从而降低计算复杂度并节省硬件资源。
简化结构原理:
以对称系数为例,如M = 4 M=4M=4的滤波器:
y [ n ] = b 0 x [ n ] + b 1 x [ n − 1 ] + b 2 x [ n − 2 ] + b 3 x [ n − 3 ] + b 4 x [ n − 4 ] y[n] = b_0 x[n] + b_1 x[n-1] + b_2 x[n-2] + b_3 x[n-3] + b_4 x[n-4]y[n]=b0x[n]+b1x[n−1]+b2x[n−2]+b3x[n−3]+b4x[n−4]
因为b 0 = b 4 b_0=b_4b0=b4且b 1 = b 3 b_1=b_3b1=b3,可以重写为:
y [ n ] = b 0 ( x [ n ] + x [ n − 4 ] ) + b 1 ( x [ n − 1 ] + x [ n − 3 ] ) + b 2 x [ n − 2 ] y[n] = b_0 (x[n] + x[n-4]) + b_1 (x[n-1] + x[n-3]) + b_2 x[n-2]y[n]=b0(x[n]+x[n−4])+b1(x[n−1]+x[n−3])+b2x[n−2]
- 操作变化:变为先进行加法,然后用一个系数进行乘法。
- 优势:乘法次数从N NN次(5次)减少到大约N / 2 N/2N/2次(3次)。
⚡ 快速 FIR 滤波:利用 FFT
对于非常高阶的 FIR 滤波器,直接形式或对称形式的实时实现可能需要大量的乘法运算。在这种情况下,可以利用快速傅里叶变换 (FFT)来实现滤波,基于时域卷积相当于频域相乘的原理:
y [ n ] = x [ n ] ∗ h [ n ] ⇔ Y [ k ] = X [ k ] ⋅ H [ k ] y[n] = x[n] * h[n] \quad \Leftrightarrow \quad Y[k] = X[k] \cdot H[k]y[n]=x[n]∗h[n]⇔Y[k]=X[k]⋅H[k]
实现步骤 (重叠相加法/重叠保留法):
- 将长输入信号x [ n ] x[n]x[n]分割成较短的块。
- 对输入信号块x b l o c k [ n ] x_{block}[n]xblock[n]和滤波器冲激响应h [ n ] h[n]h[n]进行FFT得到X b l o c k [ k ] X_{block}[k]Xblock[k]和H [ k ] H[k]H[k]。
- 在频域将它们相乘得到Y b l o c k [ k ] = X b l o c k [ k ] ⋅ H [ k ] Y_{block}[k] = X_{block}[k] \cdot H[k]Yblock[k]=Xblock[k]⋅H[k]。
- 对Y b l o c k [ k ] Y_{block}[k]Yblock[k]进行IFFT得到输出信号块y b l o c k [ n ] y_{block}[n]yblock[n]。
- 将输出块进行适当的重叠处理(取决于使用重叠相加还是重叠保留),以形成最终的输出信号y [ n ] y[n]y[n]。
优势:当滤波器阶数N NN非常大时,FFT 算法的复杂度(O ( N log N ) O(N \log N)O(NlogN))通常远低于直接卷积(O ( N 2 ) O(N^2)O(N2)或O ( N ) O(N)O(N)forM MMlength filter),可以显著提高运算速度。