如何使用Matlab设计无限脉冲响应(IIR)滤波器
在设计滤波器和对其响应进行可视化时,Matlab可以是一个重要的工具。它可以帮助提高滤波器的性能,因为你可以做出响应并与预期的响应进行比较。
简介
滤波器是为了去除信号中不需要的属性。IIR是具有无限多脉冲的滤波器。在这里,输出y(n)的响应取决于现在的输入x(n),以前的输入x(n-1)以及以前的输出y(n-1)。
IIR滤波器的微分方程可以由微分方程给出。由于该滤波器使用了之前的输出,所以有来自滤波器结构的反馈。
设计IIR滤波器时,要考虑符合滤波器规格的传递函数()。传递函数()是输出响应与输入响应的比率。
前提条件
为了跟上进度,读者应该具备以下条件。
有各种类型的IIR滤波器。
这些类型可能包括。
- 巴特沃斯滤波器。
- 切比雪夫滤波器。
- 切比雪夫II型滤波器。
- 椭圆滤波器。
- 贝赛尔滤波器。
我们将看一下巴特沃斯滤波器和切比雪夫滤波器的设计,因为这些是最常见的滤波器。
如何用Matlab设计低通和高通巴特沃斯滤波器。
巴特沃斯滤波器的另一个名字是最大平坦滤波器。这是因为它的设计方式是使频率响应在通带内尽可能地平坦。通带的定义是通过一个滤波器的频率范围。频响是一个特定滤波器的传递函数。
巴特沃斯滤波器在从通带到阻带的变化中实现了最大的平坦度,其代价是一个宽的过渡带。这是一个缺点,因为它导致了不良的特性。过渡带是指允许在通带和阻带之间过渡的频率范围。
巴特沃斯的两种类型是。
- 低通巴特沃斯滤波器
- 高通巴特沃斯滤波器
用来设计低通型的Matlab代码
在这里,我们想设计一个低通巴特沃斯滤波器,在通带中的纹波小于3dB,定义为0到40Hz,在阻带中至少有60dB的衰减,150Hz到奈奎斯特频率(500Hz),采样频率1000Hz。
% Program to design and implementation of low pass butterworth filter
clc
clear
close all
kp = 3; % passband ripple
ks = 60; % stop attenuation
fp = 40; %passband frequency
fs = 1000; %sampling frequency
Fs = 150; % stop band frequency
当设计一个滤波器时,你必须首先定义其变量,如上图所示。然后,通带纹波,也就是滤波器通带中的振幅范围。
- 通带频率--如前定义,是指通过一个滤波器的频率范围。这意味着它只允许给定频率的信号通过。
- 停止衰减 - 是指在指定的停止带中的最低衰减水平。
- 采样频率 - 采样是将连续时间信号转换为离散时间信号。采样频率是指从连续时间信号转换为离散时间信号的每秒样本数。
定义完我们的滤波器后,我们需要对滤波器进行归一化。归一化是将分量值改变为合适的频率。为了消除不理想的特性,我们需要对滤波器进行归一化。
为了对滤波器进行归一化处理,我们使用下面的代码。
wp = fp/(fs/2);
ws = Fs/(fs/2);
接下来的活动是确定滤波器的顺序和滤波器的截止频率。传递函数定义了滤波器的顺序。截止频率是指响应变得太弱的频率。
为了确定这一点,请使用下面的代码。
[N wc] = buttord(wp, ws, kp, ks);
当我们运行这段代码时,我们将在命令窗口中得到滤波器阶数N 和截止频率wc 。
下一步是对上面得到的截止频率wc 进行归一化处理。然后,从传递函数中找出滤波器的阶数,即滤波器的输出与输入之比。
由于我们要设计一个巴特沃斯滤波器,我们使用buttord 函数,并通过wp 、ws 、kp 、ks 作为输入。
[den num] = butter(N, wc, 'low');
我们用上面的代码得到滤波器的系数。这些系数是分子(输出)num 和分母(输入)den 。这是通过将获得的滤波器阶数和截止频率传递给butter 函数来完成的。
因为我们要设计一个低通滤波器,所以在传递滤波顺序和截止频率时,我们定义使用low 。
我们之前获得的系数有助于绘制滤波器的响应,这是用freqz 函数完成的。现在我们可以把滤波器的系数、用于绘图的点数和采样频率传给这个函数。
freqz(den, num, 1000, fs)
当我们运行该程序时,我们有
高通巴特沃斯滤波器
如果我们想设计一个巴特沃斯高通滤波器,现在就更容易了,因为代码是不变的。唯一要做的是改变我们在寻找滤波器系数时定义的low ,即high 。
因此,代码将是。
kp = 3; % passband ripple
ks = 60; % stop attenuation
fp = 40; %passband frequency
fs = 1000; %sampling frequency
Fs = 150; % stop band frequency
wp = fp/(fs/2); %filter normalization
ws = Fs/(fs/2);
[N wc] = buttord(wp, ws, kp, ks);
[b a] = butter(N, wc, 'high');
freqz(b, a, 1000, fs)
滤波器的响应将如下图所示。
如何用Matlab设计Chebyshev滤波器
我们有两种类型的切比雪夫滤波器,即切比雪夫I和切比雪夫II。切比雪夫滤波器的低通切比雪夫滤波器在通带上有更多的波纹,而高切比雪夫滤波器的波纹更多。
最常用的切比雪夫滤波器是I型。我们将用设计巴特沃斯滤波器的类似规格来设计我们的切比雪夫滤波器I型,low 和high 。
使用Matlab设计滤波器的好处是,你只需要做一些改动就可以创建你的滤波器。我们先来设计一个低通切比雪夫滤波器。
我们有两种类型的切比雪夫滤波器。
- 低通切比雪夫滤波器
- 高通切比雪夫滤波器
低通切比雪夫滤波器的Matlab代码
clc
clear all
close all
fs = 1000;
kp = 3;
ks = 60;
fp = 40;
Fs = 150;
wp = fp/(fs/2); %normalizing the stop band
ws = Fs/(fs/2); %normalizing the passband
然后我们使用cheb1ord 函数来找到切比雪夫滤波器的阶数和截止频率。
[N wc] = cheb1ord(wp, ws, kp, ks); %order of the filter
在寻找分子和分母系数时,我们需要加上通带纹波kp 。这是因为切比雪夫在通带有波纹。
这就是巴特沃斯滤波器和切比雪夫滤波器设计上的区别。所以我们得到这些系数,然后用freqz 函数绘制响应。
[num den] = cheby1(N, kp, wc, 'low') % numerator and denominator coefficients
freqz(b, a, 1000, fs) %plot the response
你把通带放大,就可以看到波纹了。在切比雪夫滤波器中找到滤波器阶数的另一种方法是通过计算幅度响应的通带中波纹的最大值和最小值。
例如,我们可以放大我们的响应来查看我们的滤波器顺序,如下图所示。
如果我们按照看到的这些最大值来计算,我们得到的最大值和最小值的数量是四个,等于我们之前发现的滤波器顺序。
例如,如果我们想设计一个规格相似的高通滤波器,就像我们在设计低通和高通巴特沃斯滤波器时一样,我们可以把low 标签改为high 。
高通Chebyshev滤波器的Matlab代码
clc
clear all
close all
fs = 1000;
kp = 3;
ks = 60;
fp = 40;
Fs = 150;
wp = fp/(fs/2); %normalizing the stop band
ws = Fs/(fs/2); %normalizing the passband
[N wc] = cheb1ord(wp, ws, kp, ks); %order of the filter
[b a] = cheby1(N, kp, wc, 'high') % numerator and denominator coefficients
freqz(b, a, 1000, fs) %plot the response
结论
滤波器在工程领域中是必不可少的。它们通过考虑上述的具体规定,帮助摆脱信号中不需要的部分。Matlab是设计滤波器和可视化其响应的重要工具。此外,它还有助于提高滤波器的性能,因为你可以作出反应并与预期的反应进行比较。
在Matlab中,通过使用内置的功能,这些活动变得更加容易。设计各种类型的滤波器变得更加简单,而且代码也容易理解。
正如我们之前所看到的,你可以使用一个不同的过滤器的代码,通过做一些改变来建立另一个过滤器。