FFTの結果の時間変化を表示する

Tips

スポンサーリンク

この記事で扱っていること

  • FFTの結果の時間変化を表示させる方法

を紹介しています。

注意:すべてのエラーを確認しているわけではないので、記事の内容を実装する際には自己責任でお願いします。また、エラー配線は適当な部分があるので適宜修正してください。

以前別の記事でFFTの結果の変化の推移をグラフに表示させる方法を扱いました。

同じグラフ上に表示させて変化の推移を見るのも一つの手ですが、もう少し長い時間の推移を見ようとしたときに同じグラフに表示させているとプロット数が多くなりすぎて見にくくなることがあります。

そこで、波形グラフ上のプロットの数は一つとして、その時間変化を強度グラフで追えるようにしました。

簡易的な表示なので、その時々でのFFT結果の最大値で規格化した値を強度グラフにて表しています。もちろん、最大値と最小値を決めてその範囲でグラデーションをつけるように強度グラフ表示させることもできます。

スポンサーリンク

どんな結果になるか

フロントパネルには強度グラフ上に示す履歴数を指定する制御器と、このサンプル内で使用するダミーの信号の周波数を決める制御器(スライダ)を用意しています。

このプログラムでは大きな配列を扱うので処理が間に合うかを測るために数値表示器を二つ置いています。

プログラムを実行すると、FFTの結果のピークが強度グラフ上に現れ、そのピーク位置が変化すると強度グラフの結果もこれに追随して変化する仕組みです。履歴数として指定した数が多いほど、多くの履歴を強度グラフの行方向に残します。

より拡大してみたい場合には、波形グラフも強度グラムもともにグラフX軸範囲を指定する必要があります。

ただし、後述するように強度グラフは「面」で表示を行います。波形グラフは「点」でデータ表示を行うため、かなり拡大した際には実は位置がずれていることがわかります。ここまで拡大せず、広い周波数範囲での変化を追う場合にはこのずれはほとんど見えないので今回のずれは妥協しています。

プログラムの構造

特に難しいことはなく、以前の記事で紹介したプログラムの方法がそのまま使えます。強度グラフ表示にする際に行方向に履歴を残すために2D配列転置を使用しています。

Whileループに入る前には強度グラフに表示させるデータ数及び履歴数に合わせた2次元配列を配列初期化で用意しておきます。これをWhileループの中で実際のデータと置換することで、配列連結追加を使用せずとも履歴を残すことが可能です。

また、強度グラフのX軸の乗数をサンプリングレートとサンプル数の商としています。強度グラフは「面」で強度を表わすため、表示上のつじつまを合わせるにはこの調整が必要になります。

Whileループの中身では、部分配列と部分配列置換の関数を使用して強度グラフの表示を更新しています。

置換の仕組みは、以前の記事で扱った考え方と同様です。

DAQを使用した場合

実際のハードウェアを使用して今回のサンプルの仕組みを実装する例を紹介します。

注意しなければいけないのは、ループの速度が適切に回るかどうかです。DAQを使用している場合であれば、DAQmx読み取りの関数が実行されるべき周期(Whileループの周期と読み替えられます)は

サンプル数÷サンプリングレート

になっているはずです。これは秒単位で、例えばサンプル数を1000サンプリングレートが10000 Hzの場合には0.1秒つまり100ミリ秒となります。

Whileループ全体が100ミリ秒で回る場合には問題ないのですが、強度グラフ表示で大量の配列を扱うため場合によってはWhileループが500ミリ秒でしか回れない場合も出てきます。するとDAQmx読み取りは適切な速度で回れなくなり、この状態が続くと「ハードウェアの集録にアプリケーションが追いついていない」というエラー-200279が出てしまいます。

ループ速度の調整には履歴数を小さくする、あるいはサンプル数を上げる、サンプリングレートを下げるといった対応が必要になります。

信号を測定していく中で変化の推移を表示することで、信号の性質の変化を観察することができます。処理が重くなる都合上あまり長い履歴(大きい配列)を扱うのは難しいかもしれませんが、変化を追う方法としては有効な場面があると思うので参考にして頂ければ嬉しいです。

ここまで読んできただきありがとうございました。

コメント

タイトルとURLをコピーしました