デジタル移動平均フィルタを実装する

clear; close all; clc;

tau1 = 9;
sampling_time = 0.01;

s = tf('s');
G = 1/tau1*(1-exp(-tau1*s))/s;
H = c2d(G,sampling_time,'zoh');
[A,B1,B2,C1,C2,D11,D12,D21,D22,E,tau] = getDelayModel(H);

max_simulation_time = 20; %[s]
kmax = round(max_simulation_time/sampling_time);

x = zeros(1,kmax);
y = zeros(1,kmax);
z = zeros(1,kmax);
w = zeros(1,kmax);

Vmax = 5; %[V]
u = Vmax*ones(1,kmax);

for k=1:kmax
  x(k+1) = A*x(k) + B1*u(k) + B2*w(k);
  y(k) = C1*x(k) + D11*u(k) + D12*w(k);
  z(k) = C2*x(k) + D21*u(k) + D22*w(k);
  w(k+1) = z(max(1,k-tau));
end

t = (1:kmax)*sampling_time;
subplot(211);
plot(t,u);
xlabel('Time [s]');
ylabel('Input voltage [V]');

subplot(212);
plot(t,y,'r');
xlabel('Time [s]');
ylabel('Output voltage [V]');
big;

f:id:seinzumtode:20220317140833p:plain