忍者ブログ

Memeplexes

プログラミング、3DCGとその他いろいろについて

データをたくさんの波に分解する(かんたんフーリエ変換)

これまで見てきたように、単純な波をたくさん重ね合わせると複雑な形になります。では逆に、複雑な形を単純な波たちに分解することは出来ないでしょうか?実際それは可能で、フーリエ変換と呼ばれています。ここでは、その分解方法をかんたんに解説します。


一か所だけとがった図形を作る

単純な波を組み合わせて複雑な図形を作るというのは想像しにくいかもしれません。しかし、考え方を少し変えてみるととてもかんたんです。

複雑な機械を単純な部品から一度に組み上げるのは難しいものです。月ロケットをネジや金属板やコードの山から一気に組み立てろと言われると、作業の複雑さに気が滅入ります。そこで人は仕事を分割します。単純な部品から、少しだけ複雑な部品を作って、それらを組み立ててもうちょっと複雑な部品を…と繰り返すのです。これなら一つひとつの作業はかんたんなので、ミスを減らせるでしょう。

ここでも同じようなことをします。単純な波から一気に複雑な図形を作るのではなく、少しだけ複雑な図形を作って、それらを後で組み立てることにします。私達が作る中間の図形はこれです:

ここで作ったのは、一か所だけとがった図形です。ほかは全部平らです。これをレゴブロックのように組み合わせてより複雑な図形を作るのです。(とがった部分は、上の波たちの中央の山が重なり合ってできています。その他の部分は山と谷がきれいに打ち消し合って平地になっているわけです)

※ところで、この図の波がカクカクしていることが気になったかも知れません。本物の波(灰色)はなめらかなのに、どうしてここでは直線で描いているのでしょう?それはこれがコンピュータで使う波だからです。私達は画面に表示される波がスムーズだと思いがちですが、実際には画面を虫眼鏡で拡大してよく見ると小さな四角(ピクセル)の集合体です。気づかないほど細かいカクカクなのです。この図は、それを拡大したのだと思ってください。本物の波は曲がりくねっていますが、ある間隔でデータを取り出すと、一か所だけとがって後は平らな図形になるのです。

合体させる

この図形を、横にずらしたり大きさを拡縮したりして重ね合わせます。そうすると、どんな複雑な図形でも作れるわけです。いわば家を作るためのレンガです。

HELLOという文字のつもりです。これは1次元データなのでH、E、Oが潰れていますが、2次元で同様のことをやると、ちゃんときれいにHELLOと表示されます。

実際、コンピュータの画像ファイルにはこの方法の亜種でデータを保存しているものが多いです。ファイルには本当は波のデータが入っていて、開くとそこから画像を再構成します。これにはメリットがあり、弱い波を消すとデータを圧縮できるのです。すると代償としてオリジナル画像と微妙に違う画像が再構成されてしまうわけですが、どうせ人の目はいい加減なので構いやしません!

デモ

次のプログラムは複雑な図形を単純な波に分解するデモです。黒い線で囲ったキャンバスをマウスでクリックしてみてください。図形が描かれ、それが単純な波に分解されて上に表示されます。

拍手[1回]

PR