版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
版权
信号处理专栏收录该内容
11 篇文章5 订阅
订阅专栏
在信号处理中,滤波器的系数我们往往都是通过MATLAB来设计,只要我们知道滤波器的通带截止频率和阻带起始频率,就可以通过MATLAB中的fdatool(在MATLAB2020中使用filterDesigner)来设计滤波器了。
我们使用归一化的参数来设计,通带截止频率是025,阻带起始频率是0.3,通带内纹波是0.2,阻带衰减是60dB,参数设置如下:
那么问题来了,对于插值滤波器,如何确定通带和阻带的频率呢?这就涉及到我们刚开始学习数字信号处理时的插值和抽取理论。当信号抽取时,在数字频率上,信号的频谱是展宽的,当信号插值时,在数字频率上,信号的频谱是压缩的。这里我们强调数字频率,不是模拟频率,因为100MHz的采样率去采中频10MHz、带宽1MHz的信号,那么抽取2倍后,这个信号的频率还是10MHz,带宽还是1MHz,那为什么说数字频率上频谱展宽了呢?因为数字频率的2pi对应采样率。
我们以信号处理书上这个经典的例子为例,原始信号的带宽是2pi/3,采样率是2pi,经过3倍抽取后,采样率由fs变为fs/3;而抽取后信号的采样率依旧对于数字域的2pi,因此原先的fs就对应6pi,信号带宽也就变成了2pi。
而抽取滤波器则刚好相反,对于3倍的插值滤波器,信号带宽在数字频率上,缩小了1/3。也就是原来0pi的区间缩小到0pi/3,因此信号的截止频率就是pi/3,我们在设计滤波器时,直接指定截止频率是pi/3即可,至于阻带起始频率,我们可以设计的比通带截止频率稍大一些即可,同时还要考虑滤波器阶数,如果过渡带太窄了,滤波器阶数会太高。像我们上面设计的那个滤波器,正好可以适用于4倍插值滤波器。
这里我们再提供一种解决方案,这种方法也是我强烈推荐的,就是当我们对一种设计没有头绪时,可以参考mathworks给出的设计。从哪参考呢?当然是MATLAB程序。我们知道Matlab的一个强大之处在于给我们提供了很多API可以调用,为我们节省了不少时间,而且大多数的函数我们都是可以看到源码的。比如我们今天所说的插值滤波器,可以直接使用resample函数,比如要对向量sig插值4倍,就可以直接使用sig2 = resample(sig, 4, 1)。这次我们再打开resample这个函数,可以看到:
这里的N是10,也就是说,如果是p倍插值,Matlab给出的插值滤波器阶数是2x10xp,也就是4倍插值滤波器对应阶数是80阶。再用firls来设计滤波器,最后再给滤波器加个kaiser窗。其实我们也可以直接使用fir2函数来设计,就是把图中高亮的行换成:
h = fir2(L - 1, [0 2*fc 2*fc 1], [1 1 0 0]);
fir2函数默认就是加了hamming窗的。使用这种方法设计的滤波器频响如下:
微信公众号:Quant_Times