数字滤波器程序,基于matlab,低通滤波器,高通滤波器,带通滤波器。 并且可进行FFT频谱分析,分析波形中所含谐波分量,并可以对特定频率波形进行提取。 不需要通过示波器观察,直接导入数据即可,快捷便利。 程序带有详细注释 图a为原始信号,图b为原始信号FFT分析结果,图c为进行带通滤后的结果对比,图d为滤波后的FFT分析结果,效果非常好
先上效果图镇楼(假装这里有四张图):
图a是原始信号曲线,明显能看出叠加了多个频率;图b的频谱分析直接暴露出50Hz和200Hz两个刺头;图c经过带通滤波后200Hz成分被精准狙击;图d的频谱干净得就像刚大扫除过的房间。
上代码!先整数据导入部分:
% 老铁直接拖拽数据文件到Workspace raw_signal = load('signal_data.mat'); t = raw_signal(:,1); % 时间序列 x = raw_signal(:,2); % 原始信号这里要注意时间序列的采样率得算准,后面FFT要用到。建议用diff(t)自动计算采样间隔,防止手动输入翻车。
FFT分析直接套模板:
% 频谱分析三件套 Fs = 1/mean(diff(t)); % 智能获取采样率 L = length(x); % 信号长度 Y = fft(x); P2 = abs(Y/L); % 双边频谱 P1 = P2(1:L/2+1); % 取半谱 P1(2:end-1) = 2*P1(2:end-1); % 能量校正 f = Fs*(0:(L/2))/L; % 频率轴 % 画频谱图建议封装成函数 figure plot(f,P1) title('单边振幅谱') xlabel('频率(Hz)') ylabel('振幅')重点说下这个P1的处理,很多新手会漏掉能量校正那步,导致振幅值砍半。还有频率轴的生成必须用实际采样率,别傻乎乎用归一化频率。
重头戏滤波器设计,以带通为例:
% 带通滤波器参数 order = 6; % 6阶巴特沃斯 lowcut = 150; % 下限频率 highcut = 250; % 上限频率 nyq = 0.5*Fs; % 奈奎斯特频率 low = lowcut/nyq; high = highcut/nyq; % 设计滤波器 [b,a] = butter(order, [low, high], 'bandpass'); % 滤波操作 filtered_signal = filter(b,a,x);巴特沃斯滤波器属于万金油型,通带平坦过渡带适中。注意这里用归一化频率,别直接怼实际频率值进去。高阶滤波可能产生相位失真,需要零相位滤波的可以用filtfilt函数。
最后来个效果验证:
% 滤波前后对比 subplot(2,1,1) plot(t,x,'b',t,filtered_signal,'r') legend('原始信号','滤波后信号') % 新频谱生成 [new_f, new_P1] = custom_fft(filtered_signal, Fs); % 前面写的FFT函数 subplot(2,1,2) plot(f,P1,'b',new_f,new_P1,'r') legend('原始频谱','滤波后频谱')重点观察阻带衰减是否到位,过渡带有没有出现吉布斯效应。如果发现滤波后信号畸变严重,八成是截止频率设置太接近有效成分了,适当放宽通带范围。
几个避坑指南:
- 数据长度不是2的幂时,FFT前记得做零填充
- 滤波器阶数别无脑怼高,超过10阶可能数值不稳定
- 处理完记得用fvtool(b,a)检查滤波器幅频曲线
- 高通滤波时注意直流分量的处理,小心基线漂移
这套方案实测在工业振动信号分析中成功抓取出轴承故障特征频率,在ECG信号处理中也能有效滤除工频干扰。需要换滤波器类型?改butter函数的第二个参数就行:
- 低通:butter(6, high/nyq)
- 高通:butter(6, low/nyq, 'high')
- 带阻:butter(6, [low1,high1]/nyq, 'stop')
代码全量版已打包扔GitHub,需要的老铁评论区自取。下期预告:如何用神经网络自动识别特征频率,一键生成诊断报告。