本节摘要:信号处理工具箱是 Matlab 最早的领域工具箱之一,提供滤波器设计与频谱分析两大能力。本节以一条含噪信号的"去噪—看谱"流程为主线,讲采样定理、FIR 滤波器设计、功率谱估计与短时傅里叶变换。
1980 年代 Matlab 的早期用户里,电子工程与声学研究者占比极高——他们要算的东西恰好是矩阵(离散傅里叶变换本质是矩阵乘法)。信号处理工具箱因此成为最早商业化的领域扩展之一,filter、fft、butter 这些函数名沿用四十年,是整个生态里最稳定的一层。
连续信号以采样率 fs 离散化后,能表示的最高频率是 fs/2(奈奎斯特频率)。超过它的成分不会消失,而是折叠伪装成低频——混叠。所以任何分析前先问:采样率够吗?抗混叠滤波做了吗?
fs = 1000; t = 0:1/fs:2-1/fs; x = sin(2*pi*50*t) ... % 50 Hz 有用信号 + 0.8*sin(2*pi*300*t) ... % 300 Hz 干扰 + 0.3*randn(size(t)); % 宽带噪声
第一步先看谱,确认干扰位置:
N = numel(x); P = abs(fft(x)).^2 / N; f = (0:N-1) * fs / N; plot(f(1:N/2), 10*log10(P(1:N/2))); xlabel('频率');
谱图上 50 Hz 与 300 Hz 两根谱线清晰可辨。第二步设计低通滤波器压掉 300 Hz:
d = designfilt('lowpassfir', ... 'PassbandFrequency', 100, 'StopbandFrequency', 180, ... 'PassbandRipple', 1, 'StopbandAttenuation', 60, ... 'SampleRate', fs); y = filtfilt(d, x); % 零相位滤波
designfilt 用一句话描述需求(通带、阻带、衰减),替你算系数——对比早年要先选 butter/fir1 手动定阶的时代,这是设计范式从"懂算法"到"提需求"的演化。filtfilt 前向后向各滤一遍,抵消相位延迟,离线分析首选。

平稳信号的谱不随时间变,一句 fft 足矣;语音、振动这类非平稳信号要用短时傅里叶变换看谱的演化:
pspectrum(x, fs, 'spectrogram') % 谱图:横轴时间、纵轴频率
故障诊断里"哪一秒出现了哪个频带的能量"就是靠它读出来的。
⚠️ 常见坑:用
filter做实时滤波后直接比较输入输出波形,发现"信号整体挪位了"——那不是错误,是滤波器的群延迟。离线场景改filtfilt,或把延迟算进去对齐。
滤波不是"设计完就完",验证环节的标配是三张图:滤波前后的时域叠加、滤波前后的频谱叠加、滤波器自身的幅频响应。第三张最容易被跳过,却最能说明问题:
fvtool(d) % 幅频响应:通带平不平、阻带够不够 P2 = abs(fft(y)).^2 / N; % y 为滤波后信号 plot(f(1:N/2), 10*log10(P(1:N/2))); hold on plot(f(1:N/2), 10*log10(P2(1:N/2))); legend('滤波前','滤波后')
预期输出:50 Hz 谱线几乎不变(通带内衰减小),300 Hz 谱线下沉 60 分贝上下(阻带衰减起效),宽带噪声整体压低。如果 50 Hz 也跟着掉了几分贝,说明通带边缘设得太贴近信号频率,把通带边界从 100 Hz 收到 80 Hz 会牺牲过渡带宽度换取更平的通带——这类参数权衡,看响应图比看文档直观得多。
两类滤波器各有性格,选型表如下:
| 维度 | FIR(如 designfilt 的 lowpassfir) | IIR(如 butter 椭圆类) |
|---|---|---|
| 相位 | 可做到严格线性相位 | 非线性相位 |
| 阶数 | 同指标下高得多 | 低阶即达指标 |
| 稳定性 | 天然稳定 | 需注意量化后稳定性 |
| 典型场景 | 波形保真、离线分析 | 实时嵌入、算力受限 |
经验判据:离线分析且关注波形形状,FIR 加 filtfilt;实时流式处理且算力紧张,低阶 IIR。语音里人耳对相位不敏感,IIR 常见;振动诊断要保波形相位关系,FIR 占优。
信号处理新手的三个高频事故。一是频率轴算错:fft 输出的第 k 个点对应频率是 (k-1)*fs/N,漏减一或用错 N(比如误用 2 的幂次补零后的长度)会让谱线整体偏移,对照一根已知频率的标定信号检查即可发现。二是补零误解:补零能细化谱的采样间隔,但不能提高物理分辨率——分辨率由真实数据时长决定,时长不够,补再多零也只是把同一根模糊谱线画得更密。三是滤波后信号首尾出现瞬态毛刺,这是滤波器建立阶段的正常现象,filtfilt 能缓解,严格做法是丢弃两端各一个滤波器长度的样本。
工具箱之外,这些能力的来处也值得一说:fft、filter 属于基础 Matlab,谁都有;designfilt、pspectrum、fvtool 属于信号处理工具箱。团队协作或交付脚本前,用 license('test','Signal_Toolbox') 探测一下再决定是否走高级封装,能让代码在最低配的环境里也活着。历史上这条分界线还移动过——早期谱图靠信号工具箱的 spectrogram,后来基础层逐步下沉了部分能力,读旧代码时见到函数名不同、功能相同的Pair,多半就是这条线移动留下的痕迹。
designfilt 按需求描述设计滤波器,通带阻带衰减一次说清;filtfilt 零相位,离线分析默认选它;pspectrum 一行看时频结构。