Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >基于Matlab的FIR滤波器设计与实现

基于Matlab的FIR滤波器设计与实现

作者头像
AIHGF
发布于 2019-02-18 02:54:36
发布于 2019-02-18 02:54:36
2.3K0
举报
文章被收录于专栏:AIUAIAIUAI

一、摘要

前面一篇文章介绍了通过FDATool工具箱实现滤波器的设计,见“基于Matlab中FDATool工具箱的滤波器设计及相关文件的生成”,这里通过几个例子说明采用Matlab语言设计FIR滤波器的过程。

二、实验平台

Matlab7.1

三、实验原理

以低通滤波器为例,其常用的设计指标有:

  1. 通带边缘频率fp(数字频率为Ωp)
  2. 阻带边缘频率fst (数字频率为Ωst)
  3. 通带内最大纹波衰减δp=-20log10(1-αp),单位为 dB
  4. 阻带最小衰减αs=-20log10(αs),单位为 dB
  5. 阻带起伏αs
  6. 通带峰值起伏αp

  其中,以1、2、3、4条最为常用。5、6条在程序中估算滤波器阶数等参数时会用到。

数字频率 = 模拟频率/采样频率

四、实例分析

例1  用凯塞窗设计一FIR低通滤波器,通带边界频率Ωp=0.3pi,阻带边界频率 Ωs=0.5pi,阻带衰减δs不小于50dB。

方法一:手动计算滤波器阶数N和β值,之后在通过程序设计出滤波器。

第一步:通过过渡带宽度和阻带衰减,计算滤波器的阶数B和β值。

第二步:通过程序设计滤波器。

程序如下:

b = fir1(29,0.4,kaiser(30,4.55));

[h1,w1]=freqz(b,1);  

plot(w1/pi,20*log10(abs(h1))); 

axis([0,1,-80,10]); 

grid;

xlabel('归一化频率/p') ;

ylabel('幅度/dB') ;

波形如下:

方法二:

采用[n,Wn,beta,ftype] = kaiserord(f,a,dev)函数来估计滤波器阶数等,得到凯塞窗滤波器。

  这里的函数kaiserord(f,a,dev)或者kaiserord(f,a,dev,fs):

  f为对应的频率,fs为采样频率;当f用数字频率表示时,fs则不需要写。

  a=[1 0]为由f指定的各个频带上的幅值向量,一般只有0和1表示;a和f长度关系为(2*a的长度)- 2=(f的长度)

  devs=[0.05 10^(-2.5)]用于指定各个频带输出滤波器的频率响应与其期望幅值之间的最大输出误差或偏差,长度与a相等,计算公式:

阻带衰减误差=αs,通带衰减误差=αp,可有滤波器指标中的3、4条得到。

  fs缺省为2Hz。

程序如下:

fcuts = [0.3  0.5]; %归一化频率omega/pi,这里指通带截止频率、阻带起始频率

mags = [1 0];

devs = [0.05 10^(-2.5)];

[n,Wn,beta,ftype] = kaiserord(fcuts,mags,devs);  %计算出凯塞窗N,beta的值

hh = fir1(n,Wn,ftype,kaiser(n+1,beta),'noscale'); 

freqz(hh);

波形如下:

实际中,一般调用MATLAB信号处理工具箱函数remezord来计算等波纹滤波器阶数N和加权函数W(ω),调用函数remez可进行等波纹滤波器的设计,直接求出滤波器系数。函数remezord中的数组fedge为通带和阻带边界频率,数组mval是两个边界处的幅值,而数组dev是通带和阻带的波动,fs是采样频率单位为Hz。

例2  利用雷米兹交替算法设计等波纹滤波器,设计一个线性相位低通FIR数字滤波器,其指标为:通带边界频率fc=800Hz,阻带边界fr=1000Hz,通带波动 阻带最小衰减At=40dB,采样频率fs=4000Hz。 

解:在MATLAB中可以用remezord 和remez两个函数设计

程序如下:

fedge=[800 1000]; 

mval=[1 0]; 

dev=[0.0559 0.01];

fs=4000; 

[N,fpts,mag,wt]=remezord(fedge,mval,dev,fs); 

b=remez(N,fpts,mag,wt); 

[h,w]=freqz(b,1,256); 

plot(w*2000/pi,20*log10(abs(h))); 

grid; 

xlabel('频率/Hz') ;

ylabel('幅度/dB');

波形如下:

例3 利用MATLAB编程设计一个数字带通滤波器,指标要求如下:通带边缘频率:Ωp1=0.45pi,Ωp2=0.65pi,通带峰值起伏:δ1<=1[dB]。阻带边缘频率:Ωs1=0.3pi,Ωs2=0.8pi,最小阻带衰减:δ2>=40[dB] 。

方法一:窗函数法

程序如下:

[n,wn,bta,ftype]=kaiserord([0.3 0.45 0.65 0.8],[0 1 0],[0.01 0.1087 0.01]);%用kaiserord函数估计出滤波器阶数n和beta参数

h1=fir1(n,wn,ftype,kaiser(n+1,bta),'noscale');

[hh1,w1]=freqz(h1,1,256);

figure(1)

subplot(2,1,1)

plot(w1/pi,20*log10(abs(hh1)))

grid

xlabel('归一化频率w');ylabel('幅度/db');

subplot(2,1,2)

plot(w1/pi,angle(hh1))

grid

xlabel('归一化频率w');ylabel('相位/rad');

波形如下:

滤波器系数为:

h1 =

  Columns 1 through 8 

    0.0041    0.0055   -0.0091   -0.0018   -0.0056   -0.0000    0.0391   -0.0152

  Columns 9 through 16 

   -0.0381    0.0077   -0.0293    0.0940    0.0907   -0.2630   -0.0517    0.3500

  Columns 17 through 24 

   -0.0517   -0.2630    0.0907    0.0940   -0.0293    0.0077   -0.0381   -0.0152

  Columns 25 through 31 

    0.0391   -0.0000   -0.0056   -0.0018   -0.0091    0.0055    0.0041

如果直接用freqz(h1,1,256),得幅频特性和相频特性曲线:

方法二:等波纹法设计

程序如下:

[n,fpts,mag,wt]=remezord([0.3 0.45 0.65 0.8],[0 1 0],[0.01 0.1087 0.01]);%用remezord函数估算出remez函数要用到的阶n、归一化频带边缘矢量fpts、频带内幅值响应矢量mag及加权矢量w,使remez函数设计出的滤波器满足f、a及dev指定的性能要求。 h2=remez(n,fpts,mag,wt);%设计出等波纹滤波器 [hh2,w2]=freqz(h2,1,256); figure(2) subplot(2,1,1) plot(w2/pi,20*log10(abs(hh2))) grid xlabel('归一化频率w');ylabel('幅度/db'); subplot(2,1,2) plot(w2/pi,angle(hh2)) grid xlabel('归一化频率w');ylabel('相位/rad'); h2

波形如下:

滤波器系数如下:

h2 =

  Columns 1 through 9 

   -0.0013    0.0092   -0.0255   -0.0642    0.1177    0.0922   -0.2466   -0.0466    0.3116

  Columns 10 through 17 

   -0.0466   -0.2466    0.0922    0.1177   -0.0642   -0.0255    0.0092   -0.0013

如果直接用freqz(h2,1,256);得幅频特性和相频特性曲线:

方法三:采用FDATool工具

这种方法需要事先计算出滤波器的阶数,bate值,然后设置相应参数,最后生成滤波器。

 设置界面如下图所示:

将上述圈圈的区域设置好之后,生成滤波器,最后通过analysis菜单可以观察生成的滤波器的各种特性曲线和滤波器系数。这里的滤波器系数跟方法一的一样。

波形如下:

五、结果分析

5.1  滤波器设计总结

FIR滤波器实现一般采用窗函数法和等纹波设计法。窗函数法还包含两个分支,一种是用公式先手动算出N值和其他对应得窗函数参数值,再代入窗函数和fir1实现,一种是用函数*rord估算出N和相应参数再用fir1实现。不过要注意*rord会低估或高估阶次n,可能会使滤波器达不到指定的性能,这时应稍微增加或降低阶次。如果截止频率在0或Nyquist频率附近,或者设定的dev值较大,则得不到正确结果。

  滤波器实现形式及特点:由于一般的滤波器在利用窗函数是其通带波纹和阻带波纹不同(一般为第一个阻带波纹最大)因此,在满足第一个阻带衰减旁瓣时,比其频率高的旁瓣,它们的衰减都大大超出要求。而根据阻带衰减与项数的近似关系N = P(δ2)*fs/TW,可得当阻带衰减越大,所需项数越多。

5.2  窗函数法和等波纹设计的不同之处

窗函数设计是通过最小平方积分办法来设计的,即该滤波器的误差为:

  即要求最小方法来设计滤波器,这样的滤波器更忠实于理想滤波器(即滤波系数更接近于理想滤波器)。

证明如下:

因此,幅度频谱差值越小,实际滤波器就越接近理想滤波器。

  而等波纹滤波器是通过最大加权误差最小化来实现,其误差为:

要求该误差最小来实现滤波器,得出来的滤波系数较窗函数设计相差较远。

以下通过对例3中的h1及h2作比较。

%sigsum是用来对数组各元素进行求和

function y=sigsum(n1,n2,n,x);

y=0; 

for i=n1+1-min(n):n2+1-min(n)

    y=y+x(i);

end

n=0.001:30.001;

h=2*cos(0.55*pi*(n-15)).*sin(0.175*pi*(n-15))./(pi*(n-15));

delta1=h-h1;

n=0.001:16.001;

h=2*cos(0.55*pi*(n-15)).*sin(0.175*pi*(n-15))./(pi*(n-15));

delta2=h-h2;

y1=sigsum(0,30,[0:30],(abs(delta1).^2))/31;

y2=sigsum(0,16,[0:16],(abs(delta2).^2))/17;

 结果如下:

y1 =

  1.9099e-004

y2 =

    0.0278

  由此得到用窗函数实现的滤波系数比用等波纹滤波器系数的每一项更接近于理想滤波器(y1为用窗函数实现的与理想滤波器的差值,y2为用等波纹滤波器实现的与理想滤波器的差值);

  对比二者的幅度频谱可知,等波纹滤波器阻带边缘比用窗函数实现的更平滑(理想滤波器为垂直下降的)。

  从设计的角度考虑,由于窗函数设计法都是通过已有的窗函数对理想滤波器的改造,因此,可以用手算的办法方便的设计滤波器。

而等波纹滤波器,其实现是通过大量的迭代运算来实现,这样的方法一般只能通过软件来设计。

  项数的问题由于等波纹滤波器能较平均的分布误差,因此对于相同的阻带衰减,其所需的滤波系数比窗函数的要少。

5.3 几点说明

1.相频特性曲线形状不同说明

  上面第一个图是用角度为单位画出来的,下面的图是用rad单位画出来的。从图形可以观察到在0.3到0.8数字频率间两个图都是严格的线性相位,至于下面的图为什么在这个区间会有跳变是因为rad的区间只有-pi——pi,当相位由-pi继续增加时只能跳到pi而不能大于pi,而角度表示则可以连续增大。

2.调用firl或者reme函数时,用scale(缺省方式)对滤波器进行归一化,即滤波器通带中心频率处的响应幅值为0db。用noscale不对滤波器归一化。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2014年03月11日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
FIR数字滤波器设计(下)
今天给大侠带来FIR数字滤波器设计,由于篇幅较长,分三篇。今天带来第三篇,FIR数字滤波器设计,包括窗函数法设计FIR滤波器、频率采样法设计FIR滤波器以及基于firls函数和remez函数的最优化方法设计FIR滤波器。话不多说,上货。
FPGA技术江湖
2021/04/21
2.6K0
FIR数字滤波器设计(下)
基于MATLAB的数字信号处理(5) FIR数字滤波器设计及软件实现
MATLAB函数 fir1 和 fftfilt 的功能及其调用格式可以用 help 命令查阅;
叶庭云
2021/12/01
9.6K0
基于MATLAB的数字信号处理(5)    FIR数字滤波器设计及软件实现
FIR 带通滤波器设计
%本文将针对一个含有 5Hz 、 15Hz 和 30Hz 的混和正弦波信号, 设计一个 FIR 带通滤波器, %给出利用 MATLAB 实现的三种方法: 程序设计法、 FDATool 设计法和 SPTool 设计法。 参 %数要求:采样频率 fs=100Hz ,通带下限截止频率 fc1=10 Hz ,通带上限截止频率 fc2=20Hz ,过渡带宽 6 Hz,通阻带波动 0.01 ,采用凯塞窗设计。 fc1 =10 ; fc2 =20 ; fs=100 ; [n,Wn,beta,ftype]=kaiserord([7 13 17 23],[0 1 0],[0.01 0.01 0.01],100); %得出滤波器的阶数 n=38 , beta=3.4 w1=2*fc1/fs; w2=2*fc2/fs;% 将模拟滤波器的技术指标转换为数字滤波器的技术指 window=kaiser(n+1,beta);% 使用 kaiser 窗函数 b=fir1(n,[w1 w2],window); %使用标准频率响应的加窗设计函数 fir1 freqz(b,1,512);% 数字滤波器频率响应 t = (0:100)/fs; s = sin(2*pi*t*5)+sin(2*pi*t*15)+sin(2*pi*t*30);% 混和正弦波信号 sf = filter(b,1,s); %对信号 s 进行滤波
全栈程序员站长
2022/08/18
8250
FIR 带通滤波器设计
【DSP教程】第36章 FIR滤波器的Matlab设计(含低通,高通,带通和带阻)
完整版教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=94547 第36章 FIR滤波器的Matlab设计(含低通,高通,
Simon223
2021/07/19
4.2K0
【DSP教程】第36章       FIR滤波器的Matlab设计(含低通,高通,带通和带阻)
【DSP教程】第43章 IIR滤波器的Matlab设计
完整版教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=94547 第43章 IIR滤波器的Matlab设计 本章节讲解II
Simon223
2021/08/18
2.3K0
【DSP教程】第43章       IIR滤波器的Matlab设计
MATLAB函数fir1「建议收藏」
数字角频率w、模拟角频率Ω之间的关系为 w=Ω/Fs,所以 w = 2*pi*f/Fs ,f为模拟频率;
全栈程序员站长
2022/09/13
2.1K0
MATLAB函数fir1「建议收藏」
Matlab数字滤波器设计实践—FIR
在理想情况下,低通滤波器使信号中低于指定截止频率 ωc 的所有频率分量保持不变,并拒绝高于 ωc 的所有分量。由于实现理想低通滤波器所需的脉冲响应是无限长的,因此无法设计出理想的 FIR 低通滤波器。理想脉冲响应的有限长度逼近会导致滤波器的通带 (ω<ωc) 和阻带 (ω>ωc) 中都出现波纹,并导致通带和阻带之间的过渡带宽度非零。 当用有限脉冲响应逼近时,通带/阻带波纹和过渡带宽度都是不希望出现的,且不可避免地与理想低通滤波器存在偏差。下图说明了这些偏差:
FPGA开源工作室
2021/08/26
2K0
MATLAB窗函数法设计FIR 数字滤波器
一、实验目的 1. 熟悉线性相位 FIR 数字滤波器特性。 2. 了解各种窗函数对滤波特性的影响。 3. 掌握用窗函数法设计 FIR 数字滤波器的原理、方法及计算机编程。
timerring
2022/07/20
2.3K0
MATLAB窗函数法设计FIR 数字滤波器
Matlab滤波器设计:FIR滤波器与IIR滤波器设计实现示例
本文使用Matlab中的Signal Processing Toolbox中的designfilt函数,并根据频率响应实现如下两种滤波器:
用户1143655
2022/12/12
6.6K0
Matlab滤波器设计:FIR滤波器与IIR滤波器设计实现示例
matlab实现不同窗滤波器示例
在Matlab中使用汉明窗设计低通滤波器可以通过fir1函数实现。汉明窗通常用于设计滤波器,可以提供更突出的频率特性。
FPGA开源工作室
2024/03/02
4830
matlab实现不同窗滤波器示例
如何确定插值滤波器的阶数
  在信号处理中,滤波器的系数我们往往都是通过MATLAB来设计,只要我们知道滤波器的通带截止频率和阻带起始频率,就可以通过MATLAB中的fdatool(在MATLAB2020中使用filterDesigner)来设计滤波器了。
猫叔Rex
2020/11/19
1.8K0
如何确定插值滤波器的阶数
毕设:基于FPGA的FIR数字滤波器设计
大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分。大侠可以关注FPGA技术江湖,在“闯荡江湖”、"行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢。
FPGA技术江湖
2020/12/30
2.5K0
matlab理想低通滤波器代码_matlab简单低通滤波器
设低通滤波器通带截止频率为ωp=0.2π,阻带截止频率为ωs=0.4π,通带波纹Ag=0.5dB,最小阻带衰减Ar=50dB。
全栈程序员站长
2022/11/02
1.1K0
频率采样法设计FIR 数字滤波器MATLAB版
一、实验目的 1.  掌握用频率采样法设计线性相位 FIR  数字滤波器的方法。 2.  熟悉频率取样理论,熟悉内插函数及其应用。 3.  了解 FIR  数字滤波器的频率特性和相位特性,观察过渡带取样点对滤波器幅频特性的影响。 4.如何由线性相位条件决定采样值。
timerring
2022/07/20
1.6K0
频率采样法设计FIR 数字滤波器MATLAB版
FIR 带通滤波器参数设计流程
假设有一段10kHz的语言,现需要对2~3kHz之间的语言信号进行提取,要求1.5kHz及3.5kHz以上的频率需要有40dB的衰减
全栈程序员站长
2022/09/02
1.6K0
FIR 带通滤波器参数设计流程
基于MATLAB的数字信号处理(4) IIR数字滤波器设计及软件实现
设计IIR数字滤波器一般采用间接法(脉冲响应不变法和双线性变换法),应用最广泛的是双线性变换法。
叶庭云
2021/12/01
9.4K0
基于MATLAB的数字信号处理(4)    IIR数字滤波器设计及软件实现
matlab与FPGA数字滤波器设计(1)——通过matlab的fdatool工具箱设计FIR数字滤波器
以99阶FIR低通滤波器为例,学习使用matlab的fdatool工具箱设计滤波器,并将滤波器系数导出到.coe文件,联合Vivado进行FPGA的FIR滤波器设计。
FPGA探索者
2021/03/15
4.3K1
Matlab生成fir滤波器抽头系数
在Vivado调用fir滤波器时,我们会遇到需要填充滤波器抽头系数的问题,手工计算又不现实,所以在此向大家介绍一个生成系数的工具。
FPGA技术江湖
2024/03/19
2680
Matlab生成fir滤波器抽头系数
基于FPGA低通滤波器的FIR的设计
图1 低通滤波器特征参数 如图1所示,低通滤波器的通带截止频率为ωp ,通带容限为α1,阻带截止频率为ωs,阻带容限为α2。通带定义为|ω|≤ωp ,过渡带定义为ωp<|ω|<ωs,阻带定义为ωs≤|ω|<π。
FPGA开源工作室
2019/10/29
1.5K0
基于FPGA低通滤波器的FIR的设计
matlab设计模拟带通滤波器
简单记录下在matlab上如何设计出模拟的带通滤波器,包括:巴特沃斯滤波器、切比雪夫I型滤波器、切比雪夫II型滤波器、椭圆型滤波器。 代码如下:
全栈程序员站长
2022/08/19
1.3K0
matlab设计模拟带通滤波器
推荐阅读
相关推荐
FIR数字滤波器设计(下)
更多 >
LV.1
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档