この記事で扱っていること
- 正弦波を重ね合わせた波形を生成する方法
を紹介しています。
注意:すべてのエラーを確認しているわけではないので、記事の内容を実装する際には自己責任でお願いします。また、エラー配線は適当な部分があるので適宜修正してください。
出力信号を色々変化させる方法についてはこれまでにも扱ってきたのですが、今回は正弦波形を重ね合わせたような信号を簡易的に作れるようなプログラムを作ってみました。
様々な周波数の正弦波を重ね合わせることで複雑な形も再現できてしまうのはフーリエ旧数などとして知られていますが、実際にそういった「凝った」波形を出力する必要があるという場合に使えるかと思います。
どんな結果になるか
波形データを作成するので、フロントパネルには波形情報に必要なサンプリングレートやサンプル数のパラメタ、そして各正弦波の周波数や振幅、位相を変えるパラメタをそれぞれクラスタで用意しています。
波形パラメタを変更するたびに生成波形のグラフにそのパラメタで生成される正弦波形が表示されます。
ここで重ね合わせのボタンを押すことで、合成波形のグラフに生成波形のグラフが足されます。
つまり、既に合成波形のグラフに何かしら波形がある場合、生成波形の部分で作った波形を重ね合わせる(足し合わせる)ことができます。
この重ね合わせはキャンセルでいくらでも戻ることが可能で、また重ね合わせをしすぎて振幅が大きくなりすぎても対応できるように振幅を強制的に変換(スケール)する機能も付けています。
合成波形は追加ボタンを押すことで波形全体のグラフに追加されます。すると生成波形と合成波形はリセットされ、また新たな波形を作り出せます。その後追加ボタンを押すと、波形全体で既に表示されている波形の後に一番最後に作成した合成波形をつなげられる構造としています。
プログラムの構造
ベースはイベント駆動型のステートマシンとしています。機能が多いためステートは9種ありますが、そのうち初期化であるinitializeステートと終了であるcloseステートは大したことをやっていません。また、イベントは7つあり、フロントパネル上のそれぞれのボタン操作に対応させてイベントを駆動しています。
ステートマシンで各ステート間で共有しているデータは8つあり、
- ステート(列挙体)
- 波形パラメタ(クラスタ)
- サンプリング情報(クラスタ)
- 生成波形(波形データ)
- 合成波形(波形データ)
- 合成波形配列(波形データの配列)
- 波形全体(波形データ)
- 波形全体の個々の波形サイズ(数値の配列)
となっています。
各ステートを見ていきます。まずinitialize、これは以下のブロックダイアグラムとしています。
各ステート間で受け渡すデータを初期化しているだけでなく、追加ボタンに対して無効プロパティを用意し、Disabled and Grayed outを入力しています。これは、プログラム開始早々、合成波形も作っていないのに波形全体へ追加しないようにするための措置です。
次にidleステートです。このステートでイベントを待ちます。各イベントの定義は以下の図のようにしました。
次にwave_createステートです。フロントパネル上で指定されたパラメタに従って正弦波のデータを用意するために、信号処理パレットの波形生成パレット中にある正弦波形関数を使用しています。
この次は、重ね合わせを行っているsuperpositionステートです。既に合成波形が作られているのであれば単に生成波形と足し算をする、もし合成波形がない(波形全体に一度登録した後など)のであれば生成波形を丸ごと合成波形とする、といった場合分けをしています。
また、足された生成波形を丸ごと配列に入れることもしています。これは次のcancelステートで使用されます。
次のcancelステートでは、最後に足された波形データを合成波形から引きます。
amp_changeステートでは、合成波形のY値の中から最大値を拾い、これとユーザーが指定した振幅最大値の値を使用することで、合成波形全体を指定した振幅最大値が最大値になるようにスケールしています。
合成波形を作り終えたら次のaddステートによって波形全体に追加していきます。
あるいはdeleteステートで、追加した波形を消すこともできます。フロントパネル上の削除ボタンを押すたびに追加した波形がどんどん削除されるようにしています。
最後はcloseステートです。ステートマシンを止めるためにWhileループの条件端子にTRUEをいれるだけです。
これらのステートを組み合わせれば、このサンプルが完成します。
波形をハードウェアから出力する
せっかく作った波形なので、これを実際にハードウェアから出力できれば面白いですよね。今回は、一度作った波形を何度でも再利用できるように、上記のサンプルで最終的にできた波形をファイル保存し、信号出力を行うプログラムで読み込んで実際の出力を行う際の例をDAQハードウェアを使用した場合を例に紹介します。
ファイル出力するのはとても簡単で、波形データをそのまま保存できるTDMSを使用してこのように書けます。
そして出力する方のプログラムも簡単で、このように書けます。
これを実行すれば、正弦波を重ね合わせた波形信号を出力することができます。
単純な用途であれば正弦波形の関数をいくつか組み合わせて単純に足し算して終わり、ということでもいいかもしれませんが、様々な波形を次々と出力するとなると面倒だったりします。そんなとき今回の記事のようなプログラムを作っておくと自由に構成できるので便利だと思います。
ここまで読んでいただきありがとうございました。
コメント