この記事で扱っていること
- 波の重ね合わせで図形を作る方法
を紹介しています。
注意:すべてのエラーを確認しているわけではないので、記事の内容を実装する際には自己責任でお願いします。また、エラー配線は適当な部分があるので適宜修正してください。
高校の数学で習う範囲で、周期関数であれば、サイン波、コサイン波の重ね合わせだけで表せてしまう、という理屈を知らないと「本当にそんなことできるの?」と疑ってしまうような不思議な話があります。
いわゆるフーリエ級数展開を行うことでそのサイン波、コサイン波の成分を抽出できるのですが、それをLabVIEWで実施することによって、本当に波の重ね合わせで周期関数を表現できるということを体験するためのプログラムを作りました。
どんな結果になるか
フロントパネルにはコサイン成分、サイン成分を表示する波形グラフ、そして元の図形と波の重ね合わせで表現された図形を表示する波形グラフ、およびどの程度の波を重ね合わせるかを指定する数値制御器を配置しています。

波の重ね合わせ数(Mとしています)の数を増やすことで、徐々に「元の図形」に「重ね合わせ」の結果が近づく様子がわかると思います。

いくつかの有名な波形、三角波や方形波でもMをある程度大きくすればそれなりに図形を再現できます。

プログラムの構造
プログラムでは、表現したい元の図形の範囲を1周期分(わかりやすさのために度数法でいう1回転である360個のデータ点)にリサンプルし、そこに対してフーリエ級数展開でおなじみの、特定の周期のコサイン波、サイン波を掛け合わせています。

前半部分がリサンプルです。
真ん中の、Forループが使われている部分で、元の図形のx成分を0から1の範囲になるようにx配列を作っています。
そして元の図形を構成するデータ点が毎回違ってもリサンプルできるように、ランプパターンの関数を使って、0から1までの値を360等分した値を用意しています。
これらを1D補間の関数に渡せば、0から359までの360点分のx値で元の図形を表現することができます。

あとはこの図形を構成する配列値(1D補間の関数の出力としてはY値配列ということになりますが)を使ってコサイン波、サイン波それぞれで計算をしていきます。
今回は元の周期関数の具体的な値がわからないという前提で、離散的なフーリエ級数展開を行っています。
具体的な式の形は記事後半で式を紹介しています。

二つあるサブviはやっていることがほぼ同じで、中で使っている関数がコサインかサインかの違いだけです。
周期が(2πnk)/Nであるコサインあるいはサインに対してkの値を0からN-1まで変えて足し合わせ、これを2/Nで割っています。
下の図はdiscrete cosine component mod.viの中身ですが、discrete sine component mod.viはForループの中身をCosine関数ではなくSine関数にするだけです。

離散フーリエ級数展開の形
一般的なフーリエ級数展開の話(積分で表される式)は今回は割愛します、調べれば簡単に出てくると思いますし。
例えば高校の「数学の問題」で扱う場合には、元の周期関数f(x)の式の値がわかっていると思いますが、今回はその具体的な式の形は不明で、f(x)を構成する各点、つまりf(0)やf(1)の値がわかっている、という前提としています。
f(x)の具体的な形がわからないと積分で計算することはできないので、代わりに離散的な処理に置き換える必要があり、その式の形が以下に示したものです。
以下ではa_nつまりコサインの係数しか載せていませんが、b_nはcosの部分をsinにするだけです。

本記事では波の重ね合わせで図形を作る方法を紹介しました。
教育の場で扱うような内容も、実際にプログラムを作って視覚的に見えるようにすることで理解が深まることと思います。
数学的な演算およびその結果の図示にもLabVIEWは使えるので、普段とは違ったビジネス寄りの用途以外の使い方としても参考になればうれしいです。
ここまで読んでいただきありがとうございました。

コメント