MATLAB—FIR数字滤波器设计

article/2025/10/19 6:55:12

目录:

    • 1 FIR滤波器的原理
    • 2 FIR滤波器的特点
      • 2.1 相位特性
        • 2.1.1 偶对称
        • 2.1.2 奇对称
      • 2.2 幅度特性
    • 3 几种滤波器函数
      • 3.1 fir1()
      • 3.2 fir2()
      • 3.3 kaiserord()
      • 3.4 firpm()
    • 4 仿真实例
      • 4.1 代码
      • 4.2 仿真分析


  本文是基于MATLAB的数字滤波器设计,所有数据基于计算机内部处理,因而都是离散信号,所以采用的是数字滤波器。从实现的网络结构或者单位脉冲响应来看,数字滤波器可以分为FIR(Finite Impulse Response , 有限脉冲响应)滤波器和IIR(Infinite Impulse Response , 无线脉冲响应)滤波器。本文主要从两个方面介绍FIR滤波器的MATLAB设计:集成函数和工具箱。


1 FIR滤波器的原理

  从时域看,FIR的一般表达式H(z)如下:

∑ n = 0 N − 1 h ( n ) z − n = h ( 0 ) + h ( 1 ) z − 1 + . . . + h ( N − 1 ) z − ( N − 1 ) \sum_{n=0}^{N-1}h(n)z^{-n}=h(0)+h(1)z^{-1}+...+h(N-1)z^{-(N-1)} n=0N1h(n)zn=h(0)+h(1)z1+...+h(N1)z(N1)

  从表达式至少可以看出两点:系统只在原点处有极点,可以用抽头法构建模型,每一个乘法器的系数即为抽头系数。
由于N是有限值,因此抽头系数项是有限的,可以得到h(n): 

∑ n = 0 N − 1 h ( 0 ) δ ( n ) + h ( 1 ) δ ( n − 1 ) + . . . + h ( N − 1 ) δ ( n − ( N − 1 ) ) \sum_{n=0}^{N-1}h(0)δ(n)+h(1)δ(n-1)+...+h(N-1)δ(n-(N-1)) n=0N1h(0)δ(n)+h(1)δ(n1)+...+h(N1)δ(n(N1))

  可以看出h(n),即系统的脉冲响应的项数是有限的,因此成为有限脉冲响应。


2 FIR滤波器的特点

  FIR一个突出的优点就是具有严格的线性相位特性,但并不是所有结构的FIR都具备此特性,只有当FIR滤波器的单位脉冲响应满足对称条件时,FIR才具有线性相位特性。

2.1 相位特性

  研究FIR的相位特性时,将结构分为奇对称和偶对称两种。


2.1.1 偶对称

当FIR单位脉冲响应满足偶对称,即有:

h ( n ) = h ( M − n ) , 0 ≤ n ≤ M h(n)=h(M-n), 0 ≤ n ≤ M h(n)=h(Mn),0nM

代入H(z)的表达式:

∑ n = 0 M h ( n ) z − n = ∑ n = 0 M h ( M − n ) z − n \sum_{n=0}^{M}h(n)z^{-n}=\sum_{n=0}^{M}h(M-n)z^{-n} n=0Mh(n)zn=n=0Mh(Mn)zn

令M-n=k , 对等号右边部分做变换:

H ( z ) = ∑ k = 0 M h ( k ) z − ( M − k ) = z − M ∑ n = 0 M h ( k ) z k = z − M H ( z − 1 ) H(z)=\sum_{k=0}^{M}h(k)z^{-(M-k)}=z^{-M}\sum_{n=0}^{M}h(k)z^k=z^{-M}H(z^{-1}) H(z)=k=0Mh(k)z(Mk)=zMn=0Mh(k)zk=zMH(z1)

所以H(z)有两种表达方式,那么H(z)可以表示为:

H ( z ) = 1 2 [ H ( z ) + z − M H ( z ) ] = 1 2 ∑ k = 0 M h ( n ) [ z − n + z − M z n ] H(z)=\frac{1}{2}[H(z)+z^{-M}H(z)]=\frac{1}{2}\sum_{k=0}^{M}h(n)[z^{-n}+z^{-M}z^{n}] H(z)=21[H(z)+zMH(z)]=21k=0Mh(n)[zn+zMzn]

提取一项 z − M 2 z^{-\frac{M}{2}} z2M,可得到滤波器频响:

H ( e j w ) = e − j w M 2 ∑ n = 0 M h ( n ) c o s [ w ( M 2 − n ) ] = A ( w ) e − j w M 2 H(e^{jw})=e^{-jw\frac{M}{2}}\sum_{n=0}^{M}h(n)cos[w(\frac{M}{2}-n)]=A(w)e^{-jw\frac{M}{2}} H(ejw)=ejw2Mn=0Mh(n)cos[w(2Mn)]=A(w)ejw2M

根据相频定义,可知FIR相频为:

φ ( w ) = − M 2 w φ(w)=-\frac{M}{2}w φ(w)=2Mw

故满足线性相位特性。


2.1.2 奇对称

当FIR单位脉冲响应满足偶对称,即有:

h ( n ) = − h ( n − M ) , 0 ≤ n ≤ M h(n)=-h(n-M), 0 ≤ n ≤ M h(n)=h(nM),0nM

由2.1.1推导思路可得:

H ( e j w ) = e − j w M 2 + π 2 ∑ n = 0 M h ( n ) s i n [ w ( M 2 − n ) ] = A ( w ) e − j w M 2 + π 2 H(e^{jw})=e^{-jw\frac{M}{2}+\frac{π}{2}}\sum_{n=0}^{M}h(n)sin[w(\frac{M}{2}-n)]=A(w)e^{-jw\frac{M}{2}+\frac{π}{2}} H(ejw)=ejw2M+2πn=0Mh(n)sin[w(2Mn)]=A(w)ejw2M+2π

根据相频定义,可知FIR相频为:

φ ( w ) = − M 2 w + π 2 φ(w)=-\frac{M}{2}w+\frac{π}{2} φ(w)=2Mw+2π

故满足线性相位特性。


2.2 幅度特性

  研究FIR的幅度特性时,将结构分别分为偶数和奇数的偶对称和奇对称四种。推导方式和相位特性类似,这里直接给出结论。

单位脉冲响应特征相位特性幅度特性滤波器种类
偶对称,偶整数线性相位对于w=0,π ,2π为偶对称适合各种滤波器
偶对称,奇整数线性相位对于w=π为奇对称,对于w=0、2π为偶对称,w=π处为0不适合高通,带阻
奇对称,偶整数线性相位,附加90°相移对于w=0、π、2π均为奇对称,在w=0、π、2π处都为0只适合带通
偶对称,奇整数线性相位,附加90°相移对于w=0、2π均为奇对称,在w=π处为偶对称,在w=0、2π处为0适合高通、带通


3 几种滤波器函数

3.1 fir1()

  • fir1函数语法形式
b=fir1(n,wn,'ftype',window,'noscale');
% n     滤波器阶数
% wn    类型和意义与ftype有关,wn的取值范围为(0,1)1代表fs的1/2% 当wn为单值,表示截止频率。若ftype为'low',表示低通;若ftype为'high',表示高通。
% 当wn为[wn1 wn2],即两个元素组成的向量,则表示带通或带阻,ftype对应'bandpass''stop'% 当wn由多个数组成的向量[w1 w2...wn],其中w1<w2<<wn,则fir1返回带0<ω<w1,w1<ω<w2,…,wn<ω<1的n阶多带滤波器。
% ftype 滤波器类型
% 'low'       -低通
% 'high'      -高通
% 'bandpass'  -带通
% 'stop'      -带阻
% 'DC-0'      -第一带为带阻
% 'DC-1'	  -第一带为带通
% window  默认为海明窗(Hamming),还有汉宁窗(Hanning),布拉克曼窗(Blackman)和凯塞窗(Kaiser)
% noscale 指定归一化滤波器幅度


3.2 fir2()

  fir2在fir1的基础上,还可以指定频段内的理想幅值,即任意响应滤波器。

  • fir2函数语法形式
b=fir2(n,fm,m,npt,lap,window);
% n        滤波器阶数
% f和m     f是一个频段向量,在(0,1)内分布,对应归一化频率;m是对应频段理想幅值
% npt      正整数,指定对幅频进行插值的点数,默认为512
% lap      插值时,将非连续点转化成连续点的点数,默认为25
% window   窗函数,默认为海明窗


3.3 kaiserord()

  凯塞窗,根据一些期望的参数,得到设计滤波器所需要的参数,可以用于设计最优滤波器。

  • kaiserord函数语法形式
[n,wn,beta,ftype]=kaiserord(f,a,dev,fs);
% 输入
% f   偶数个元素的向量,表示过渡带的起点到终点,过渡带的增益。
% eg:[1200 1300 1500 1600]表示过渡带1200~1300Hz,1500~1600Hz。fs为采样频率。如果没有fs,f元素取值在(0,1),即自动归一化;如果有fs,f就为实际频率。
% a   f确定了过渡带,a确定各频段的理想幅值。通带设置为1,阻带设置为0% 假设f=[0 0.3 0.4 0.6 0.7 1.0] , a=[0 1 0 0 0.5 0.5]
% dev 向量,各频段纹波。
% 输出
% n     返回滤波器阶数
% wn    向量,返回滤波器截止频率点
% beta  返回凯塞窗的beta值
% ftype 返回滤波器类型 

a和f的对应关系


3.4 firpm()

  既能设计任意响应,又能设计最优滤波器,还能附加90°相移

  • firpm函数语法形式
[b,delta]=firpm(n,f,a,w,'ftype');
% n,f,a与kaiserord函数一样
% w,对应频段幅值的权值,权值越高,越接近理想状态
% ftype 滤波器结构。默认为偶对称脉冲响应,'hilbert'为奇对称结构,即具有90°相移特性
% delta 最大纹波


4 仿真实例

  需求:利用凯塞窗设计一个低通FIR滤波器,过渡带为1000~1500Hz,采样频率为8000Hz,通带纹波最大为0.01,阻带纹波最大为0.05。利用海明窗及firpm函数设计相同的低通滤波器,截止频率为1500Hz,滤波器阶数为凯赛窗函数求取的值。绘出三种方法设计的幅度频率响应曲线。

4.1 代码


%% 低通;过渡带为1~1.5KHz,采样频率8KHz,通带最大纹波0.01,阻带最大纹波0.05% 获取凯塞窗参数,后续fir1要设计凯赛窗的低通滤波器
fs=8000;                                   % 采样频率
fc=[1000 1500];                            % 过渡带;1000~1500过渡带.通带:0~(1000*2/fs),阻带:(1500*2/fs)~1
mag=[1 0];                                 % 理想幅值.0~1000*2/fs是11500*2/fs~10
dev=[0.01 0.05];                           % 纹波
[n,wn,beta,ftype]=kaiserord(fc,mag,dev,fs);% 获取凯塞窗参数,根据过渡带幅值返回ftype类型% fir1设计凯塞窗和海明窗滤波器
h_kaiser=fir1(n,wn,ftype,kaiser(n+1,beta));
h_hamm=fir1(n,fc(2)*2/fs);                 %fc(2)=1500Hz,LPF截止频率% 设计最优滤波器
fpm=[0 fc(1)*2/fs fc(2)*2/fs 1];           % firpm频段向量,归一化[0 1]
magpm=[1 1 0 0];% firpm幅值向量
h_pm=firpm(n,fpm,magpm);                   %设计低通滤波器% 幅频
m_kaiser=20*log(abs(fft(h_kaiser,1024)))/log(10);
m_hamm=20*log(abs(fft(h_hamm,1024)))/log(10);
m_pm=20*log(abs(fft(h_pm,1024)));% 设置幅频响应的横坐标为Hz
x_f=[0:1:length(m_kaiser)/2]*fs/length(m_kaiser);% 只显示正频率部分
m1=m_kaiser(1:length(x_f));
m2=m_hamm(1:length(x_f));
m3=m_pm(1:length(x_f));% 绘制幅频曲线
plot(x_f,m1,'-',x_f,m2,'-.',x_f,m3,'--');
xlabel('频率(Hz)');
ylabel('幅度(dB)');
legend('凯塞窗','海明窗','最优滤波器');
grid;


4.2 仿真分析

  如图所示,绘制了三种滤波器。如果要用凯塞窗设计fir1,那么先要利用kaiserord函数获取凯塞窗的相关参数,即第一种滤波器。如果设计海明窗,则输入截止频率即可(要归一化后的频率,否则需要输入采样频率)。设计最优滤波器输入频段和相应幅度即可,这里需要和前两种做比较,因此都是输入n阶。


http://chatgpt.dhexx.cn/article/F6osePQc.shtml

相关文章

窗函数法设计FIR中,如何选择窗函数和阶数N

在用窗函数法设计FIR滤波器时&#xff0c;给出了滤波器要求的具体指标&#xff0c;包括通带频率fp、阻带频率fs、通带波纹Rp和阻带衰减As等&#xff0c;有了这些指标后&#xff0c;是否什么窗函数都可以选择呢&#xff1f;答案是否定的。那么怎么选择窗函数呢&#xff1f;在本小…

一阶RC低通滤波器(二)

这篇文章补充下前面讲的一阶低通滤波器。在母线电压采样或是在电机的三相端电压采样时&#xff0c;往往是先分压&#xff0c;再经过RC低通滤波器。电路图如下&#xff1a; 1&#xff1a;先求输出和输入的关系&#xff08;Uao/Ua&#xff09; 从上式可以看出系统相当于一个典…

二阶有源滤波器设计

1引入 为什么要用有源二阶滤波器&#xff1f; (1)从有源来说 对于无源二阶低通滤波器&#xff1a; 其幅頻方程为&#xff1a; 我们从中可以看出其通带截止频率为 有其品质因子为0.372。 我们根据上图得到二阶无源低通滤波器的品质因子只有0.372&#xff0c;如果希望Q大于0.5…

滤波算法——均值滤波,中值滤波,一阶(αβ)滤波,卡尔曼滤波

滤波算法——均值滤波&#xff0c;中值滤波&#xff0c;一阶(αβ)滤波&#xff0c;卡尔曼滤波 因工作涉及到数据滤波(滤噪)处理&#xff0c;汇总了一些网上简单的滤波算法&#xff0c;方便日后查看。 滤波算法包括&#xff1a;均值滤波&#xff0c;中值滤波&#xff0c;一阶…

一阶滤波器

1. 一阶滤波算法的原理 一阶滤波&#xff0c;又叫一阶惯性滤波&#xff0c;或一阶低通滤波。是使用软件编程实现普通硬件RC低通滤波器的功能。 一阶低通滤波的算法公式为&#xff1a; Y(n)αX(n) (1-α)Y(n-1) 式中&#xff1a;α滤波系数&#xff1b;X(n)本次采样值&…

FIR数字滤波器设计

今天给大侠带来FIR数字滤波器设计&#xff0c;由于篇幅较长&#xff0c;分三篇。今天带来第三篇&#xff0c;FIR数字滤波器设计&#xff0c;包括窗函数法设计FIR滤波器、频率采样法设计FIR滤波器以及基于firls函数和remez函数的最优化方法设计FIR滤波器。话不多说&#xff0c;上…

一阶二阶数字滤波器笔记

数字滤波器 一阶数字滤波器时域分析频域分析数字化代码示例 二阶巴特沃斯低通滤波器S域和Z域的频率关系分析巴特沃斯滤波器举例说明代码示例 声明&#xff1a;感谢知乎大佬的文章&#xff0c;原文链接 数字滤波器实现方法是把滤波器所要完成的运算编成程序并让计算机执行,也就…

简单二阶滤波器截止频率的计算

最近刚好学习到这了&#xff0c;而我在网上查资料的时候却非常难找&#xff0c;不少资料讲解不够详细&#xff0c;所以经过我努力也为了为大家做点贡献的想法&#xff0c;以自己的见解写下这篇文章。废话不多说&#xff0c;先从一阶滤波器讲起。 一阶低通滤波器&#xff1a; …

如何确定插值滤波器的阶数

在信号处理中&#xff0c;滤波器的系数我们往往都是通过MATLAB来设计&#xff0c;只要我们知道滤波器的通带截止频率和阻带起始频率&#xff0c;就可以通过MATLAB中的fdatool&#xff08;在MATLAB2020中使用filterDesigner&#xff09;来设计滤波器了。 我们使用归一化的参数来…

标识符无效

表中存在该列&#xff0c;插入的时候却显示 标识符无效&#xff0c;使用dbsql插入报错&#xff0c;自己写入数据没有问题&#xff01; 查资料发现可能和列的大小写有关。这里强调sql一定用全大写来写避免不必要的麻烦&#xff01;但是我改过后发现并不是这个问题…… 问题已解…

ORA-00904 ID 标识符无效 解决方案

msg&#xff1a;"数据访问异常" dev&#xff1a;"ORA-00904&#xff1a;"ID"&#xff1a;标识符无效 ORA&#xff1a;即 Oracle 报错。 标识符无效是因为&#xff1a;SQL语句中&#xff0c;列名&#xff08;ID&#xff09;不在表中。解决方案&#x…

PLSQL ORA-00904 标识符无效

问题在于“COMPONET_ID” 是字符串&#xff0c;无法识别&#xff0c;如果不是字符串&#xff0c;就可以识别

Oracle标识符无效

Oracle在创建表的时候提示“ORA-00904&#xff1a;标识符无效” 原因为最后一行列定义多了一个逗号&#xff0c;去掉即可。

【Oracle相关】坑!使用oracle时,发生标识符无效解决办法

–真是个大坑 使用oracle时,发生标识符无效解决办法 一般出现该错误的原因&#xff1a; 1、列名写错导致 2、使用了关键字作为了列名 但是这次遇到的情况有点奇葩 通过dblink直接查询该表&#xff0c;并没有报出问题&#xff0c;但在存储过程中通过dblink访问就一直报标识符…

ORA-00904 标识符无效 解决方案

ORA&#xff1a;即Oracle报错。 标识符无效&#xff1a;SQL语句中&#xff0c;这个字段名不在表中。 解决方案&#xff1a;修改SQL语句中对应的字段或者修改表里面对应的列名。 在这里我想说一下&#xff0c;因为我用的是hibernate内部封装好的save方法&#xff0c;咱也不能去改…

HQL 标识符无效

这是报错 因为刚学HIbernate&#xff0c;很多小问题其实挺折磨人的 这是代码&#xff08;我根据网上搜索的答案还有自己的判断测试&#xff0c;感觉应该可能是字段没有" "的问题&#xff09; Configuration configuration new Configuration().configure();Session…

ORA-00904:标识符无效(太坑了!!)

ORA-00904:标识符无效 解决办法(Oracle字段名区分大小写的坑) 问题描述 我在使用jpa或者mybatis集成Oracle进行where查询的时候发现一直出现&#xff1a; java.sql.SQLSyntaxErrorException: ORA-00904: “USER0_”.“PWD”: 标识符无效 下面是问题代码&#xff1a; Testvoid…

Unity⭐️VideoPlayer

文章目录 &#x1f6a9; 解决安卓视频播放模糊 &#x1f6a9; 解决安卓视频播放模糊 1️⃣ 设置RawImage的size跟原视频一致 2️⃣ RawImage的抗锯齿Anti-Aliasing改为8 3️⃣ 勾选sRGB 4️⃣ 视频编码设为H264 大家还有什么问题&#xff0c;欢迎在下方留言&#xff01; 如…

ᑋᵉᑊᑊᵒ ᵕ̈ᰔᩚ

** ** 第一章 大数据概述 ** ** 1.大数据技术的产生 2.大数据的基本概念 什么是大数据&#xff1f; 定义&#xff1a;大数据是指无法在一定时间内用常规软件工具进行抓取&#xff0c;管理和处理的数据集合 经典案例&#xff1a; (1)啤酒与尿布 (2)谷歌与流感 大数据的范…