Я являюсь новичком, использующим Matlab/Simulink, и вам нужно сделать некоторый системный анализ. Поскольку мне нужно протестировать алгоритм анализа для разных систем и условий сигнала Я решил создать упрощенную, но подходящую модель simulink для генерации данных, а не выполнять несколько «реальных» экспериментов. Эта модель вызывается в функции get_data()
, и данные возвращаются к переменной d
, как и ожидалось.Создание объекта iddata, похоже, сдвигает данные по оси времени
Поскольку мне необходимо оценить передаточную функцию данной системы, мне пришлось создать объект 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-объекта data_measured
не то же самое, как указано в data_time
, как
any(data_measured.sa == data_time)
печатает 0
, указывая, что ни один из элементов не является 1
, и данные массивы не совпадают.
Поскольку выше вызов any()
не вызвал ошибку о неравных размерах матрицы я решил построить как data_in
против его соответствующих временных данных data_time
и data_measured.u
против data_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')
Сюжета приведен ниже:
Как вы можете видеть, есть сдвиг между два участка, в которых ИМХО не должно быть. Этот сдвиг во времени, похоже, не начинается с начала данных, так как есть небольшая область до того, как сигнал повысится, а это не шумно. Тем не менее, simulink добавляет шум к полному сигналу, как вы можете видеть из графика, указанного в середине.
Таким образом, все, что кажется, передает данные в iddata()
, как-то разрезает данные по оси времени и вставляет некоторые дополнительные данные. Откуда это? Я что-то упускаю?