0阶贝塞尔函数_MATLAB常用的FIR滤波器设计方法之窗函数法

FIR滤波器很多工科出身的人都不会陌生,在我们的学习和工作中,也常常需要设计FIR滤波器。因为FIR滤波器有两个特点:滤波器是稳定的以及具有线性相位。FIR滤波器在信号处理相关领域当然也包括本人所在的雷达信号处理领域有着广泛的应用。本文主要介绍MATLAB最常用的FIR滤波器设计方法之窗函数法。其他的方法将在另一章中介绍。

窗函数法是一种基础且普遍应用的FIR滤波器设计方法。首先需要根据性能指标(如主瓣宽度、旁瓣衰减等)确定适合的窗函数。 主瓣宽度、旁瓣衰减是一对情敌,想要主瓣宽度窄且旁瓣衰减大,那是电视剧里都不会出现的情况。实际中,需要根据自己的任务指标权衡。此外,还需要确定阶数。然后就可以用fir1函数设计滤波器了。

b=fir1(n,wn,'ftype',window)

其中:

b:我们设计的fir滤波器系数,长度为n+1;b跟过渡带的宽度有关,设计时根据性能要求确定。

n:滤波器的阶数。注意,b的长度为n+1。

wn:滤波器的截止频率,可以是一个标量或者多元素的向量。取值范围0

window:表示使用的窗函数,最常用的是汉明窗(Hamming)、汉宁窗(Hanning)、三角窗(bartlett、triang)、矩形窗(boxcar)、布莱克曼窗(Blackman)、chebwin(切比雪夫窗)、凯赛窗(Kaiser);默认是汉明窗(Hamming)。各种窗的差别主要在集中于主瓣的能量和分散在所有旁瓣的能量之比。

例如我们需要设计一个50阶,截止频率ω = 0.3π,使用汉明窗的低通滤波器。

b = fir1(50,0.3,'low',hamming(51));

freqz(b,1,512)

注意:窗函数长度和滤波器系数b的长度应一致。

91d5fc6b91286ab153d45d8ee6e44e70.png

lowpass hamming

改一下需求,需要设计一个50阶,通带为 0.3π

b = fir1(50,[0.3 0.6],'bandpass',chebwin(51,50));

freqz(b,1,512)

a9d2f75a8cb980666aa9e5346f0c714f.png

bandpass chebwin

对这个滤波器做个小测试。

fs = 200;%采样频率

f1 = 10;

f2 = 50;

f3 = 80;

t = linspace(0,1,fs);

x = 2*sin(2*pi*f1*t)+5*sin(2*pi*f2*t)+3*sin(2*pi*f3*t);

plot(abs(fft(x,512)));

title('原始信号频谱')

b = fir1(50,[0.3 0.6],'bandpass',chebwin(51,50));

y = filter(b,1,x);

figure;

plot(abs(fft(y,512)));

title('滤波后信号频谱')

2906c1ba567b5b999f8b17ab98af2529.png
d6d8d567309a57c7ec4f44190561ba4e.png

滤波后信号

可见频率为10Hz和80Hz的分量被滤除掉了。

用汉明窗(Hamming)、汉宁窗(Hanning)设计呢?如下图所示。

2879cff1b9a711640abefd285de23ab8.png

再来说一下ftype为'DC-0' | 'DC-1'的时候。举两个例子。

设计一个46阶,阻带为ω <0.4π,0.6π

bnd = [0.4 0.6 0.9];

b_0 = fir1(46,bnd,'DC-0');

fvtool(b_0,1);

140953ba6b7c9fe57948154a55554955.png

DC-0

如果我们需要把上面的阻带换为通带呢?binggo!把ftype:DC-0换成ftype:DC-1 就可以了。

6d4d5829313ebee44fa838996f2e3b2b.png

DC-1

把两个滤波器画在一起,如下图:

clc;clear;

bnd = [0.4 0.6 0.9];

b_0 = fir1(46,bnd,'DC-0');

b_1 = fir1(46,bnd,'DC-1');

h = fvtool(b_0,1,b_1,1);

legend(h,'DC-0','DC-1')

6878de6f4d13d4bd85db5bd6703ba9ea.png

kaiser窗

Kaiser窗是一种最优化窗,具有很好的旁瓣抑制性能。

[n,Wn,beta,ftype] = kaiserord(f,a,dev,fs)

f是一个矢量,表示带的边缘频率。f的长度是a的长度*2-2。关于f和a定义了一个分段常数响应函数。下面会通过例子说明。范围为0~fs/2。

dev指定le通带纹波和阻带衰减。表示每个频带输出滤波器的频率响应与其期望值之间最大允许的偏差。

fs:采样频率Hz为单位。

比如设计一个通带为0~1KHz,阻带为1.5~4KHz,5%的通带纹波和阻带衰减为50dB的低通滤波器。

fsamp = 8000;

fcuts = [1000 1500];

mags = [1 0];

devs = [0.05 0.0035];

[n,Wn,beta,ftype] = kaiserord(fcuts,mags,devs,fsamp);

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

fvtool(hh,1);

ff22831100f884d10aa0db273f29bda8.png

再如设计一个带阻滤波器。

fsamp = 8000;

fcuts = [1000 1500 2500 3000 ];

mags = [1 0 1];

devs = [0.05 0.0035 0.05];

[n,Wn,beta,ftype] = kaiserord(fcuts,mags,devs,fsamp);

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

fvtool(hh,1);

a0a1c3e12e5fa357a9b2613bf6441d7b.png

下面我们分析一下这个滤波器。

fsamp ,采样频率。

fcuts ,带边缘频率。fcuts 应小于fsamp/2。

mags = [1 0 1];

我们从上图中可以看到在0

其他的FIR滤波器设计方法在另一章中介绍。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值