热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

matlab凯塞窗低通fir滤波器,基于Matlab的FIR滤波器设计与实现

一、摘要前面一篇文章介绍了通过FDATool工具箱实现滤波器的设计,见“二、实验平台Matlab7.1三、实验原理以低通滤波器为例,其常用的设计指标有&

一、摘要

前面一篇文章介绍了通过FDATool工具箱实现滤波器的设计,见“

二、实验平台

Matlab7.1

三、实验原理

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

通带边缘频率fp(数字频率为Ωp)

阻带边缘频率fst (数字频率为Ωst)

通带内最大纹波衰减δp=-20log10(1-αp),单位为 dB

阻带最小衰减αs=-20log10(αs),单位为 dB

阻带起伏αs

通带峰值起伏αp

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

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

四、实例分析

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

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

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

0818b9ca8b590ca3270a3433284dd417.png

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

程序如下:

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') ;

波形如下:

0818b9ca8b590ca3270a3433284dd417.png

方法二:

采用[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);

波形如下:

0818b9ca8b590ca3270a3433284dd417.png

实际中,一般调用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');

波形如下:

0818b9ca8b590ca3270a3433284dd417.png

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

方法一&#xff1a;窗函数法

程序如下&#xff1a;

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

h1&#61;fir1(n,wn,ftype,kaiser(n&#43;1,bta),&#39;noscale&#39;);

[hh1,w1]&#61;freqz(h1,1,256);

figure(1)

subplot(2,1,1)

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

grid

xlabel(&#39;归一化频率w&#39;);ylabel(&#39;幅度/db&#39;);

subplot(2,1,2)

plot(w1/pi,angle(hh1))

grid

xlabel(&#39;归一化频率w&#39;);ylabel(&#39;相位/rad&#39;);

波形如下&#xff1a;

0818b9ca8b590ca3270a3433284dd417.png

滤波器系数为&#xff1a;

h1 &#61;

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)&#xff0c;得幅频特性和相频特性曲线&#xff1a;

0818b9ca8b590ca3270a3433284dd417.png

方法二&#xff1a;等波纹法设计

程序如下&#xff1a;

[n,fpts,mag,wt]&#61;remezord([0.3 0.45 0.65 0.8],[0 1 0],[0.01 0.1087 0.01]);%用remezord函数估算出remez函数要用到的阶n、归一化频带边缘矢量fpts、频带内幅值响应矢量mag及加权矢量w&#xff0c;使remez函数设计出的滤波器满足f、a及dev指定的性能要求。

h2&#61;remez(n,fpts,mag,wt);%设计出等波纹滤波器

[hh2,w2]&#61;freqz(h2,1,256);

figure(2)

subplot(2,1,1)

plot(w2/pi,20*log10(abs(hh2)))

grid

xlabel(&#39;归一化频率w&#39;);ylabel(&#39;幅度/db&#39;);

subplot(2,1,2)

plot(w2/pi,angle(hh2))

grid

xlabel(&#39;归一化频率w&#39;);ylabel(&#39;相位/rad&#39;);

h2

波形如下&#xff1a;

0818b9ca8b590ca3270a3433284dd417.png

滤波器系数如下&#xff1a;

h2 &#61;

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);得幅频特性和相频特性曲线&#xff1a;

0818b9ca8b590ca3270a3433284dd417.png

方法三&#xff1a;采用FDATool工具

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

设置界面如下图所示&#xff1a;

0818b9ca8b590ca3270a3433284dd417.png

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

波形如下&#xff1a;

0818b9ca8b590ca3270a3433284dd417.png

五、结果分析

5.1 滤波器设计总结

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

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

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

窗函数设计是通过最小平方积分办法来设计的&#xff0c;即该滤波器的误差为&#xff1a;

0818b9ca8b590ca3270a3433284dd417.png

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

证明如下&#xff1a;

0818b9ca8b590ca3270a3433284dd417.png

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

而等波纹滤波器是通过最大加权误差最小化来实现&#xff0c;其误差为&#xff1a;

0818b9ca8b590ca3270a3433284dd417.png

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

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

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

function y&#61;sigsum(n1,n2,n,x);

y&#61;0;

for i&#61;n1&#43;1-min(n):n2&#43;1-min(n)

y&#61;y&#43;x(i);

end

n&#61;0.001:30.001;

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

delta1&#61;h-h1;

n&#61;0.001:16.001;

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

delta2&#61;h-h2;

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

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

结果如下&#xff1a;

y1 &#61;

1.9099e-004

y2 &#61;

0.0278

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

0818b9ca8b590ca3270a3433284dd417.png

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

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

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

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

5.3 几点说明

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

0818b9ca8b590ca3270a3433284dd417.png

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

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



推荐阅读
  • 利用决策树预测NBA比赛胜负的Python数据挖掘实践
    本文通过使用2013-14赛季NBA赛程与结果数据集以及2013年NBA排名数据,结合《Python数据挖掘入门与实践》一书中的方法,展示如何应用决策树算法进行比赛胜负预测。我们将详细讲解数据预处理、特征工程及模型评估等关键步骤。 ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • 本文介绍了如何使用JQuery实现省市二级联动和表单验证。首先,通过change事件监听用户选择的省份,并动态加载对应的城市列表。其次,详细讲解了使用Validation插件进行表单验证的方法,包括内置规则、自定义规则及实时验证功能。 ... [详细]
  • 深入理解C++中的KMP算法:高效字符串匹配的利器
    本文详细介绍C++中实现KMP算法的方法,探讨其在字符串匹配问题上的优势。通过对比暴力匹配(BF)算法,展示KMP算法如何利用前缀表优化匹配过程,显著提升效率。 ... [详细]
  • 在给定的数组中,除了一个数字外,其他所有数字都是相同的。任务是找到这个唯一的不同数字。例如,findUniq([1, 1, 1, 2, 1, 1]) 返回 2,findUniq([0, 0, 0.55, 0, 0]) 返回 0.55。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 机器学习中的相似度度量与模型优化
    本文探讨了机器学习中常见的相似度度量方法,包括余弦相似度、欧氏距离和马氏距离,并详细介绍了如何通过选择合适的模型复杂度和正则化来提高模型的泛化能力。此外,文章还涵盖了模型评估的各种方法和指标,以及不同分类器的工作原理和应用场景。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 本文探讨了如何在编程中正确处理包含空数组的 JSON 对象,提供了详细的代码示例和解决方案。 ... [详细]
  • 基因组浏览器中的Wig格式解析
    本文详细介绍了Wiggle(Wig)格式及其在基因组浏览器中的应用,涵盖variableStep和fixedStep两种主要格式的特点、适用场景及具体使用方法。同时,还提供了关于数据值和自定义参数的补充信息。 ... [详细]
  • 汇编语言等号伪指令解析:探究其陡峭的学习曲线
    汇编语言以其独特的特性和复杂的语法结构,一直被认为是编程领域中学习难度较高的语言之一。本文将探讨汇编语言中的等号伪指令及其对初学者带来的挑战,并结合社区反馈分析其学习曲线。 ... [详细]
  • 毕业设计:基于机器学习与深度学习的垃圾邮件(短信)分类算法实现
    本文详细介绍了如何使用机器学习和深度学习技术对垃圾邮件和短信进行分类。内容涵盖从数据集介绍、预处理、特征提取到模型训练与评估的完整流程,并提供了具体的代码示例和实验结果。 ... [详细]
  • 本文探讨了如何在iOS开发环境中,特别是在Xcode 6.1中,设置和应用自定义文本样式。我们将详细介绍实现方法,并提供一些实用的技巧。 ... [详细]
  • 深入理解K近邻分类算法:机器学习100天系列(26)
    本文详细介绍了K近邻分类算法的理论基础,探讨其工作原理、应用场景以及潜在的局限性。作为机器学习100天系列的一部分,旨在为读者提供全面且深入的理解。 ... [详细]
  • 历经三十年的开发,Mathematica 已成为技术计算领域的标杆,为全球的技术创新者、教育工作者、学生及其他用户提供了一个领先的计算平台。最新版本 Mathematica 12.3.1 增加了多项核心语言、数学计算、可视化和图形处理的新功能。 ... [详细]
author-avatar
黑焰2502887807
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有