目录

  • 1 三参数陷波滤波器
  • 2 双线性变换
  • 3 三参数计算
  • 4 写在最后



1 三参数陷波滤波器

三参数型滤波器主要有以下一个参数:

wn:滤波器带宽,单位rad/s=> * 2pi可转化为Hz;

k1:陷波因子1;

k2:陷波因子2;

可以得到二阶三参数的陷波滤波器传递函数为:

陷波滤波器python 代码 陷波滤波器参数_学习


可以看到输入信号为X(s),经过陷波滤波器的传递函数后,输出信号为Y(s)。

2 双线性变换

本文采用双线性变换,其本质是一种数值积分法,采用梯形方法来近似计算积分。经过简要推导可以得到:

陷波滤波器python 代码 陷波滤波器参数_学习_02


将式(2)带入式(1)可得,

陷波滤波器python 代码 陷波滤波器参数_matlab_03


将式(3)利用字符进行替换可得,

陷波滤波器python 代码 陷波滤波器参数_线性代数_04


其中,

陷波滤波器python 代码 陷波滤波器参数_陷波滤波器python 代码_05


利用z变换的信号滞后特点可以得到以下形式:

陷波滤波器python 代码 陷波滤波器参数_线性代数_06


最终可以得到离散形式如下:

陷波滤波器python 代码 陷波滤波器参数_矩阵_07


通过式(7)的就可以得到输入信号经过陷波滤波器后的输出信号的完整离散形式。

3 三参数计算

虽然该陷波滤波器的形式种存在三种参数,但是,参数如何设置呢?实质上,真正意义上的三参数陷波滤波器只得是以下三个参数:

wn:滤波器带宽,单位rad/s=>*2可转化为Hz;

f:陷波带宽,衰减到-3db时频率差值;

depth:陷波深度(中心频率处的衰减倍数);

其中,陷波带宽是容易理解的,而陷波深度,对于上述传递函数应该是一个小于1的值,这样才能把对应频率的输入信号进行可靠的衰减。

经过推导,可以得到三参数之间的关系:

陷波滤波器python 代码 陷波滤波器参数_矩阵_08


为了方程有解,需要满足:

陷波滤波器python 代码 陷波滤波器参数_矩阵_09


至此,陷波滤波器推导完成,下面给出m函数的脚本,其中给出了双线性和零极点匹配两种离散化的结果。

clear all;
close all;
clc;

fc = 379;
fbw = 40;

wn = 2 * pi * fc;
delta_f = 200;%陷波宽度
depth = 0.001;%陷波深度
%陷波宽度设置为200Hz,陷波深度depth设置为100;
k1 = (sqrt(16*pi^2*delta_f^2/wn^2+4)+1)/(-4*depth^2+2)
k2 = depth*k1
Ts = 0.0001;
a = [1 2*k2*wn wn^2];
b = [1 2*k1*wn wn^2];
sys = tf(a, b)
sysd_tustin = c2d(sys, Ts, 'tustin');
sysd_matched = c2d(sys, Ts, 'matched');
%% figure
figure(1);
P=bodeoptions;
P.FreqUnits = 'Hz';
bode(sys, P);
grid on;
title('sys');
figure(2);
bode(sysd_tustin, P);
grid on;
title('sysd\_tustin\_test');
figure(3);
bode(sysd_matched, P);
grid on;
title('sysd\_matched\_test');

运行结果如下:

S域:

陷波滤波器python 代码 陷波滤波器参数_学习_10


双线性变换:

陷波滤波器python 代码 陷波滤波器参数_学习_11


零极点匹配:

陷波滤波器python 代码 陷波滤波器参数_陷波滤波器python 代码_12


不同的离散方法在不同的情况下会出现偏差,调试时应选择适合的方法。


4 写在最后

对于陷波滤波器在Simulink中的实现可以选择直接使用m函数的脚本,也可以使用模型搭建。
上文中我已经给出了差分方程的形式,可以利用Simulink的delay模块进行延时实现不同时刻的信号叠加。除此之外,实现的方式是多种多样的,也可以通过传递函数,使用直接II型的结构实现这类较为简单的二阶系统。