创建iddata对象似乎沿着时间轴

时间:2016-09-20 17:00:39

标签: matlab time-series signal-processing

我是使用Matlab / Simulink的初学者,需要进行一些系统分析。 因为我需要针对不同的系统和信号条件测试分析算法 我决定为数据生成创建一个简化但合适的simulink模型,而不是进行几个“真实”实验。 此模型在get_data()函数中调用,数据按预期返回到变量d

由于我需要估计给定系统的传递函数,我必须创建一个iddata对象才能提供数据 在合适的数据类型中。 从simulink检索的时间步长存储在data_time中,系统的输入和输出数据存储在data_in中。 data_out。 然后将这三个变量传递给iddata(),以便根据需要创建iddata对象data_measured 传递函数估计。这个片段如下:

% get data from simulink simulation executed in get_data function
d = get_data();

% extract data into variables
data_time = d.time;
data_in = d.data(:, 1);
data_out = d.data(:, 2);

% generate a time-domain data object (sample time given from simulink's noise generation)
data_measured = iddata(data_out, data_in, 0.1);

在进一步的编码和数据分析中,我发现iddata-object data_measured的时间数据与给定的时间数据不同 data_time

any(data_measured.sa == data_time)

打印0,表示没有任何元素是1,并且给定的数组不相同。

由于any()的上述调用未引起有关不等矩阵维度的任何错误,因此我决定同时绘制data_in与其{ 使用

对应的时间数据data_timedata_measured.udata_measured.sa
subplot(3, 1, 1)
plot(data_time, data_in);
title('Data retrieved from simulink') 

subplot(3, 1, 2)
plot(data_measured.sa, data_measured.u);
title('Data as in iddata-object') 

subplot(3, 1, 3)
plot(data_time, data_in, data_measured.sa, data_measured.u);
title('Data comparison') 

情节如下:

plot

正如你所看到的,两个情节之间有一个转变,恕我直言不应该在那里。 这种时间的转变似乎并没有从数据的开始就开始,因为在信号上升之前有一个小区域,而不是 吵。但是,simulink正在为整个信号添加噪声,正如您从中间给出的图中可以看到的那样。

总而言之,似乎将数据传递给iddata()以某种方式沿着时间轴切割数据并插入一些额外的数据。 它来自哪里?我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

过了一会儿,我发现问题与Simulink中的ODE求解器有关。

设置Simulink以自动选择合适的解算器及其步长。这导致了不同的步长,这在iddata()命令中使用离散采样时间时扩展了我的数据。

手动选择所需的ODE求解器并设置固定的步长后,一切正常。转移/延迟不再发生。