2013年8月14日水曜日

Octaveでゆらぎ

とあるグラフィックプログラミングフレームワークで星のきらめきというか、瞬きというようなものを表現したいなぁ、と考えていて、その星の瞬きをもたらす「大気の揺らぎ」をどうやったら表現できるか考えていました。

揺らぎというのはいろいろな物理現象に見られる、物理量の平均値からの変動(分散)のことだそうです。いわゆる1/fゆらぎと呼ばれる、周波数に反比例するスペクトルを示す揺らぎが、自然現象で多く観測されるというのが有名です。

離散的に表現できる数式さえわかってしまえば、あとはプログラムに組み込むのはやっつけ仕事です。ただ、描画ループに組み込んで毎フレーム計算することは、場合によってはパフォーマンス低下につながります。そのためプログラム起動時にあらかじめ計算したテーブル(配列)を用意しておき、描画ループでは時刻をインデックスにしてそれを読み出すに留めます。

そこで、あらかじめどんなテーブルを作るか、グラフにプロットして確認したいと思います。

Octave、という数値解析ソフトがあります。同様のソフトではMATLABが有名ですが、OctaveはGNUプロジェクトによりフリーソフトウェアとして提供されています。WindowsやMac向けには、ここからインストーラがダウンロードできます。

昔、大学の信号処理の講義で触って以来使うことがなかったので、今回は数年ぶりの復習となりました。なので、下記は操作学習メモまで。

なおOctaveの操作方法はこちらのページでわかりやすく説明されています。 今回ヘビーローテで拝見させていただきました。

Octaveのコンソールを起動したら、まずは関数定義します。関数はこちらのページの記述を参考にしました。


nは元ページの数式で言うところの10、Σによる総和の回数です。 
一行ごとに改行を打ち込みます。一つ目のendでforループが閉じ、二つ目のendで関数が閉じたところで、次のコマンドのプロンプトになります。

次にx軸の入力値のベクトルを作ります。


piは円周率のπです。上記はマイナスπからプラスのπまでの間を0.02ずつとるベクトルになります。こうして一度定義された変数は、コマンドラインを終了するか、clearコマンドを入力するまで有効です。このxxを先に定義したfluc関数に入力して、計算結果のベクトルを得ます。


これでyyに計算結果が入りました。では、二次元グラフにプロットしてみます。



でけたー。gnuplotによるグラフが得られました。

こんな感じで実際の揺らぎ感が確認できます。

もう少しパラメータをいじりながら、いい感じの揺らぎ感を見つけたいですな (`・ω・´)

0 件のコメント:

コメントを投稿