首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌入函数中的持久化状态问题

嵌入函数中的持久化状态问题
EN

Stack Overflow用户
提问于 2019-09-05 14:27:30
回答 1查看 55关注 0票数 1

我目前正在实现一个二阶低通滤波器,在Simulink模型中使用Tustin离散化作为嵌入函数。该职能目前已部署如下:

代码语言:javascript
复制
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

然后,我在另一个函数中调用这个函数,如下所示:

代码语言:javascript
复制
function u1 = fcn(u,fn,dn,Ts)

u1 = SecondOrderLowpassFilterTustin(u(1),fn,dn,Ts);

在所有这些情况下,当我只调用函数一次时,就像在这种情况下

代码语言:javascript
复制
y1 = SecondOrderLowpassFilterTustin(u1,fn,dn,Ts);

结果正常

但是,只要我想同时过滤多个信号,如下所示

代码语言:javascript
复制
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),它就应该进行重置或初始化。

我尝试了不同的事情,不幸的是,没有取得什么成功。因此,我们非常感谢您的建议。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-05 16:01:26

实际上,在第二次和第三次调用filter函数时,持久性变量不会被重置,因此初始xs没有被正确设置。由于您希望对多个信号使用该函数,因此持久变量不能在SecondOrderLowpassFilterTustin中。

但是,您可以让这个函数输出xs,并以xs作为输入参数,并在fcn中保持这种持久性。

代码语言:javascript
复制
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...

end

fcn看起来是这样的:

代码语言:javascript
复制
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

顺便说一句,不要认为您期望有任何复杂的输出,但是万一'不是转置,.'就是。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57807680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档