Matlab:如何为低通贝塞尔滤波器(蒂兰滤波器)设计数字等效项?

信息处理 低通滤波器 转换功能 线性相位
2022-02-09 08:03:13

在对我的信号应用低通贝塞尔滤波器的过程中,我意识到 besself 函数不支持数字贝塞尔滤波器的设计,而双线性函数可用于将模拟滤波器转换为数字形式,贝塞尔滤波器除外。Bessel 滤波器的数字等效物是 Thiran 滤波器。对于我的滤波器,我唯一知道的是它的带宽应该小于 5GHz(比如说 3GHz 带宽)。如果有人可以帮助我在 Matlab 中编写代码,我将不胜感激。我到目前为止的代码是:

%lowpass filter  
sig = MY SIGNAL;
sig_length = 5000001;                         % my signal length
fs  = 10000e9                                 % sampling rate
fc  = 3e9;                                    % cutt off frequency
order = 4; 
wo = 2*pi*fc;
[z,p,k] = besself(order, wo,'low');           % zero, pole and gain form
% Convert to digital fileter
[zd,pd,kd] = bilinear(z,p,k,fs);          % z-domain zero/pole/gain
[sos,g] = zp2sos(zd,pd,kd);                   % convert to second order section 
filteredSignal = filtfilt(sos, g, sig);
1个回答

我没有 Matlab,但 Thiran 滤波器的系数由高斯超几何函数给出。如果你有wxMaxima,那么已经有一个内置函数。如果你运行这两行(第一行只需要一次),你会得到分母:

expand_hypergeometric : true$
N : 4$
D : 1$
hypergeometric([-N, 2*d], [2*D + N + 1], z);

N是顺序和D延迟,以秒为单位。以上将显示:

z^4/42-(4*z^3)/21+(9*z^2)/14-(8*z)/7+1

如果 Matlab 没有该功能,您可以将其实现为:

(1)H(z)=(2N)!N!1i=N+12N2D+i1k=0N(1)k(Nk)[i=0N(2D+i2D+k+izk)]

分子将是系数的总和,以获得单位增益。将分母分成二阶部分在数值上会更加稳定。

此外,事实上,滤波器的频率衰减非常差,但如果你在z,你可能会得到更好的结果。例如看这个,两个零可以提供更好的衰减,但代价是一些额外的延迟。或者,如果 Nyquist 处只有零就可以了,只需添加1+z1.