FIR、IIR滤波算法

最后更新于:2024-04-07 21:30:09

一、代码运行环境

MATLAB2014a及更新版本。

二、程序介绍

注:图标代表该m文件为脚本文件,可以直接运行;图标代表函数文件,在没有输入变量的情况下无法直接运行。更详细的解释可以看这里

1.demoFirIirFliter.m文件

FIR或者IIR滤波函数funFirIirFliter.m的测试脚本文件,可以直接运行。程序运行完成后,将会画出如下效果图:

滤波器设计结果
滤波前后效果对比

2.funFirIirFliter.m文件

使用FIR或者IIR法实现滤波的主函数。注意!此文件为函数文件,只可调用,不可以直接运行。

进行FIR或者IIR滤波,可以实现滤波器设计、滤波、画图。其中主要调用了MATLAB官方的designfilt函数,并进行了傻瓜化处理。如果有更高需求的同学可以对该函数文件进行二次开发,主要参考这个官方文档。

function [dataOut,d] = funFirIirFliter(data,resp,option,compFlag)
% 进行FIR或者IIR滤波,可以实现滤波器设计、滤波、画图
% 如需对下述代码进行二次开发,可参考此官方帮助文档:https://ww2.mathworks.cn/help/signal/ref/designfilt.html?s_tid=doc_ta
% 输入:
% data:待滤波数据
% resp:滤波器响应类型和滤波类型,具体包含:
%       -'lowpassfir'      FIR低通滤波器,采用'window'设计方法对应的规范集,需要设置的参数包括:
%                          - option.order 滤波器阶数
%                          - option.CutoffFrequency 滤波器截止频率
%                          - option.Fs 采样频率
%       -'lowpassiir'      IIR低通滤波器,采用最小阶设计对应的规范集
%                          - option.Fs 采样频率
%                          - option.PassbandFrequency     通带频率
%                          - option.StopbandFrequency     阻带频率
%                          - option.DesignMethod     设计方法,选项: 'butter'、'cheby1'、'cheby2'、'ellip'
%       -'highpassfir'      FIR高通滤波器,采用'window'设计方法对应的规范集,需要设置的参数包括:
%                          - option.order 滤波器阶数
%                          - option.CutoffFrequency 滤波器截止频率
%                          - option.Fs 采样频率
%       -'highpassiir'     IIR高通滤波器,采用最小阶设计对应的规范集
%                          - option.Fs 采样频率
%                          - option.PassbandFrequency     通带频率
%                          - option.StopbandFrequency     阻带频率
%                          - option.DesignMethod     设计方法,选项: 'butter'、'cheby1'、'cheby2'、'ellip'
%       -'bandpassfir'     FIR带通滤波器,采用'window'设计方法对应的规范集,需要设置的参数包括:
%                          - option.order 滤波器阶数
%                          - option.CutoffFrequency1,... %通带起始频率
%                          - option.CutoffFrequency2,... %通带结束频率
%                          - option.Fs 采样频率
%       -'bandpassiir'     IIR带通滤波器,采用最小阶设计对应的规范集
%                          - option.Fs 采样频率
%                          - option.StopbandFrequency1, ...    % 阻带起始频率
%                          - option.PassbandFrequency1, ...    % 通带起始频率
%                          - option.PassbandFrequency2, ...    % 阻带截止频率
%                          - option.StopbandFrequency2, ...    % 通带截止频率
%                          - option.DesignMethod     设计方法,选项: 'butter'、'cheby1'、'cheby2'、'ellip'
%       -'bandstopfir'     FIR带阻滤波器,采用'window'设计方法对应的规范集,需要设置的参数包括:
%                          - option.order 滤波器阶数
%                          - option.CutoffFrequency1,... %通带起始频率
%                          - option.CutoffFrequency2,... %通带结束频率
%                          - option.Fs 采样频率
%       -'bandstopiir'     IIR带阻滤波器
%                          - option.order 滤波器阶数
%                          - option.CutoffFrequency1,... %通带起始频率
%                          - option.CutoffFrequency2,... %通带结束频率
%                          - option.Fs 采样频率
%
% compFlag:是否进行延迟补偿,'on'为开启补偿,'off'为关闭补偿。-对于fir方法,开启补偿会使得滤波后的数据变短,这是由于通过时移对其数据导致的,会删除最后 delay 个采样点
%            
% 输出:
% dataOut:滤波后数据
% d:设计好的滤波器

3.kSpecAnalysis.m文件

对数据进行及频谱分析,计算fft或psd数值结果,不画图。此函数文件一般情况不需要修改。

function [p,f] = kSpecAnalysis(data,fs,options)
% 对数据进行及频谱分析,计算fft或psd数值结果,不画图
% 输入:
% data为待分析信号,需要是一维实数
% fs为采样频率,即每秒钟采样点数
% options为可选选项,使用结构体的方式导入,安装自身需求选择是否设置。具体包括:
%    options.Detrend :去趋势,设置options.Detrend = 1时,将在做fft前去除data趋势,
%                      当画出的频谱图在0频率时出现峰值,可将该选项置1,可以有效抑制0频率的峰值,默认情况不去趋势
%    options.analysisType :频谱分析类型,当options.analysisType = 'fft'时,进行快速傅里叶变化FFT
%                                        当options.analysisType = 'psd'时,计算功率谱
%    options.psdUnit      :功率谱单位,当options.psdUnit = 1时,单位为W/Hz(默认)
%                                      当options.psdUnit = 2时,单位为分贝dB
% 输出:
% p:频谱分析的幅值
% f:频谱分析的频率轴

三、快速开始

1.运行测试脚本

先在MATLAB里打开下载好的文件夹,然后运行demoFirIirFliter.m程序,程序运行完毕后如果没报错,且正常画出滤波对比图像,则说明运行环境正常,程序正确。

2.修改仿真数据/导入数据

复制一个demoFirIirFliter.m的文件副本,在这个副本里做如下修改:

(1)第一种情况,你可能想要对你自己要研究的仿真数据进行滤波测试,此时你需要对 demoFirIirFliter.m 脚本文件中的第1小节内容进行修改替换即可。需要注意的是,请最好保持变量名的一致,即将待滤波信号命名为data,为一维数据。此时数据替换完成。

(2)第二种情况,你可能是想对一段真实采集的数据进行滤波,此时需要根据你的文件类型的不同(excel,txt,csv等),将数据导入MATLAB的方法有所不同。同学们可以看博主针对常用文件的导入方法的这个教程,教程上未包含的数据类型,大家可以再参考这个文档导入完成后请讲这个待滤波信号命名为data

3.实现滤波

参照 demoFirIirFliter.m文件中第二步,根据需要调整滤波器类型、滤波器参数设置(即option项)、延迟补偿标志位compFlag

运行程序即可。

四、关于完整版与公开版代码

功能完整版公开版
数据导入、参数设置、实现滤波
软件全部源码(函数m文件)×
滤波后的数据导出×
滤波数据长度无限制200个点以内

五、获取公开版程序(需使用电脑浏览器打开)

FIR/IIR滤波公开版代码

注:公开版代码需使用MATLAB2022a及以上版本

六、获取完整版程序(使用电脑浏览器或者手机浏览器打开)

点击下面“立即支付”按钮,付款后获取完整版代码下载链接和售后联系方式~。付款完成后刷新一下本页面即可看到下载链接。

(注意支付跳转失败的话,请使用浏览器打开本页面)

您需要先支付 52元 才能查看此处内容!立即支付

七、完整版代码重要更新

20221026 完成初版代码

八、常见问题

暂无