この記事で扱っていること
- FFTをかけた結果の推移を表示させる方法
を紹介しています。
注意:すべてのエラーを確認しているわけではないので、記事の内容を実装する際には自己責任でお願いします。また、エラー配線は適当な部分があるので適宜修正してください。
信号を測定してその結果から何か情報を得るための解析方法はいろいろあると思いますが、信号の特長を示すのに「どういった周波数の波が含まれているのか」をあぶりだす方法としてFFTはよく使われると思います。
LabVIEWの関数でFFT解析に関するものはあるのですが、単にその瞬間瞬間の解析結果を見ていてもつまらないので、その変化の様子を表示させる手段として、グラフ上にその推移を表示できるようにしてみました。
要は毎ループごとのFFTの結果を履歴を残しつつ表示させているだけ、になります。
どんな結果になるか
汎用性を持たせるために、プログラム中で測定対象の信号を生成しこれに対してFFTをかけます。フロントパネル上にはその生成した信号の周波数を変更する数値制御器(スライダ)と、履歴を表示させる数を指定しています。
プログラムを実行すると、履歴数で指定した数のプロットが表示されます。周波数を変えるとそれに追随してプロットが変化します。どの色が一番最新のプロットで次がどれでという対応は履歴色表示器の表示で確認します。
プログラムの構造
毎ループごとの値をグラフに追加するだけなので特に難しい操作はありません。ただし「グラフ表示に追加」ということで配列連結追加を使うのは好ましくないおよび配列連結追加だと履歴を際限なく増やしてしまうようなプログラムになりがちなので、履歴数を固定にするためにも配列初期化の関数を使用することにしています。
細かく見ていくと、まずWhileループに入る前にグラフ表示させる用のデータを配列初期化関数で用意していますが、この関数への入力の一部にはsampling infoのサンプル数(#s)の半分の値を入れています。これは、測定信号をFFTにかけた後のサンプル数がもともとの測定信号のサンプル数の半分になるためです。
また、履歴色表示のために波形グラフのプロパティとしてアクティブブロットの指定およびプロットカラーの表示も行っています。
Whileループの中身では適当な正弦波信号とホワイトノイズや周期性ランダムノイズを組み合わせた信号をダミーとして用意し、これをFFTの関数に入れています。もちろんこの部分はこのサンプルのためだけに用意しているので、実際にはこの部分をハードウェアからの測定値あるいはファイルからの読み取り値とします。
また、待機関数がありますがこれはサンプリングレートとサンプル数の値からそれっぽい表示にするためにわざとループの速度を制限しているもので、ハードウェアを使用する場合には必要ない部分です。
FFTの関数から出た結果の出力はクラスタになっていて、その中のmagnitudeの値を配列初期化で用意した2次元配列と置換します。この時、置換することで履歴が更新されるように、部分配列置換の前に部分配列の関数を使用してここから抜き出した値とmagnitudeの値とで部分配列置換をしています。
DAQを使用した場合
ダミーの信号ではなく実際にハードウェアから取得した値を使用した場合の実装例としてDAQのプログラムを例にとります。
DAQmx読み取りの関数からの波形出力をダミー部分と置き換える以外にも、DAQmxタイミグの関数で指定しているサンプル数の値も使用します。
もちろん、キューを使用した生産者・消費者のデザインパターンに沿って、グラフ表示させるところに関してはデータ取得とループを分けることもできると思います。
FFTをかけたことで測定した信号にどのような周波数成分が含まれているかがわかりますが、その履歴を追っていくことで信号の性質の変化が追いやすくなると思います。そのような表示をさせながら測定を行いたいときこのサンプルが役に立てば嬉しいです。
ここまで読んでいただきありがとうございました。
コメント