4. 频域滤波基础:傅里叶变换入门、低通/高通/带通滤波器设计、IIR与FIR滤波器对比、截止频率选择

各位同学,欢迎来到滤波技术的核心章节。说实话,很多做信号处理的朋友,一听到「频域」两个字就头大。我当年刚入行时也一样,觉得时域挺好理解的,干嘛非要折腾到频域去?

但后来我在一个风速传感器项目里栽了跟头——时域里怎么滤都滤不干净的噪声,换到频域一看,问题清清楚楚。嗯,从那以后,我再也不敢小看傅里叶变换了。

4.1 傅里叶变换:从时域到频域的「翻译官」

傅里叶变换的核心思想,说白了就是一句话:任何信号都可以分解成不同频率的正弦波之和

你想想看,我们平时采集到的风向标信号,是一个随时间变化的电压值。这个信号里,既有真正的风向变化(低频成分),也有传感器振动、电磁干扰(高频成分)。在时域里,它们混在一起,你根本分不清谁是谁。

傅里叶变换就是一把「筛子」,把信号按频率拆开。公式长这样:

X(f) = ∫ x(t) · e^(-j2πft) dt

别被公式吓到。在实际工程里,我们用的是离散傅里叶变换(DFT),以及它的快速算法FFT。Python里实现起来就几行代码:

import numpy as np
import matplotlib.pyplot as plt

# 生成一个示例信号:10Hz + 50Hz 混合
fs = 1000  # 采样率 1000Hz
t = np.arange(0, 1, 1/fs)
x = np.sin(2*np.pi*10*t) + 0.5*np.sin(2*np.pi*50*t)

# 做FFT
X = np.fft.fft(x)
freqs = np.fft.fftfreq(len(x), 1/fs)

# 只取正频率部分
plt.plot(freqs[:len(freqs)//2], np.abs(X[:len(X)//2]))
plt.xlabel('频率 (Hz)')
plt.ylabel('幅度')
plt.title('信号的频谱')
plt.grid(True)
plt.show()
我的小经验:做FFT之前,一定要先检查采样率。采样率不够,高频成分会「折叠」到低频区,这就是著名的奈奎斯特采样定理。我曾经在一个风洞测试里吃过这个亏,数据采回来一看,频谱全乱了。

4.2 三大滤波器:低通、高通、带通

理解了频域,滤波器设计就变得很直观了。你想保留哪些频率?滤掉哪些频率?这就是滤波器的全部秘密。

滤波器类型 作用 风向标应用场景
低通滤波器 保留低频,滤除高频 去除传感器振动噪声、电磁干扰
高通滤波器 保留高频,滤除低频 去除温度漂移、基线漂移
带通滤波器 保留特定频段 提取特定风速下的特征频率

在Python里,用scipy设计一个低通滤波器非常方便:

from scipy import signal

# 设计一个4阶巴特沃斯低通滤波器
fs = 1000  # 采样率
cutoff = 30  # 截止频率 30Hz
nyquist = 0.5 * fs
normal_cutoff = cutoff / nyquist

b, a = signal.butter(4, normal_cutoff, btype='low', analog=False)

# 应用到信号上
filtered_signal = signal.filtfilt(b, a, x)
注意:filtfilt是零相位滤波,不会引入相位延迟。但如果你做实时处理,只能用lfilter,它会带来相位偏移。我曾经在一个实时监控系统里用错了函数,结果风向数据滞后了半秒钟,差点导致误报警。

4.3 IIR与FIR滤波器:两种思路,两种性格

IIR和FIR,是数字滤波器的两大门派。我经常跟团队里的新人说:选哪个,取决于你要什么。

IIR滤波器(无限脉冲响应)

  • 优点:阶数低,计算量小,延迟小
  • 缺点:有非线性相位,可能不稳定
  • 适合:实时性要求高的嵌入式系统

FIR滤波器(有限脉冲响应)

  • 优点:严格线性相位,绝对稳定
  • 缺点:阶数高,计算量大,延迟大
  • 适合:对相位精度要求高的场合

举个例子。我在做一款低成本风向标时,MCU主频只有几十MHz,内存也小。这时候我毫不犹豫选了IIR——巴特沃斯滤波器,4阶就够了,跑起来很轻松。

但后来做一款科研级风速计,要求波形不能有任何畸变。那没办法,只能用FIR,哪怕阶数到了80阶,也得硬扛。

核心对比:
  • IIR:用相位换效率
  • FIR:用计算量换精度

4.4 截止频率选择:一个工程问题

截止频率怎么选?这个问题没有标准答案。但我可以给你一个实用的思路。

第一步:分析信号频谱

先采集一段典型数据,做FFT看看。风向变化通常集中在0.1-5Hz,传感器振动可能在20-100Hz,50Hz工频干扰也很常见。

第二步:确定过渡带

截止频率不是一刀切。从通带到阻带,有一个过渡区域。过渡带越窄,滤波器阶数越高,计算量越大。

第三步:留余量

我个人习惯,截止频率选在目标频率的1.5-2倍。比如我要保留5Hz以内的信号,截止频率设在8-10Hz。这样既能保留有效信号,又能给滤波器一个缓冲。

# 一个实用的截止频率选择流程
def choose_cutoff(signal, fs, target_freq):
    """
    signal: 原始信号
    fs: 采样率
    target_freq: 目标保留的最高频率
    """
    # 建议截止频率 = target_freq * 1.5
    suggested_cutoff = target_freq * 1.5
    
    # 检查是否满足奈奎斯特条件
    if suggested_cutoff > fs/2:
        print("警告:截止频率超过奈奎斯特频率!")
        suggested_cutoff = fs/2 * 0.9
    
    return suggested_cutoff
避坑指南:我曾经在一个项目中,把截止频率设得太靠近目标频率。结果滤波器在通带内就有明显衰减,有效信号被削弱了。后来我学乖了:宁可多留一点余量,也别把信号滤没了。

4.5 本章知识体系

为了帮你理清思路,我画了一张图。这张图展示了频域滤波的完整逻辑链:

频域滤波知识体系 时域信号 FFT 频域分析(频谱) 低通/高通/带通 IIR vs FIR 截止频率选择 干净的滤波信号

这张图的核心逻辑是:时域信号 → FFT变换 → 频域分析 → 选择滤波器 → 得到干净信号。每一步都有对应的工程技巧,我们会在后续章节逐一展开。

好了,频域滤波的基础就讲到这里。记住一句话:滤波不是把噪声去掉,而是把有用的信号留下来。想清楚你要什么,再动手设计滤波器,事半功倍。


公众号:蓝海资料掘金营,微信deep3321