kaiserord函数的句法有如下几种:
①[n,Wn,beta,ftype] = kaiserord(f,a,dev)
②[n,Wn,beta,ftype] = kaiserord(f,a,dev,fs)
③c = kaiserord(f,a,dev,fs,'cell')
kaiserord函数返回一个滤波阶数n和beta参数来指定一个kaiser窗口,供后期的fir1函数使用。给定一组频域中的规范(其实就是给kaiserord函数一些参数,这些参数限定了kaiser窗的一些性质),kaiserord函数将会估计出近似满足给定规范的最小的滤波器阶数。同时,kaiserord函数将会把给定的规范转换为通带和阻带纹波,并将截止频率转换为窗口FIR滤波器设计所需的形式。
[n,Wn,beta,ftype] = kaiserord(f,a,dev) 得到近似阶数n,归一化的频带边缘Wn,并且满足输入规范的权重f、a和dev。f是一个band edge的矢量。a是一个矢量,指定由f定义的带上的期望幅度。f的长度是a的两倍(最小是两倍),f和a一起定义一个期望的分段常数响应函数。dev是一个向量,其大小与a相同,用于指定每个频带的输出滤波器的频率响应与其期望幅度之间的最大允许误差或偏差。dev指定通带纹波和阻带衰减。可以指定dev中的每个数都为正数,表示绝对滤波器增益(不是以分贝为单位)。注意:如果在向量dev中指定了不同的带偏差,则使用最小指定偏差,因为Kaiser窗口方法被限制为产生所有带中具有最小偏差的滤波器。
fir1函数可以使用kaiserord函数返回的阶数n、频率向量Wn、多频带幅度类型ftype和Kaiser窗口参数beta。ftype参数供fir1使用:对于高通滤波器,它等于'高';对于带阻滤波器,它等于'停止'。对于多频带滤波器,当第一频带是阻带(从f = 0开始)时,它可以等于'DC-0'或当第一频带是通带时它可以等于'DC-1'。
要设计一个大致符合kaiser参数f,a和dev给出的规格的FIR滤波器b,可以使用以下命令:
b = fir1(n,Wn,kaiser(n+1,beta),ftype,'noscale')
[n,Wn,beta,ftype] = kaiserord(f,a,dev,fs)使用以Hz为单位的采样频率fs。 如果未指定参数fs,或者将其指定为空向量[],则默认为2 Hz,奈奎斯特频率为1 Hz。 可以使用此语法指定缩放到特定应用程序采样频率的波段边缘。 f中的频带边缘必须从0到fs / 2。
c = kaiserord(f,a,dev,fs,'cell')是一个单元数组,c中元素是fir1的参数。注意:在某些情况下,kaiserord低估或高估了阶数n。 如果过滤器不符合规格,请尝试更高的阶数,例如n+1,n+2等,或尝试更低的阶数例如n-1,n-2等。如果截止频率或奈奎斯特频率接近0,或者如果dev很大(大于10%),则结果不准确。
看到这儿的时候,还是对这些参数很迷糊,不知道这些参数是干什么的、有什么意义。下面是用matlab做仿真,从仿真图上可以慢慢体会到这些参数在滤波器设计时的作用。
设计一个低通滤波器,通带定义为0到1 kHz,阻带定义为1.5kHz到4 kHz。指定5%的通带纹波和40 dB的阻带衰减。
fsamp = 8000;
fcuts = [1000 1500];
mags = [1 0];
devs = [0.05 0.01];
[n,Wn,beta,ftype] = kaiserord(fcuts,mags,devs,fsamp);
hh = fir1(n,Wn,ftype,kaiser(n+1,beta),'noscale');
freqz(hh)
仿真图如下:
得到的仿真结果数据如下图:
设计一个奇数长度的带通滤波器。请注意,奇数长度表示偶数顺序,因此输入fir1必须是整偶数。
fsamp = 8000;
fcuts = [1000 1300 2210 2410];
mags = [0 1 0];
devs = [0.01 0.05 0.01];
[n,Wn,beta,ftype] = kaiserord(fcuts,mags,devs,fsamp);
n = n + rem(n,2);
hh = fir1(n,Wn,ftype,kaiser(n+1,beta),'noscale');
[H,f] = freqz(hh,1,1024,fsamp);
plot(f,abs(H))
grid
仿真图如下:
仿真的到的结果数据如下图所示:
现在是不是对kaiserord函数中的参数有了一些认识了? 下面就Kaiser窗口带通滤波器设计这个例子的程序来进行说明。
首先来看fsamp参数,当把这个参数的值改为4000会发生什么事情呢?
设置的fcuts是带边缘频率,最大达到2410,这个值是大于fsamp(fs)的二分之一的,所以报错。 那么把这个参数改为16000会如何呢?
右下角的值变为了8000(fs的二分之一) ,所以这个图显示了fs一半的情况,那还有一半的情况呢?其实另一半和这个情况是一样的,只不过是关于竖轴对称而已。
关于fcuts和mags参数,这个就比较好理解了。我们从带通滤波器设计的第一个仿真图来进行说明。参数设置为fcuts=[1000 1300 2210 2410]、mags=[0 1 0]。我们从图中可以看出,在1300-2210之间是通带,在1000-1300和2210-2410之间是通带向阻带转变的区间。我们可以这么理解,采样率为8000,它的一半为4000,在0-4000这个范围里面设置通或者阻,在这里我们设置阻带为0-1000(mags对应位置的参数为0),1000-1300向通带转变(就是一个过渡带,没有mags参数与之对应),1300-2210为通带(mags对应位置的参数为1),2210-2410向阻带转变,2410-4000为阻带(mags对应位置的参数为0)。如果将fcuts和mags设置为fcuts = [700 800 1200 1300 2700 2800 3200 3300]、mags = [0 1 0 1 0],结果会是怎样呢?如下图所示:
devs参数表示的是某一段波形的平整度。在带通的例子里,如果我们把devs设置为devs=[0.1 0.5 0.1],则仿真出来的图形如下:
可以看到,通带和阻带的部分,起伏都比较大。