matlab设计滤波器详解

目录

[1.filterDesigner 界面介绍](#1.filterDesigner 界面介绍)

[1.1 工具栏介绍](#1.1 工具栏介绍)

[1.2 参数设置介绍](#1.2 参数设置介绍)

2.设计流程

3.实例

4.参考资料


本文主要记录利用MATLAB的filterDesigner工具设计滤波器的完整步骤,以便后续复用。

1.filterDesigner 界面介绍

1.1 工具栏介绍

滤波器设定面板,如图1所示。
图1 滤波器设定面板

图中可以观察到Fpass(通带截止频率)、Fstop(阻带截止频率)、Apass(通带幅值)、Astop(阻带幅值)、Fs/2(采样频率的一半)的作用。

幅频响应图像如图2所示。
图2 幅值响应曲线

幅频响应曲线能够清晰呈现滤波器的频率特性,便于快速评估其设计合理性和指标符合度。

相频响应图像如图3所示。
图3 相频特性曲线

相频响应曲线可以用来判断滤波器是否满足期望的相位特性。

1.2 参数设置介绍

图4 滤波器参数设置图

1:滤波器的结构说明,其中包含滤波器的结构,阶数。
阶数:滤波器的阶数等于其传递函数分母的最高次方。阶数越高,滤波器的响应越精细,但计算复杂度也增加。通常,阶数越低,滤波器的实现越简单,但可能无法达到理想的频率响应。

2:滤波器的功能类型,决定其作用的频率范围。除了常见的低通、高通、带通、带阻 之外,还有线波滤波器:一种专门设计用于处理线性波形(如信号的方波或脉冲波形)的滤波器,通常用于信号的高精度平滑和特定噪声抑制。它的设计目标是消除特定频率的干扰信号,以保持信号的形状和质量。

3:滤波器的结构类型:FIR(有限冲激响应)和IIR(无限冲激响应)。
FIR滤波器 :其输出仅依赖于当前及过去的输入值(无反馈)。单位冲激响应有限,意味着其响应最终会消失。FIR滤波器通常具有线性相位特性,且始终稳定。适用于需要高精度相位控制的场合,但在某些应用中可能需要较高阶数才能达到理想性能。
IIR滤波器:其输出不仅依赖于当前和过去的输入值,还依赖于过去的输出值(有反馈)。IIR滤波器具有无限长的冲激响应,理论上无法完全消失。它们通常具有较低的阶数,但在某些情况下,可能会出现不稳定性。适用于对计算效率有较高要求的场合,但在设计时需要注意稳定性。

4:滤波器的阶数设置
指定阶数 :手动设置滤波器的阶数,直接控制滤波器的复杂度和精度。
最小阶数:滤波器的最小阶数是根据给定的通带截止频率(Fpass)和阻带截止频率(Fstop)以及幅值要求(Apass和Astop)自动计算得到的。

5: 选项

完全匹配通带:使通带内的频率响应尽量接近理想值,也就是通过信号的频率范围内,保持信号幅度基本不变。

完全匹配阻带:使阻带内的频率响应尽量接近零,以最大限度地抑制不需要的信号。

6: 频率设定,设定多个频率参数:

Fs(采样频率) :滤波器的采样频率,通常用来确定数字信号的处理速率。

Fpass(通带截止频率) :通带的截止频率,表示信号开始衰减的频率。在实际应用中,通常设定为Apass幅度下的截止频率。

Fstop(阻带截止频率):阻带的截止频率,表示滤波器开始完全抑制信号的频率,对应幅值是Astop。

7:幅值的设定,单位是dB,Apass表示通带截止频率的幅值,Astop表示阻带截止频率的幅值;

以上就是常用的图像界面和参数设置介绍,接下来介绍一下如何使用。

2.设计流程

用matlab设计滤波器流程如图5所示。
图5 matlab设计滤波器流程图

根据需求选择对应功能的滤波器,然后根据设备的算力、是否需要保持线性相位等需求选择FIR还是IIR类型的滤波器,设计完之后将参数保存,等使用的时候拿出来用即可。

3.实例

以低通滤波器为例,采样频率设为100Hz。原始信号由10Hz和40Hz的混合波形组成。滤波器参数设置为:通带截止频率12Hz,阻带截止频率30Hz。

通带截止频率和阻带截止频率一般甲方会有要求,通用的设置规则:

  • 通带截止频率一般选择在目标信号的频段内,确保所需信号能够通过滤波器而不被削弱。
  • 阻带截止频率必须小于或等于奈奎斯特频率(采样频率的一半)。
  • 确保通带和阻带之间有足够的间隔,以便滤波器能够提供良好的过渡和性能。
  • 要结合硬件的资源来考虑

滤波器的设置如图6所示。
图6 低通滤波器设置

存储滤波器参数:

(1)选择存储滤波器

(2)给滤波器命名并点击确定,此时只是将刚刚设置的滤波器保存在filterDesigner中;

(3)导出滤波器参数;

(4)一般会选择导出为mat文件,然后再导入工作区中,这样方便下次还可以使用这个滤波器,需要注意的是,加载之后调用的变量名必须与保存时一致;

(5)代码使用:

Matlab 复制代码
%% 低通滤波器
 
%% 初始设置
% 清空工作空间,关闭无关页面
clc,clear,close all;
 
% 绘图变量
font_size = 12; axis_size = 10; line_width = 2; legend_size = 10.5; marker_size = 12;
figure_width = 14; figure_height = 8; BiaValue = 0;
 
%% //原信号 
%  //y = 3*sin(2*pi*10*t) + sin(2*pi*40*t);
 
t = 0:0.01:1; %1khz的采样率
y = 3*sin(2*pi*10*t) + sin(2*pi*40*t) ;
 
figure
set(gcf,'Unit','centimeters','Position',[3 3 3+figure_width 3+figure_height]);
set(gca,'LooseInset',get(gca,'TightInset')+[BiaValue,0,0,0],'FontName','KaiTi','FontSize',font_size);
plot(t, y, 'b-', 'LineWidth', line_width)
set(gca,'FontSize',font_size,'FontName','KaiTi')
xlim([0 1])
ylim([-6 6])
set(gca,'XTick',0:0.25:1)
set(gca,'YTick',-6:3:6)
xlabel('时间 (s)', 'FontSize', font_size, 'FontName', 'KaiTi')
ylabel('信号幅值', 'FontSize', font_size, 'FontName', 'KaiTi')
title('原信号采样后的波形', 'FontSize', font_size*1.5, 'FontName', 'KaiTi')
 
%% //采样信号频域分析
% 数据长度
datalength = length(y);
% 对数据进行FFT
yFFT = fft(y, datalength);
mag = abs(yFFT);
% 幅值归一化
mag = mag*2/datalength;
pha = angle(yFFT)*180/pi;
% 对无效相位进行置0
for i = 1:datalength
    if (mag(1,i)<0.3)
        pha(1,i) = 0;
    end
end
% 序列坐标
n = 0:datalength-1;
% 采样频率
fs = 1/0.01;
% 序列频率
f = (0:datalength-1)*fs/datalength;
 
figure
set(gcf,'Unit','centimeters','Position',[3 3 3+figure_width 3+figure_height]);
set(gca,'LooseInset',get(gca,'TightInset')+[BiaValue,0,0,0],'FontName','KaiTi','FontSize',font_size);
stem(f(1:datalength/2), mag(1:datalength/2), 'b-', 'LineWidth', line_width)
set(gca,'FontSize',font_size,'FontName','KaiTi')
xlim([0 50])
ylim([0 4])
set(gca,'XTick',0:10:50)
set(gca,'YTick',0:1:4)
xlabel('频率 (Hz)', 'FontSize', font_size, 'FontName', 'KaiTi')
ylabel('幅值', 'FontSize', font_size, 'FontName', 'KaiTi')
title('采样信号的幅度谱', 'FontSize', font_size*1.5, 'FontName', 'KaiTi')
 
figure
set(gcf,'Unit','centimeters','Position',[3 3 3+figure_width 3+figure_height]);
set(gca,'LooseInset',get(gca,'TightInset')+[BiaValue,0,0,0],'FontName','KaiTi','FontSize',font_size);
stem(f(1:datalength/2), pha(1:datalength/2), 'b-', 'LineWidth', line_width)
set(gca,'FontSize',font_size,'FontName','KaiTi')
xlim([0 50])
ylim([-100 200])
set(gca,'XTick',0:10:50)
set(gca,'YTick',-100:100:200)
xlabel('频率 (Hz)', 'FontSize', font_size, 'FontName', 'KaiTi')
ylabel('相位 (deg)', 'FontSize', font_size, 'FontName', 'KaiTi')
title('采样信号的相位谱', 'FontSize', font_size*1.5, 'FontName', 'KaiTi')
 
%% //滤波器低通滤波
% filtercoe = [0.0282,  0.0188,  -0.0095, -0.0477, -0.0527, 0.0122,... 
%              0.1386,  0.2661,  0.3197,  0.2661,  0.1386,  0.0122,... 
%              -0.0527, -0.0477, -0.0095, 0.0188,  0.0282];
load('low_filtercoe.mat'); 
filtercoe = Num ;
y_Filter = filter(filtercoe, 1, y);
 
% 绘制滤波后的信号
figure
set(gcf,'Unit','centimeters','Position',[3 3 3+figure_width 3+figure_height]);
set(gca,'LooseInset',get(gca,'TightInset')+[BiaValue,0,0,0],'FontName','KaiTi','FontSize',font_size);
plot(t, y_Filter, 'b-', 'LineWidth', line_width)
set(gca,'FontSize',font_size,'FontName','KaiTi')
xlim([0 1])
ylim([-6 6])
set(gca,'XTick',0:0.25:1)
set(gca,'YTick',-6:3:6)
xlabel('时间 (s)', 'FontSize', font_size, 'FontName', 'KaiTi')
ylabel('信号幅值', 'FontSize', font_size, 'FontName', 'KaiTi')
title('滤波后的信号', 'FontSize', font_size*1.5, 'FontName', 'KaiTi')

%% //滤波信号频域分析
% 数据长度
datalength = length(y_Filter);
% 对数据进行FFT
yFFT = fft(y_Filter, datalength);
mag = abs(yFFT);
% 幅值归一化
mag = mag*2/datalength;
pha = angle(yFFT)*180/pi;
% 对无效相位进行置0
for i = 1:datalength
    if (mag(1,i)<0.3)
        pha(1,i) = 0;
    end
end
% 序列坐标
n = 0:datalength-1;
% 采样频率
fs = 1/0.01;
% 序列频率
f = (0:datalength-1)*fs/datalength;
 
figure
set(gcf,'Unit','centimeters','Position',[3 3 3+figure_width 3+figure_height]);
set(gca,'LooseInset',get(gca,'TightInset')+[BiaValue,0,0,0],'FontName','KaiTi','FontSize',font_size);
stem(f(1:datalength/2), mag(1:datalength/2), 'b-', 'LineWidth', line_width)
set(gca,'FontSize',font_size,'FontName','KaiTi')
xlim([0 50])
ylim([0 4])
set(gca,'XTick',0:10:50)
set(gca,'YTick',0:1:4)
xlabel('频率 (Hz)', 'FontSize', font_size, 'FontName', 'KaiTi')
ylabel('幅值', 'FontSize', font_size, 'FontName', 'KaiTi')
title('滤波后信号的幅度谱', 'FontSize', font_size*1.5, 'FontName', 'KaiTi')
 
figure
set(gcf,'Unit','centimeters','Position',[3 3 3+figure_width 3+figure_height]);
set(gca,'LooseInset',get(gca,'TightInset')+[BiaValue,0,0,0],'FontName','KaiTi','FontSize',font_size);
stem(f(1:datalength/2), pha(1:datalength/2), 'b-', 'LineWidth', line_width)
set(gca,'FontSize',font_size,'FontName','KaiTi')
xlim([0 50])
ylim([-100 200])
set(gca,'XTick',0:10:50)
set(gca,'YTick',-100:100:200)
xlabel('频率 (Hz)', 'FontSize', font_size, 'FontName', 'KaiTi')
ylabel('相位 (deg)', 'FontSize', font_size, 'FontName', 'KaiTi')
title('滤波后信号的相位谱', 'FontSize', font_size*1.5, 'FontName', 'KaiTi')

实验对比结果如下图所示 :

如图所示,经滤波处理后输出信号仅保留了10Hz成分,有效滤除了40Hz干扰。值得注意的是,滤波后的波形整体发生了偏移,这一现象正是FIR滤波器线性相位特性的典型表现。

4.参考资料

1.数字信号处理_第1个Matlab编程实例_哔哩哔哩_bilibili

2.NO.3 深入了解Matlab中的fdatool工具箱_哔哩哔哩_bilibili

以上就是本次笔记的内容,希望对阅读笔记的朋友有所帮助,如果哪里写的不对,欢迎在评论区交流指正。

相关推荐
IT猿手11 小时前
基于控制障碍函数的多无人机编队动态避障控制方法研究,MATLAB代码
开发语言·matlab·无人机·openclaw·多无人机动态避障路径规划·无人机编队
Evand J15 小时前
【MATLAB复现RRT(快速随机树)算法】用于二维平面上的无人车路径规划与避障,含性能分析与可视化
算法·matlab·平面·无人车·rrt·避障
s090713616 小时前
【声纳成像】基于滑动子孔径与加权拼接的条带式多子阵SAS连续成像(MATLAB仿真)
开发语言·算法·matlab·合成孔径声呐·后向投影算法·条带拼接
IT猿手18 小时前
基于 ZOH 离散化与增量 PID 的四旋翼无人机轨迹跟踪控制研究,MATLAB代码
开发语言·算法·matlab·无人机·动态路径规划·openclaw
IT猿手18 小时前
基于控制障碍函数(Control Barrier Function, CBF)的无人机编队三维动态避障路径规划,MATLAB代码
开发语言·matlab·无人机·动态路径规划·无人机编队
SugarFreeOixi18 小时前
MATLAB绘图风格记录NP类型
python·matlab·numpy
IT猿手18 小时前
基于 CBF 的多无人机编队动态避障路径规划研究,无人机及障碍物数量可以自定义修改,MATLAB代码
开发语言·matlab·无人机·动态路径规划
IT猿手21 小时前
基于强化学习Q-learning算法的无人机三维路径规划算法原理与实现,MATLAB代码
算法·matlab·无人机·路径规划·动态路径规划
ghie90901 天前
拉普拉斯金字塔图像融合MATLAB仿真程序
人工智能·计算机视觉·matlab
IT猿手1 天前
基于动态三维环境下的Q-Learning算法无人机自主避障路径规划研究,MATLAB代码
算法·matlab·无人机·动态路径规划·多无人机动态避障路径规划