Main Content

シミュレーションベースの手法を使った周波数応答の推定

この例では、線形化パスのイベントベースのダイナミクスが原因でブロックごとの解析的な線形化から正確な解が得られない場合に、Simulink® モデルの周波数応答を取得する方法を説明します。そのようなシステムには、Triggered Subsystem をもつモデルやパルス幅変調 (PWM) の入力信号を使用したモデルなどがあります。

モデルを開く

エンジン タイミング用の Simulink モデルを開きます。

mdl = 'scdengine';
open_system(mdl)

このモデルをスロットル角からエンジン速度までブロックごとに解析的な線形化を行うと、線形化パスの Triggered Compression Subsystem が原因で、ゼロの線形化の結果が生じます。

io = getlinio(mdl);
linsys = linearize(mdl,io)
linsys =
 
  D = 
                ThrottleAngl
   EngineSpeed             0
 
Static gain.

Sinestream の入力信号を使用した周波数応答の推定

sinestream の入力信号は、関数 frestimate を使用した Simulink モデルの正確な周波数応答を推定するうえで最も信頼性の高い入力信号です。sinestream 信号は、互いに付加される個別の正弦波信号で構成されています。関数 frestimate は、Frequency パラメーターを使用して指定された sinestream の入力信号の各周波数と、NumPeriods パラメーターを使用して指定された対応する期間に対してモデルをシミュレートします。シミュレーションが終了したら、frestimate は出力信号を使用して、各周波数で応答を計算します。frestimate は、システムがその入力信号の定常状態に到達した後の期間のみ、つまり、SettlingPeriods パラメーターを使用して指定された整定周期数を使用します。

0.1 ~ 10 rad/s の対数的に等間隔な異なる 50 の周波数を使用して sinestream 信号を作成します。

in = frest.Sinestream('Frequency',logspace(-1,1,50),'Amplitude',1e-3)
 
The sinestream input signal:
 
      Frequency           : [0.1 0.10985 0.12068 0.13257 ...] (rad/s)
      Amplitude           : 0.001
      SamplesPerPeriod    : 40
      NumPeriods          : 4
      RampPeriods         : 0
      FreqUnits (rad/s,Hz): rad/s
      SettlingPeriods     : 1
      ApplyFilteringInFRESTIMATE (on/off)    : on
      SimulationOrder (Sequential/OneAtATime): Sequential
 

既定では、sinestream の入力信号の各周波数が 4 つの周期についてシミュレートされます。つまり、NumPeriods はすべての周波数で 4 です。また、最初の周期の終わりはシステムが定常状態に到達するところに指定されています。つまり、SettlingPeriods はすべての周波数で 1 です。したがって、frestimate は出力信号の最後の 3 周期を使用します。

この sinestream の入力信号を使用し、関数 frestimate を使用して周波数応答を推定し、結果の周波数応答データをプロットします。

[sys,simout] = frestimate(mdl,io,in);
bode(sys)

シミュレーション結果のビューアーを使用して、推定結果を調べることができます。ビューアーには、選択した周波数に対する時間領域および周波数領域のシミュレーション結果と、周波数を対話形式で切り替えることができる概要ボード線図が表示されます。

frest.simView(simout,in,sys);

ビューアーは、次のような、周波数応答推定の正確性に影響する問題を診断するツールとして使用できます。

  • 定常状態に到達しない

  • 非線形の励起

  • 不安定になる

チャープ入力信号を使用した周波数応答の推定

Simulink モデルから周波数応答データを推定するときに使用できる別の入力信号は、周波数チャープです。周波数チャープは、周波数が即座に変化するという点で sinestream と異なります。

チャープ入力信号を使用すると、周波数応答の推定を迅速に取得できます。ただし、結果の周波数応答は、sinestream 入力を使用して取得された結果ほどの信頼性はありません。これは、各周波数が、システムがその周波数で定常状態になるまでの十分な時間シミュレートされないためです。

周波数 0.1 ~ 10 rad/s を対数的にスイープするチャープ信号を作成します。

in_chirp = frest.Chirp('FreqRange',[0.1 10],'Amplitude',1e-3,...
    'SweepMethod','logarithmic','NumSamples',3000);

チャープ信号を使用して、周波数応答推定を実行します。

sys_chirp = frestimate(mdl,io,in_chirp);

sinestream の入力信号とチャープ入力信号の両方を使用して取得された結果をプロットします。

bode(sys,sys_chirp,'r')

PRBS 入力信号を使用した周波数応答の推定

Simulink モデルから周波数応答データを推定するときに使用できる別の入力信号は、2 値疑似乱数列 (PRBS) です。PRBS は、2 つの値の間で切り替わるホワイトノイズのようなプロパティをもつ、周期的で確定的な信号です。

PRBS 入力信号を使用して、チャープ信号よりも高い周波数解像度で、より高速な周波数応答を取得できます。

12 の次数と、信号内に 1 つの周期をもつ PRBS 信号を作成します。単一の周期を使用すると、非周期的な PRBS が作成されます。生成された PRBS の長さは 4095 (2^12 - 1) です。正確な周波数応答推定を取得するには、PRBS の長さは十分に大きくなければなりません。システムが確かに適切に励起されているようにするため、PRBS の摂動の振幅を 0.01 として指定します。

in_PRBS = frest.PRBS('Order',12,'NumPeriods',1,'Amplitude',1e-2,'Ts',0.1,'UseWindow','off');

PRBS 信号を使用して、周波数応答推定を実行します。

sys_PRBS = frestimate(mdl,io,in_PRBS);

PRBS 信号と sinestream の入力信号の両方で取得された結果を一緒にプロットします。

bode(sys_PRBS,sys,'r',{0.1 10})

モデルを閉じます。

bdclose('scdengine')

参考

関連するトピック