大家好,又见面了,我是你们的朋友全栈君。
与陷波器类似,带通滤波器在数字电源控制领域有重要作用。比如在三相LCL逆变器的谐振抑制控制方面,通过带通滤波器可以提取谐振点附近的频谱做进一步的控制策略。在有源电力滤波器利用带通滤波器可以提取电网信号的基波频率从而做进一步的控制。
带通滤波器的传递函数是: h ( s ) = A w o B s s 2 + B s + w o 2 h(s)=\frac{Aw_oBs}{s^2+Bs+w_o^2} h(s)=s2+Bs+wo2AwoBs 其中, w o w_o wo 是带通的“中心频率”,也就是想要通过频率的中心点频率。 B B B是带通的频宽比,注意此处频宽比是一个相对于中心频率的比例,比如: w o = 50 ∗ 2 ∗ p i w_o=50*2*pi wo=50∗2∗pi B = 0.2 B=0.2 B=0.2 表达的意义是设定中心频率为50Hz,带通的带宽为50*0.2=10Hz。
设定“中心频率”为50Hz,频宽比为0.4。用matlab绘制伯德图,如下:
可见,仅仅在50Hz附近有大于0的增益,其他频率点都被抑制了。于是就有了“带通”的效果。
上述都是在连续域中分析的,但是对于数字控制应用,它是无法落地实现的,所以我们需要对连续域模型进行离散化分析。
利用Z变换可以离散化。也可以利用matlab对S函数进行Z变换,选定离散时间Ts=0.0002,则其Z变换如下: F ( z ) = 0.0012557 z − 0.0012557 z 2 − 1.996 z + 0.999920 F(z)=\frac{0.0012557z-0.0012557}{z^2-1.996z+0.999920} F(z)=z2−1.996z+0.9999200.0012557z−0.0012557
z变换后很自然能得到差分方程,只需要对分子分母除以 z z z的最高次幂: Y X = 0.0012557 X k − 1 − 0.0012557 X k − 2 1 − 1.996 X k − 1 + 0.999920 X k − 2 \frac{Y}{X}=\frac{0.0012557X_{k-1}-0.0012557X_{k-2}}{1-1.996X_{k-1}+0.999920X_{k-2}} XY=1−1.996Xk−1+0.999920Xk−20.0012557Xk−1−0.0012557Xk−2 有了差分方程,程序的实现可以落到实地。在Matlab的m文件中编写matlab function为例说明:
function Y = BandFilter(X)
%#codegen
%% 中间变量定义及初始化
Num0 = 0;
Num1 = 0.0012557;
Num2 = -0.0012557;
Den0 = 1;
Den1 = -1.996;
Den2 = 0.999920;
persistent Xk_1; % 上1次的输入
persistent Xk_2; % 上2次的输入
persistent Yk_1; % 上1次的输出
persistent Yk_2; % 上2次的输出
if isempty(Xk_1) Xk_1 = 0;
end
if isempty(Xk_2) Xk_2 = 0;
end
if isempty(Yk_1) Yk_1 = 0;
end
if isempty(Yk_2) Yk_2 = 0;
end
%% 执行计算
Temp = Num0*X + Num1*Xk_1 + Num2*Xk_2 - (Den1*Yk_1 + Den2*Yk_2);
Y = Temp/Den0;
Xk_2 = Xk_1;
Xk_1 = X;
Yk_2 = Yk_1;
Yk_1 = Y;
利用Sum模块将50Hz、1Hz、500Hz正弦信号,以及直线信号、随机信号,这5个信号相加,得到一组带有谐波的信号注入到带通滤波器,结构图如下所示:
从仿真结果可以看到:滤波后,除了50Hz的波形被保留下来,其他波形都被滤除了。可见,带通滤波器在杂波信号中获取指定次的谐波有较好的效果。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/133885.html原文链接:https://javaforall.cn