
基于Matlab的FFT频谱分析与数字滤波器:谐波提取与频段清除应用
数字信号处理总带着点魔法色彩,今天咱们用MATLAB实操FFT和数字滤波,手把手处理那些烦人的
谐波。直接上干货,先说怎么用三行代码揪出信号里的"捣蛋鬼"。
先看原始信号(图a),这哥们儿混着50Hz基波、150Hz三次谐波和250Hz五次谐波。上频谱分析:
```matlab
Fs = 1000; % 采样率别抠门,至少2倍最高频率
N = length(signal);
Y = fft(signal)/N*2; % 别忘幅度修正
freq = (0:N/2)*Fs/N; % 频率轴别搞错
plot(freq, abs(Y(1:N/2+1))) % 图b就是这么来的
```
这段代码的玄机在幅度修正——FFT结果要除以N再乘2(直流分量除外)。频率轴计算时注意奈奎斯特
频率,别把镜像频谱当正主儿。
发现三次和五次谐波后,该出必杀技了。传统IIR滤波器会有相位失真,咱们用零相位滤波:
```matlab
[b,a] = butter(4, [140 160]/500, 'stop'); % 4阶带阻,搞掉150Hz
filtered = filtfilt(b,a,signal); % 双向滤波神器
```
butter函数第4个参数是关键,[140 160]/500把150Hz包饺子。filtfilt双向滤波消除相位滞后,实
测波形对比(图c)滤波前后完美重合,没有时移。
验证滤波效果(图d)再来波FFT:
```matlab
Y_filtered = fft(filtered)/N*2;
hold on
plot(freq, abs(Y_filtered(1:N/2+1)), 'r') % 红色频谱对比
```
三次五次谐波幅度归零,基波纹丝不动。注意滤波器阶数别贪高,4阶够用,阶数越高计算量越大还
可能震荡。
遇到需要提取特定谐波时,把带阻换成带通:
```matlab