EasyBode2 プログラム

1. 機能の説明

 このVIは,エクセルcsv形式(=カンマ区切りテキスト),もしくはTab区切りテキストファイルに記録された時間列と励起信号列,応答信号列の時歴データを読み取り,FRF関数でBode線図と計測の信頼性を示すコヒーレンシをプロットします。

 (1) データの先頭に複数行のコメントなどがあっても,その部分を無視して処理できます。
 (2) 複数列の記録データから,時間列と励起信号列,応答信号列を個々に指定することができます。
 (3) 時間応答の範囲を指定して,その部分のデータを用いて処理します。
 (4) 平均化処理
(4-1) 使うファイルに複数回の計測データが入っている場合は,それらを用いて平均化処理を行えます。
(4-2) 平均化処理はリニアで,最大10回となっていますが,ダイアグラムで変更できます。
(4-3) 平均化のため,初回のデータ長が次回以降も使われるため,次回以降に範囲カーソルで指定される領域のデータ長が以下のように自動的に制限/補正されます。
(4-3-1) 次回以降に指定されるデータ長を初回より長く指定しようとしても,自動的に初回の長さに制限されます。
(4-3-2) 次回以降に指定されるデータ長が初回より短い場合は,データ終端に0が追加されます。
(4-4) 平均化処理を行わない場合は,コヒーレンシのグラフは表示されません。
 (5) ピーク信号処理
(5-1) 励振信号に複数周波数の正弦波などを用いた場合のように,スペクトラムに離散的な複数ピークがでる場合は,コヒーレンシの高い,そのピーク周波数のみを用いてBode線図をプロットできます。
(5-2) ピーク検出閾値は,励振スペクトラムの最大ピーク値より-15dB低い所に自動的に設定されますが,精度の高いピーク位置検出を行いたい場合は,ピーク閾値カーソルを動かして,より大きい閾値を指定することができます。

2. 処理内容

このVIでは,以下の処理を順に行ないます。

2.1 初期化

--------------------

2.2 データファイルの読み取り

  1. 読み取りファイルを指定するためのダイアログを表示し,拡張子が「.csv」「.txt」のファイルのみ表示します。
  2. ファイル名をダブルクリックするか,ファイル名を選択して「保存」とします。
  3. スプレッドシートファイルからの読み取りを行なうため,指定されたファイルパスを調べ,拡張子がcsvならば区切り文字を「,」とし,そうでなければ区切り文字を「Tab」に設定します。
  4. 指定されたファイルから全データを読み取り,「全てのデータ」表示器に表示します。
--------------------

2.3 信号のデータ行/列の指定とデータ取り出しとグラフ表示

  1. プロパティノードで,共通操作ボタンをブリンクさせます。
  2. プロパティノードで,共通操作ボタンのテキストとして,「配列指定完了」を設定します。
  3. プロパティノードで,フローティングのTipStripとして,「配列の行/列指定後,押してください」を設定します。プロパティノードによるTipStripへの文字列書き込みが繰り返されると,数値制御器のup/downボタンでの値変更はできますが,直接に値を代入して変更することができなくなるので,ロジックを組んで,2回だけ実行されるようにしてあります。ダイアグラムにはCPU時間確保と書きましたが,実際は,描画処理の競合がおこるのだと思います。
  1. ファイルの先頭にあるコメントを削除するために,データの開始行を指定します。
  2. 時間データ列,励起信号列,応答信号列を指定します。
  3. 「配列指定完了」ボタンが押されるまで,200msごとに 4. から繰り返します。
  1. 共通操作ボタンのブリンクをやめます。
  2. ファイル先頭のコメントを無視して,計測データの開始時間Xo,計測データ時間間隔Δx,励起信号データ,応答信号データを取り出します。
  3. 全体波形グラフと拡大グラフに,励起信号と応答信号の時暦データを表示します。
--------------------

2.4 ステート処理

Bode線図を描くために,以下の3つのステートに分けて処理します。
--------------------

2.4.1 「DefineArea」ステート

  1. 前の処理で押された共通操作ボタンSWをリセットします。
  2. 共通操作ボタンのテキストとして,「カーソル範囲指定完了」を設定します。
  3. フローティングのTipStripとして,「赤/黄カーソル範囲を設定後,押してください」を設定します。
  4. 「カーソル範囲指定完了」ボタンをブリンクさせます。
平均化を行なう場合には,複数回,このステートになりますが,平均化初回か2回目以降かはFirst Call関数で区別します。
  1. 平均化初回のカーソル範囲指定ならば,プロパティノードで赤/黄カーソル位置を知り,カーソル間の時間を表示します。
  2. その逆数である周波数分解能(Hz)を表示します。
  3. 取り出すべきデータの先頭Indexと取出し長さを求めます。
  4. データの先頭Indexと取出し長さにしたがって,その部分の励振データと応答データを切り出します。
  5. 後述の平均化処理のために,初回データの取出し長さと,赤/黄カーソルの時間間隔を記憶します。
平均化2回目以降のカーソル範囲指定の際は,切り出されたデータが初回の取り出し長さと同じになるように補正されます。
  1. 平均化2回目以降のカーソル範囲指定の際,左側にあるカーソルの位置は自由に設定できます。
  2. 右側にあるカーソル位置は,初回の赤/黄カーソルの時間間隔を超えないように,プロパティノードで制限/補正されます。これが正しく指定されるように,カーソル凡例でカーソルを「開放」に設定しておきます。
  3. 赤/黄カーソル位置からデータの先頭Indexと取出し長さを求めます。
  4. データの先頭Indexと取出し長さにしたがって,その部分の励振データと応答データを切り出します。
  5. 取出し長さに対してもともとのデータ要素数が不足,もしくは,指定した赤/黄カーソルの時間間隔が初回より短かった場合,そのままではデータ数が初回より少なくなるので,初回のデータ数と同じになるように0データを追加します。
  1. 拡大グラフの時間軸最小値/最大値に,操作した赤/黄カーソルの時間を入れることにより,時間軸を赤/黄カーソルの時間幅に拡大します。
  2. 拡大グラフのY軸最小値/最大値に,切り出された励振データと応答データの最小値/最大値を入れることにより縦軸を拡大します。
  3. 「カーソル範囲指定完了」ボタンが押されるまで,100msごとに 2. から繰り返します。
  1. 共通操作ボタンのブリンクをやめます。
  2. 次のステートを「DrawBode」にして「DefineArea」ステートを抜けます。
--------------------

2.4.2 「DrawBode」ステート

  1. DCをカットした励起信号データから波形を生成し,FFT Power Spectrum関数でスペクトルを求めます。
  2. 得られたスペクトル振幅最大値から-15dBのレベルを自動閾値として,Peak Detector.viでスペクトルのピーク検出を行います。上記でDCをカットする理由は,DC成分が最初のスペクトルピークと認識されないようにするためです。
    ピーク検出に使うデータは30個で,少なくするとピーク振幅を正確にとらえられますが,逆に,ノイズのため,不必要なローカルピークを検出することがあります。
  3. もとの励起信号データからも波形を生成し,FFT Power Spectrum関数でスペクトルを求めます。
  4. スペクトルの数値データは,パワースペクトルクラスタ表示器に表示します。
  5. スペクトルクラスタデータのf0, dfから全体の周波数配列データを作成します。
  6. 励起信号スペクトラム(XYグラフ)に,スペクトルとピークポイントを重ねて表示します。これらのデータは互いに個数が異なり,均等でもないので,XYグラフを用いて表示します。
  7. 励起信号スペクトラム(XYグラフ)に,自動閾値レベルを黄色水平カーソル(カーソル0)として表示します。これが正しく表示されドラッグできるように,カーソル凡例でこのカーソルを「ドラッグの許可」「開放」に設定しておきます。
  8. 応答信号データから波形を生成し,もとの励起信号データ波形とあわせてFrequency Response Function (Mag-Phase)関数で周波数応答を求め,G(s)の利得グラフ(XYグラフ)と,G(s)の位相グラフ(XYグラフ)に結果を表示します。XYグラフはのちに,励振信号スペクトルのピーク周波数のみでBode線図を書くために用いています。
  9. 2回以上の平均化処理が行なわれた場合のみ,コヒーレンシのグラフも表示します。コヒーレンシの値が1に近いほど,その領域の計測は信頼性があります。平均化処理を行なわないとコヒーレンシのグラフがでませんが,出しても全領域で値が1となり,意味がありません。
  10. 最低表示周波数に設定された値から,励起信号スペクトラム,G(s)の利得,G(s)の位相グラフ,コヒーレンシグラフの左端周波数を設定します。
  11. 計算されたスペクトルの最高周波数を,励起信号スペクトラム,G(s)の利得,G(s)の位相グラフの右端周波数に設定します。
  12. この周波数両端の設定が正しく行われるように,X軸のオートスケール指定ははずしておきます。
  13. 後述の励振信号スペクトルのピーク周波数のみでBode線図を書く場合にそなえて,伝達関数の周波数配列,利得配列,位相配列,ならびに,励振スペクトラムの利得配列,周波数分解能を記憶します。
  1. 平均化処理を行なうかどうかを問い合わせる,2ボタンダイアログを表示します。
  2. 平均化する場合には次のステートを「DefineArea」にして「DrawBode」ステートを終了します。
  1. もうすでに何回か平均化処理を済ませたか,もしくは,平均化処理が不要な場合は,
    励振信号スペクトルのピーク周波数のみでBode線図を書くかどうかを問い合わせる,2ボタンダイアログを表示します。
  2. このピーク処理が不要ならば,結果のBode線図表示領域にフロントパネルをスクロールさせるために,プロパティノードのFP.Originにグラフ表示位置データを書き込んでからVIを終了させます。
  1. ピーク処理を行なう場合には,次のステートを「PeakBode」にして「DrawBode」ステートを抜けます。
--------------------

2.4.3 「PeakBode」ステート

  1. 前の処理で押された共通操作ボタンSWをリセットします。
  2. 共通操作ボタンのテキストとして,「ピーク閾値指定完了」を設定します。
  3. フローティングのTipStripとして,「スペクトルの黄カーソルでピーク検出閾値指定後,押してください」を設定します。
  4. 「ピーク閾値指定完了」ボタンをブリンクさせます。
  1. 設定された黄色水平カーソル位置をプロパティノードで読み取り,その値に応じて,励振信号スペクトラムの利得配列からピーク位置を検出し,励起信号スペクトラム(XYグラフ)に,スペクトルとピークポイントを重ねて表示します。
  2. 「ピーク閾値指定完了」ボタンが押されるまで,100msごとに 5. から繰り返します。
  1. 伝達関数の周波数配列,利得配列,位相配列から,ピーク検出された周波数での値だけを取り出します。
  2. これらは,周波数が等間隔ではないので,XYグラフであるG(s)の利得,G(s)の位相グラフに表示します。
  3. 結果のBode線図表示領域にフロントパネルをスクロールさせるために,プロパティノードのFP.Originにグラフ表示位置データを書き込んでからVIを終了させます。

LabVIEW Tipsに戻る