G = tf([0.0565 0.1013], [1 -1.4183 1.5894 -1.3161 0.8864], 1.0); %% a) Generate sets of identification data N = 200; u_idin = idinput(N); u_unif = 2 * rand(N, 1) - 1; % for 3c) N = 5 * N; u_idin = repmat(u_idin, 5, 1); u_unif = repmat(u_unif, 5, 1); e = 0.1 * randn(N, 1); y_idin = lsim(G, u_idin) + e; y_unif = lsim(G, u_unif) + e; %% b) Estimate G(z) by EFTE U_idin = abs(fft(u_idin)); U_unif = abs(fft(u_unif)); Y_idin = abs(fft(y_idin)); Y_unif = abs(fft(y_unif)); G_idin = Y_idin ./ U_idin; G_unif = Y_unif ./ U_unif; omega = (2*pi/N)*[0:N-1]; pos_idx = find(omega >= 0.0 & omega <= pi); H = abs(squeeze(freqresp(G, omega(pos_idx)))); err_idin = abs(H - G_idin(pos_idx)); err_unif = abs(H - G_unif(pos_idx)); subplot(2, 1, 1) loglog(omega(pos_idx), H, 'green'); hold on loglog(omega(pos_idx), G_idin(pos_idx), '--b'); loglog(omega(pos_idx), G_unif(pos_idx), '-.r'); hold off legend('True plant', 'EFTE random binary', 'EFTE uniform distribution') subplot(2, 1, 2) loglog(omega(pos_idx), err_idin, '--b') hold on loglog(omega(pos_idx), err_unif, '-.r') hold off legend('EFTE random binary error', 'EFTE uniform distribution error') fprintf('err_idin total: %f\n', mean(err_idin)) fprintf('err_unif total: %f\n', mean(err_unif)) %% c) % 1) Obvious. Slightly better results % 2) % 3) Best solution. Discard first period. Average the rest and apply fft after % y5 = mean(reshape(yp(N+1:end), N, []), 2) % Y5_N = fft(y5)