(五) FIR滤波器:用Python实现噪音克星

—— 从理论到实战:打造你自己的“降噪耳机”


一、什么是FIR滤波器?

FIR(Finite Impulse Response,有限冲激响应)滤波器是一种非递归数字滤波器:

  • 核心特征:输出仅取决于当前和过去的输入(无反馈项)。

  • 差分方程

    y [ n ] = ∑ k = 0 M b k x [ n − k ] y[n] = \sum_{k=0}^{M} b_k x[n-k] y[n]=k=0Mbkx[nk]

    其中 b k b_k bk 为滤波器系数, M M M 为阶数。

优势:稳定性(无极点)、线性相位(信号不失真),广泛用于音频处理、通信系统。


二、FIR滤波器设计三步曲

1. 确定规格

  • 截止频率:要保留(低通/高通)或抑制(带阻)的频率边界。
  • 过渡带宽:通带到阻带的过渡区域宽度(影响阶数)。

2. 选择设计方法

  • 窗函数法(简单直观)
  • 等波纹法(Parks-McClellan算法,优化性能)

3. 系数计算与实现

生成系数 b k b_k bk,并通过卷积运算实时处理信号。


三、Python实战:用窗函数法设计低通滤波器

目标:滤除语音信号中高于1kHz的高频噪声

import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import firwin, freqz, lfilter

# 参数设置
fs = 8000          # 采样率8kHz
cutoff = 1000      # 截止频率1kHz
numtaps = 65       # 滤波器阶数(长度=numtaps)

# 生成FIR滤波器系数(Hamming窗)
taps = firwin(numtaps, cutoff, window='hamming', fs=fs)

# 绘制频率响应
w, h = freqz(taps, fs=fs)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.figure(figsize=(10,4))
plt.plot(w, 20*np.log10(np.abs(h)), 'b')
plt.axvline(cutoff, color='r', linestyle='--')
plt.title(f"FIR低通滤波器频率响应 (截止频率={cutoff}Hz)")
plt.xlabel('频率 (Hz)')
plt.ylabel('增益 (dB)')
plt.xlim(0, fs/2)
plt.show()

# 生成测试信号:语音+高频噪声
t = np.linspace(0, 1, fs)
signal = np.sin(2*np.pi*500*t) + 0.5*np.sin(2*np.pi*3000*t)

# 应用滤波器
filtered = lfilter(taps, 1.0, signal)

# 结果对比
plt.figure(figsize=(10,4))
plt.plot(t, signal, 'gray', alpha=0.5, label="原始信号 (含3kHz噪声)")
plt.plot(t, filtered, 'r', label="滤波后信号")
plt.xlabel("时间 (秒)")
plt.ylabel("振幅")
plt.title("滤波效果对比")
plt.legend()
plt.xlim(0, 0.02)
plt.show()  # 显示前0.02秒细节

运行结果
FIR频率响应

FIR滤波效果

  • 频谱图显示截止频率在1kHz,3kHz噪声被抑制
  • 时域图可见高频振荡(噪声)被有效滤除

四、关键参数解析

1. 阶数选择

  • 公式估计(Kaiser窗):

    N ≈ A 14.6 Δ f N \approx \frac{A}{14.6 \Delta f} N14.6ΔfA

    A A A:阻带衰减(dB), Δ f \Delta f Δf:过渡带宽(Hz)

  • 示例:若要求衰减50dB,过渡带宽100Hz → N ≈ 50 / ( 14.6 × 100 / 8000 ) ≈ 274 N ≈ 50/(14.6×100/8000) ≈ 274 N50/(14.6×100/8000)274

2. 窗函数比较

窗类型主瓣宽度旁瓣衰减适用场景
矩形窗-13dB快速实现,精度要求低
汉明窗中等-41dB通用设计(平衡性能)
布莱克曼窗-58dB高衰减需求(如雷达)

五、现实应用

  1. ECG信号去噪:滤除肌电干扰(高频)和基线漂移(低频)
  2. 软件无线电:下变频和信道选择
  3. 触觉反馈:滤除马达驱动电路的高频噪声

六、常见问题

  1. “FIR滤波器为什么延迟大?”
    • 因为对称结构需要缓存多个输入样本(延迟=阶数/2)。
  2. “如何实时处理?”
    • 使用环形缓冲区(如FPGA的FIFO)逐帧处理。

动手实验:尝试将 cutoff 改为1500Hz,观察滤波后信号的变化。增加 numtaps 参数,比较过渡带的变化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值