Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

Stateflow での複素数データを使用した周波数応答の測定

この例では、複素正弦波信号によって駆動される連続時間システムの周波数応答を測定するスペクトル アナライザーをエミュレートする方法を説明します。この Simulink® モデルでは、Plant ブロックが次の形式の 2 次共振システムを記述します。

$$\frac{\omega^2}{s^2 + 2\zeta\omega s + \omega^2}$$

固有振動数は $\omega = 2 \pi \cdot 150$ (または 150 Hz)、減衰比は $\zeta = 0.3$ です。システムが不足減衰であるため ($\zeta < 1$)、システムは 2 つの複素共役極をもちます。実際のアプリケーションでは、このブロックを xPC D/A ブロックと A/D ブロックで構成されるサブシステムに置き換えます。このサブシステムはテスト対象デバイス (DUT) の応答を測定します。

スペクトル アナライザーは以下のコンポーネントから構成されます。

  • Sinusoidal Generator ブロック。増加する周波数の複素正弦波信号を生成します。ブロック内で、Stateflow® チャートは時相論理を使用して周波数の範囲を反復します。

  • Stateflow チャート Analyzer。指定された周波数におけるシステムの周波数応答 (振幅と位相角) を計算します。チャートは変化検出ロジックを使用して周波数の変化を記録します。

  • Stateflow チャート Unwrap。$\pi$$-\pi$ の間で急激なジャンプがないように、測定された位相角を処理して結果をアンラップします。

スペクトル アナライザーに、測定された周波数応答が離散ボード線図のペアとして表示されます。

正弦波信号の生成

Sinusoid Generator ブロックは 2 つの出力をもちます。

  • スカラー f は、現在の周波数を表します。

  • 複素信号 y は、f の周波数をもちます。

ブロックの動作を制御するには、そのマスク ダイアログ ボックスのパラメーターを変更します。たとえば、既定の値は 10Hz ~ 1000Hz の間の周波数をもつ正弦波信号を指定します。ブロックは各周波数値を 0.2 秒間維持してから、周波数を 10Hz 刻みでインクリメントします。

シグナル ジェネレーターのタイミングを制御するため、ブロックには絶対時間の時相論理を適用する Stateflow チャートが含まれています。

シミュレーション中、チャートは次の段階を経ていきます。

  • 周波数の初期化: デフォルト遷移が信号周波数 f をパラメーター fstart の値に設定します。fstart の値は Sinusoid Generator のマスク ダイアログ ボックスで指定します。

  • 信号の生成: Generate ステートがアクティブな間、チャートは周波数 f と周波数が最後に変化してからの経過時間 t に基づいて複素信号 y = exp(2*pi*f*t*1i) を生成します。ステートがアクティブになってからの経過時間 (秒単位) を判断するために、チャートは時相論理演算子 temporalCount を呼び出します。

  • 周波数の更新: Generate ステートが delay 秒間アクティブになった後、チャートはステートから遷移して、周波数 ffstep 分増やし、Generate ステートに戻ります。周波数を更新するタイミングを判断するために、チャートは時相論理演算子 after を呼び出して、現在のタイム ステップの前と後に信号の虚数部の符号をチェックします。符号のチェックによって、周波数が更新される前に出力信号がフル サイクルを完了することが確認され、出力信号の大きな変化を防ぎます。fstepdelay の値は Sinusoid Generator のマスク ダイアログ ボックスで指定します。

  • シミュレーションの停止: 周波数 f がパラメーター fstop の値に達すると、チャートは Stopped ステートに遷移します。アクティブ ステートの出力 StoppedStop Simulation (Simulink)ブロックをトリガーし、シミュレーションが終了します。fstop の値は Sinusoid Generator のマスク ダイアログ ボックスで指定します。

周波数応答の計算

Analyzer チャートは複素信号 u と出力 yp を Plant ブロックから受け取り、プラント出力の振幅と位相を計算します。

各周波数値に対し、チャートは 2 つの累積和を維持します。

  • y。プラント出力 yp (実数) および複素信号 u の積の積分を近似します。

  • yn。プラント入力 imag(u) および複素信号 u の積の積分を近似します。この積分は、単位伝達関数を使用した仮想プラントの累積を表します。

周波数の変化を検出するために、チャートは演算子 hasChanged を使用してステート Analyze の自己遷移をガードします。周波数が変化すると、この遷移のアクションは、yn に基づいて y を正規化することで、プラント出力の振幅と位相を計算します。

測定された位相角のアンラップ

Unwrap チャートは、測定された位相角が 1 つのタイム ステップで $\pi$ ラジアンを超えて変化しないようにします。

このチャートの遷移では、新しい出力値 y が計算される前に、入力 u の変化がテストされます。

  • 入力の増加が $\pi$ ラジアンを超える場合、チャートは出力を $-2\pi$ ラジアンだけオフセットします。

  • 入力の減少が $-\pi$ ラジアンを超える場合、チャートは出力を $+2\pi$ ラジアンだけオフセットします。

シミュレーション結果の確認

モデルのシミュレーションの実行時、Scope ブロックにシステムの周波数応答 (振幅と位相) がシミュレーション時間の関数として表示されます。

  • 振幅図において、$t \approx 3$ の最大値が、共振周波数に対する Plant ブロックの応答を示しています。ピーク振幅は約 1.7 です。

  • 位相図では、角度が 0 から $-\pi$ ラジアンに変化しています。システムのそれぞれの複素極が位相角に $-\pi/2$ ラジアンを加えています。

測定された共振周波数を特定するには、測定された振幅と位相をプラントの入力周波数に対してプロットします。シミュレーション中、モデルはこれらの値を MATLAB ワークスペースにある信号のログ オブジェクト logsout に保存します。ログに記録された値は get (Simulink) メソッドを使用してアクセスできます。たとえば、測定されたシステムの周波数応答のボード線図を作成して 150Hz の位置に赤いカーソルを描画するには、次を入力します。

figure;
subplot(211);
plot(get(logsout,"frequency").Values.Data, ...
    get(logsout,"magnitude").Values.Data);
line([150 150],[0 2],Color="red",LineStyle="--");
grid on;
title("Magnitude (Output Amplitude/Input Amplitude)");
subplot(212);
plot(get(logsout,"frequency").Values.Data, ...
    get(logsout,"phase").Values.Data*180/pi)
grid on;
title("Phase (Degrees)");

ボード線図に、測定された共振周波数が約 150Hz であることが示され、これはプラント ダイナミクスで予測された値に一致しています。

参考

(Simulink) | | (Simulink) | |

関連するトピック