0
点赞
收藏
分享

微信扫一扫

如何对scope输出的波形提取超调量和上升时间等

✅作者简介:热爱科研的算法开发者,Python、Matlab项目可交流、沟通、学习。

🍎个人主页:算法工程师的学习日志

一位读者朋友后台咨询了一个问题:如何对scope输出的波形提取超调量和上升时间等

针对这个问题分享一下方法


这个问题首先分成两步:

1、导出来scope的数据

2、对数据进行计算得到超调量和上升时间等


1、导出数据

simulink数据导出到变量空间主要有2种方法:


1)通过out模块


如何对scope输出的波形提取超调量和上升时间等_数据


对于低版本的matlab(15a之前的)要取消勾选limit data points to last,不然导出来的数据最多只有100个


在Simulation>Configuration Parameters

如何对scope输出的波形提取超调量和上升时间等_稳态误差_02

在变量空间就可以看到tout和yout的变量,这样就可以对数据进行处理了

如何对scope输出的波形提取超调量和上升时间等_稳态误差_03

for example:

figure
plot(yout(:,1),yout(:,2),'k')
xlabel \Psi(\alpha)/Wb
ylabel \Psi(\beta)/Wb
xlim([-0.03 0.03])
ylim([-0.03 0.03])
set(gcf,'color','w')

如何对scope输出的波形提取超调量和上升时间等_稳态误差_04



2)通过To Workspace模块

如何对scope输出的波形提取超调量和上升时间等_上升时间_05

simout这个变量会直接保存在变量区,

对于simout这个变量有4种格式

如何对scope输出的波形提取超调量和上升时间等_上升时间_06


Save format指定将仿真输出保存到工作区中时使用的格式,包括:

“Timeseries”(默认值)

将非总线信号另存为 MATLAB timeseries 对象,将总线信号另存为 MATLAB timeseries 对象的结构体。

如何对scope输出的波形提取超调量和上升时间等_数据_07

 调用方法:  plot(simout.Time,simout.Data)


“Array”

就一个输出的数组,类似yout,没有时间信息

如何对scope输出的波形提取超调量和上升时间等_上升时间_08

调用方法:plot(simout)


“Structure”

这个就只有value,没时间信息,plot(simout.signals.values)


 

“Structure With Time”

调用方法:plot(simout.time,simout.signals.values)

如何对scope输出的波形提取超调量和上升时间等_稳态误差_09



2、数据计算

对于一个常规的传递函数,在进行了阶跃仿真后经常需要给出对应的响应指标,

sys = tf(1,[1 2 3])
y = step(sys)
figure
plot(y)

如何对scope输出的波形提取超调量和上升时间等_数据_10

求解对应的阶跃指标结果,其计算方法就是按照对应的名称定义来的,

%% 求阶跃响应的典型指标
function [OverShoot, RiseTime, PeakTime, AdjustTime, SteadyStateError] = GetPerformanceOfStepResponse(t, y, stepvalue, gTolerance)
% 超调量Mp:最大超调量规定为在暂态期间输出超过对应于输入的终值的最大偏离量
% 上升时间tr:在暂态过程中,输出第一次达到对应于输入的终值的时间(从t=0开始计时)
% 峰值时间tp:对应于最大超调量发生的时间(从t=0开始计时)
% 调整时间ts:输出与其对应于输入的终值之间的偏差达到容许范围(一般取5%或2%)所经历的暂态过程时间(从t=0开始计时)
% 稳态误差err:给定输入与稳态输出的差值
% 超调量和峰值时间
[OSValue, OSIndex] = max(y);
OverShoot = (OSValue - stepvalue)/stepvalue*100;
PeakTime = t(OSIndex);
 
% 上升时间
index = find(y >= stepvalue, 1, 'first');
RiseTime = t(index);
 
% 调整时间和稳态误差
index1 = find(y <= stepvalue*(1 - gTolerance), 1, 'last'); % 容许范围由全局变量指定
index2 = find(y >= stepvalue*(1 + gTolerance), 1, 'last');
 
if isempty(index2) % 如果没有超调量,此值为空
    index = index1;
else
    index = max(index1, index2);
end
 
 
index = max(index1, index2);
AdjustTime = t(index);
 
SteadyStateError = mean(y(index:end)) - stepvalue; % 这里的稳态误差计算为调整时间后的数据平均值与给定输入的差,概念上是最后时刻的值与给定输入的差
 
end

其中 t为时间,y为响应结果,stepvalue为阶跃数值,gTolerance为调整时间的误差

举报

相关推荐

0 条评论