2016-09-20 5 views
0

私はMatlab/Simulinkを使用しているため、いくつかのシステム分析を行う必要があります。 異なるシステムと信号条件の解析アルゴリズムをテストする必要があるので、私は、いくつかの「実際の」実験を行うのではなく、単純化されていますが、データ生成に適したSimulinkモデルを作成することにしました。 このモデルはget_data()関数で呼び出され、データは期待通りに変数dに返されます。iddataオブジェクトを作成すると、時間軸に沿ってデータがシフトするようです。

私は与えられたシステムの伝達関数を推定する必要があるので、データ を適切なデータ型に提供するために、iddataオブジェクトを作成しなければなりませんでした。 simulinkから取得したタイムステップはdata_timeに格納され、システムの入出力データはdata_in respに格納されます。 data_out。 これらの3つの変数は、 伝達関数推定のために必要に応じてiddataオブジェクトdata_measuredを作成するためにiddata()に渡されます。これは以下のスニペットは、さらなる符号化およびデータ分析において

% 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); 

Iは

any(data_measured.sa == data_time) 

として data_timeに与えられるのiddataオブジェクトdata_measuredの時刻データが同じではないことを発見し0が表示され、いずれの要素も1ではなく、指定された配列が同じでないことが示されます。

any()の上記の呼び出しは、私は

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') 

をプロットを使用してdata_indata_timeその 対応する時間データ対とdata_measured.udata_measured.sa両方をプロットすることを決定し、等しくない行列の次元に関するエラーが発生しなかったので以下の通りである:あなたが見ることができるように

plot

、とのずれがありますIMHOはそこにはいけない2つのプロット。 信号が立ち上がる前に小さな領域があり、 ノイズがありませんので、この時間のシフトはデータの始まりですぐに開始されないようです。しかし、simulinkは、真ん中のプロットからわかるように、完全な信号にノイズを追加しています。

したがって、データをiddata()に渡すように見えるので、何とか時間軸に沿ってデータが切り捨てられ、いくつかの追加データが挿入されます。 どこから来たのですか?何か不足していますか?

答えて

0

しばらくすると、問題はSimulinkのODEソルバーに関連していることがわかりました。

Simulinkは、適切なソルバーとそのステップサイズを自動的に選択するように設定されています。これは、iddata()コマンドでディスクリートサンプリング時間を使用すると、私のデータを拡大する種類のステップサイズが変化することにつながります。

ODEソルバーを手動で選択して固定ステップサイズを設定したら、すべて正常に動作します。シフト/遅延はもはや発生しません。

関連する問題