
基于Matlab的FFT滤波:谐波分析、频段清除与数据提取
老司机带你玩转MATLAB的"外科手术式"滤波!今天要聊的这个FFT滤波方法,简直就是信号处理界
的瑞士军刀。不需要复杂的设计滤波器参数,不用纠结巴特沃斯还是切比雪夫,直接对着频谱图精准开刀。
先看个真实案例:某次我在处理电机振动数据时,发现有个诡异的145Hz杂波总在作妖。传统滤波器
要么相位失真,要么幅值掉得亲妈不认。这时候FFT滤波的零相位特性就派上用场了,看这段核心代码:
```matlab
% 导入CSV数据
rawData = csvread('vibration.csv');
signal = rawData(:,2); % 第二列是振动信号
Fs = 5000; % 采样率5kHz
% FFT手术刀登场
N = length(signal);
freq = (-N/2:N/2-1)*(Fs/N);
Y = fftshift(fft(signal));
% 精准切除140-150Hz频段
mask = (abs(freq)>=140 & abs(freq)<=150);
Y(mask) = 0; % 暴力清零
% 重建信号
filtered = real(ifft(ifftshift(Y)));
% 幅值补偿(根据实际衰减调整)
compensated = filtered * 1.05;
```
这里有几个骚操作:fftshift把频谱零点搬到中心,方便做对称处理;mask矩阵像激光制导一样精
准锁定目标频段;补偿系数1.05是根据频谱能量损失估算的,实测有效。
有同学要问:这跟传统滤波有啥区别?举个栗子,当你要处理心电信号里的工频干扰时,IIR滤波器
会把QRS波变得亲妈都不认识。而FFT滤波就像PS里的内容识别填充,只擦除指定区域,其他波形毫发无损。
不过要注意几个坑:
1. 数据首尾突变会产生频谱泄露,加个汉宁窗更稳妥:
```matlab
window = hanning(N);