2016-09-20 1 views
0

Я являюсь новичком, использующим 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') 

Сюжета приведен ниже:

plot

Как вы можете видеть, есть сдвиг между два участка, в которых ИМХО не должно быть. Этот сдвиг во времени, похоже, не начинается с начала данных, так как есть небольшая область до того, как сигнал повысится, а это не шумно. Тем не менее, simulink добавляет шум к полному сигналу, как вы можете видеть из графика, указанного в середине.

Таким образом, все, что кажется, передает данные в iddata(), как-то разрезает данные по оси времени и вставляет некоторые дополнительные данные. Откуда это? Я что-то упускаю?

ответ

0

Через некоторое время выяснилось, что проблема связана с решением ODE в Simulink.

Simulink был настроен для выбора подходящего решателя и его размера шага автоматически. Это приводит к разным размерам шагов, которые расширяют мои данные при использовании дискретного времени выборки в команде iddata().

После выбора нужного регенератора ODE вручную и настройки фиксированного размера шага все работает нормально. Сдвиг/задержка больше не встречается.