考虑一个有反馈路径并且反馈信号被某种滤波器过滤的块方案。
如何在 Matlab(不是 Simulink)中实现这个?我的疑问特别是关于过滤器:我应该选择什么间隔的信号来执行过滤器?
例如,如果滤波器有n
系数,是否足以将信号的间隔从当前迭代步长过滤i_n
到i
哪里?i
我想为反馈循环复制 Simulink 的行为,但我发现无法将 simulink 模型导出到 Matlab 脚本。
考虑一个有反馈路径并且反馈信号被某种滤波器过滤的块方案。
如何在 Matlab(不是 Simulink)中实现这个?我的疑问特别是关于过滤器:我应该选择什么间隔的信号来执行过滤器?
例如,如果滤波器有n
系数,是否足以将信号的间隔从当前迭代步长过滤i_n
到i
哪里?i
我想为反馈循环复制 Simulink 的行为,但我发现无法将 simulink 模型导出到 Matlab 脚本。
对于您的第一个问题,时间间隔取决于您的采样时间。但是,要实现实际的 simulink 行为,这也取决于您的求解器选项。当然,实现固定步长求解器比可变步长求解器更容易。
现在让我们考虑一个最简单的反馈放大器
In--->----Add--->----Gain--->---Out | | ^ 五 |--过滤器--|
如果滤波器有 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 将很难实现。您很可能会花费大部分时间来设计过滤器模块,而不是做实际的控制机制。
[编辑]
对于 IIR 滤波器(例如 Butterworth),这将涉及滤波器/系统中的前馈路径。但是,实现概念与中所示的类似fsystem()
。最好编写一个函数,根据您的截止值和波纹(假设您知道方程式)生成适当的系数,然后在系统中应用您的滤波器。当您在整个模型中需要一个新滤波器时,您不必每次都对系数进行硬编码。
希望这能回答你的问题。