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

article/2025/10/19 6:56:10

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

不同窗函数的阻带最小衰减是不相同的,例如我们要求阻带衰减为50dB,则矩形窗和汉宁窗的最小衰减分别为21dB和44dB,若用这两种窗函数,无论N有多长,都没有办法满足阻带衰减达到50dB。为了满足阻带衰减达到50dB,只有选择海明窗,因为它的阻带衰减能达到53dB。所以窗函数的选择主要是根据滤波器指标中对As的要求。在选择窗函数后又怎么决定滤波器的阶数N呢?在设定的滤波器指标中给出了通带频率fp和阻带频率fs,在通带频率fs和阻带频率fs之间是过渡带,设△f=fs-fp,,则过渡带应与对应窗函数的“精确过渡带宽”相等。设把精确过渡带宽表示为dw/N,则对于任意某一种窗函数就应有

△f=dw/N

这样可得N为

N=dw/△f

根据上表,以海明窗为例,N=6.6π/△f,注意在计算中,△f是归一化的角频率。综上所述,经过渡带可求出FIR滤波器的阶数。对于带通滤波器或带阻滤波器,通带频率有fp1及fp2,阻带频率有fs1及fs2,以带通滤波器为例,分别求出△f1=fp1-fs1及△f2=fs2-fp2,从△f1和△f2之间选择小的一个作为△f:

△f=min[△f1,△f2]

式中:min[·]表示选用最小值。

案例、要求设计一个低通滤波器,采样频率为100Hz,通带频率fp=3Hz,阻带频率fs=5Hz;而通带波纹Rp=3dB,阻带衰减As=50dB。由于设计要求As=50dB,分析可知选择海明窗能满足要求,所以在窗函数法中用海明窗。程序如下:

clear all; clc; close allFs=100;                          % 采样频率 
Fs2=Fs/2;                        % 奈奎斯特频率
fp=3; fs=5;                      % 通带和阻带频率
Rp=3; As=50;                     % 通带波纹和阻带衰减
wp = fp*pi/Fs2; ws = fs*pi/Fs2;  % 通带和阻带归一化角频率
deltaw= ws - wp;                 % 过渡带宽Δω的计算
N = ceil(6.6*pi/ deltaw);        % 按海明窗计算所需的滤波器阶数N(按式(3-13-1))
N = N + mod(N,2);                % 保证滤波器系数长N+1为奇数
wind = (hamming(N+1))';          % 海明窗计算
Wn=(3+5)/100;                    % 计算截止频率
b=fir1(N,Wn,wind);               % 用fir1函数设计FIR第1类滤波器
[db,mag,phs,gdy,w]=freqz_m(b,1); % 计算滤波器响应
% 作图
subplot 211; plot(w*Fs/(2*pi),db,'k','linewidth',2);
title('(a)低通滤波器的幅值响应');
grid; axis([0 20 -70 10]); 
xlabel('频率/Hz');  ylabel('幅值/dB')
set(gca,'XTickMode','manual','XTick',[0,3,5,20])
set(gca,'YTickMode','manual','YTick',[-50,0])
subplot 212; stem(1:N+1,b,'k');
xlabel('频率/Hz');  ylabel('幅值/dB')
title('(b)低通滤波器的脉冲响应');
xlabel('样点');  ylabel('幅值')
axis([0 167 -0.05 0.1]); 
set(gca,'XTickMode','manual','XTick',[1,84,167])
set(gcf,'color','w');

运行结果如下:

说明:
①因为选择了海明窗,按式N=dw/△f求出滤波器阶数N:
N = ceil(6.6 * pi/ deltaw)
②一般设计的FIR滤波器都是第1类FIR滤波器,要求脉冲序列长N是奇数。而从①
中求得的滤波器阶数N不知是偶数还是奇数。通过N = N + mod(N,2)

保证滤波器阶数N为偶数,而脉冲响应序列长将是N+1,即为奇数,满足第1类FIR滤波器要求。滤波器阶数若为N,脉冲响应序列的长度总为N+1,在FIR滤波器中脉冲响应序列的长度与滤波器阶数总差1。

③在计算窗函数长度时用的deltaw是归一化角频率,而在fir1函数中的Wn用的是归一化频率,这两者的单位是不同的,且截止频率Wn的计算是用Wn=(fp+fs)/2。

运行程序后得上图,从图中可看出滤波器完全满足设计的要求,在5Hz处阻带衰减大于50dB。

参考文献:MATLAB数字信号处理85个实用案例精讲——入门到进阶;宋知用(编著)


http://chatgpt.dhexx.cn/article/0yH8e3qg.shtml

相关文章

一阶RC低通滤波器(二)

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

二阶有源滤波器设计

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

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

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

一阶滤波器

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

FIR数字滤波器设计

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

一阶二阶数字滤波器笔记

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

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

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

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

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

标识符无效

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

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

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

PLSQL ORA-00904 标识符无效

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

Oracle标识符无效

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

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

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

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

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

HQL 标识符无效

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

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

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

Unity⭐️VideoPlayer

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

ᑋᵉᑊᑊᵒ ᵕ̈ᰔᩚ

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

linux shell中 '' ``的区别

环境:ubuntu 10 符号:"" / / 相信很多linux初学者都会被这三个符号迷惑,我将用一个例子说明他们的区别 现在我按照替换执行灵活度排个序: :大笨蛋,你给他什么他就显示什么,不动脑子 " ":勉强吧&#xff…