我目前正在实现一个二阶低通滤波器,在Simulink模型中使用Tustin离散化作为嵌入函数。该职能目前已部署如下:
function y = SecondOrderLowpassFilterTustin(u,fn,dn,Ts)
persistent xs
if isempty(xs)
xs = [u 0]';
end
% Convert frequency from Hz to rad/s
wn = fn*2*pi;
% Construct state-space matrices in continuous time
A = [0 1 ; -wn^2 -2*dn*wn];
B = [0 ; wn^2];
C = [1 0];
D = 0;
% Construct equivalent state-space matrices in discrete time
I = eye(size(A));
K1 = (I + 0.5*A*Ts);
K2 = (I - 0.5*A*Ts)^-1;
Ad = K1*K2;
Bd = K2*B*Ts;
Cd = C*K2;
Dd = (0.5*Ts*C*K2*B) + D;
% Calculate output
xs = Ad*xs + Bd*u;
y = Cd*xs + Dd*u;
end然后,我在另一个函数中调用这个函数,如下所示:
function u1 = fcn(u,fn,dn,Ts)
u1 = SecondOrderLowpassFilterTustin(u(1),fn,dn,Ts);在所有这些情况下,当我只调用函数一次时,就像在这种情况下
y1 = SecondOrderLowpassFilterTustin(u1,fn,dn,Ts);结果正常

但是,只要我想同时过滤多个信号,如下所示
function [u1,u2,u3] = fcn(u,fn,dn,Ts)
u1 = SecondOrderLowpassFilterTustin(u(1),fn,dn,Ts);
u2 = SecondOrderLowpassFilterTustin(u(2),fn,dn,Ts);
u3 = SecondOrderLowpassFilterTustin(u(3),fn,dn,Ts);结果很差,如图2所示。

我认为它与持久状态变量xs有关,一旦调用SecondOrderLowpassFilterTustin(u,fn,dn,Ts),它就应该进行重置或初始化。
我尝试了不同的事情,不幸的是,没有取得什么成功。因此,我们非常感谢您的建议。
发布于 2019-09-05 16:01:26
实际上,在第二次和第三次调用filter函数时,持久性变量不会被重置,因此初始xs没有被正确设置。由于您希望对多个信号使用该函数,因此持久变量不能在SecondOrderLowpassFilterTustin中。
但是,您可以让这个函数输出xs,并以xs作为输入参数,并在fcn中保持这种持久性。
function [y, xs] = SecondOrderLowpassFilterTustin(u,fn,dn,Ts,xs)
if isempty(xs)
xs = [u 0].';
end
% Convert frequency from Hz to rad/s
wn = fn*2*pi;
% continue with the rest...
endfcn看起来是这样的:
function [u1,u2,u3] = fcn(u,fn,dn,Ts)
persistent x1 x2 x3
% x1, x2 and x3 will be [] on first iteration, thus xs will be set to [u 0].'
[u1,x1] = SecondOrderLowpassFilterTustin(u(1),fn,dn,Ts,x1);
[u2,x2] = SecondOrderLowpassFilterTustin(u(2),fn,dn,Ts,x2);
[u3,x3] = SecondOrderLowpassFilterTustin(u(3),fn,dn,Ts,x3);
end顺便说一句,不要认为您期望有任何复杂的输出,但是万一'不是转置,.'就是。
https://stackoverflow.com/questions/57807680
复制相似问题