考虑一种块方案,其中存在反馈路径,并且反馈信号由某种滤波器滤波。
如何在Matlab(而不是Simulink)中实现这一点?我对滤波器特别怀疑:我应该选择哪个信号间隔来执行滤波器?
例如,如果过滤器具有n
系数,是否足以过滤从i_n
到i
的信号间隔,其中i
是当前的迭代步骤?
我想复制Simulink对反馈循环的行为,但我发现没有办法将simulink模型导出到Matlab脚本。
答案 0 :(得分:2)
对于您的第一个问题,间隔取决于您的采样时间。 但是,要实现实际的simulink行为,这也取决于您的求解器选项。当然,实现固定步长求解器比变量步骤1更容易。
现在让我们考虑一个最简单的反馈放大器
In--->----Add--->----Gain--->---Out | | ^ V |--filter---|
如果滤波器具有n个系数,则需要存储器来保留先前的输入(假设为FIR滤波器)。这是persistent
变量派上用场的地方。所以你的电话可能如下:
%% Sample Pseudocode. Do not run it until you fully understand.
function xo = feedbackTest(xi)
n = numel(xi);
xo = zeros(n,1);
for idx = 1:n // feed through and feedback
xo(idx) = fsystem(xi(idx)) + xi(idx);
end
%% ---------- filter ---------
function out = fsystem(in)
% y = a1[n] + a2[n-1] + a3[n-2]; // you need to insert your coefficients
persistent x1 x2 x3; // retain previous inputs
if isempty(x2) x2 = 0; end
if isempty(x1) x1 = 0; end
x3 = x2;
x2 = x1;
x1 = in;
out = a1*x1 - a2*x2 + a3*x3;
当然,上面的例子只是一个演示,表明可以使用脚本/函数设计反馈循环。对于一个非常复杂的系统,它仍然可以实现,但如果不使用Simulink将非常困难。您很可能花大部分时间设计过滤器模块而不是实际的控制机制。
[编辑]
对于像Butterworth这样的IIR滤波器,它将涉及滤波器/系统中的前馈路径。但是,实现概念与fsystem()
中所示类似。最好根据截止值和波纹编写一个生成适当系数的函数(假设您知道方程式),然后在系统中应用滤波器。每当您需要在整个模型中使用新过滤器时,您不必对系数进行硬编码。
希望这能回答你的问题。
答案 1 :(得分:0)
如果您拥有Control System Toolbox,则可以将您的过滤器和系统的其他组件表示为transfer function或state-space个对象,并使用feedback
等功能连接它们。一旦用反馈循环表示整个系统,就可以使用lsim
等函数来模拟系统对特定输入的时间响应。