利用连续扫频的方式进行系统模型辨识。
连续扫频相对于单点扫频来说,操作更简单,利用simulink中的“Chirp Signal”模块作为激励信号,设置随着时间变化的“变频”曲线对被控对象进行扫频,然后用FFT对输入信号与输出信号进行分析,得到各自的幅值、相位,然后求得输入、输出信号的幅值比、相位差,有了幅值比、相位差,同样就可以采用Simulink自带的模型辨识工具箱去获得被控对象的传递函数。
具体步骤:
01. Simulink模型
建立扫频模型如上图所示,并将系统步长设置为定步长0.0001,使用龙格库塔求解器(ode4)。后运行仿真,输入信号和输出信号用“to Workspace”模块将数据实时保存至“Workspace”中。
02. 编写 fft.m代码
对导入Workspace里的u=out.u.Data;outy=out.y.Data;数据进行FFT分析,并得到幅值比、相位差。
u=out.u.Data;
outy=out.y.Data;
close all;
fs = 10000; % 对应采样时间0.0001s。
N = length(u);
n = 0: (N - 1);
fn = n * fs / N;
%%
y = fft(u,N);
mag = abs(y);
pha = angle(y);
%%
y1 = fft(outy,N);
magl = abs(y1);
phal = angle(y1);
%%
%%计算幅值比,相位差
for i = 1 : N / 2
mag_el(i) = magl(i)/mag(i);
w(i) = fn(i) * 2 * pi;
ph_el(i) = (phal(i) - pha(i)) * 180 / pi;
mag_log(i) = 20 * log10(mag_el(i));
end
%%对相位差的数据进行预处理
for i = 1: length(ph_el)
if ph_el(i) > 0
ph_el(i) = ph_el(i) - 360;
end
end
%% 画Bode图
subplot(211);semilogx((w),(mag_log));grid on;
subplot(212);semilogx((w),(ph_el));grid on;
03. System Identification 工具箱
开启“系统辨识工具箱”后,导入“Freq.domain data”来加载模型。
点击“Estimate”,选择“Tranfer Function Models”(估计传递函数)。根据实际需求选择传递函数的零极点,选择实际的“Fit frequncy range”,然后点击“Estimate”即可。
04. 结果展示
与结果相差不大,辨识结果较为满意!!