Contents

Pastime

Contents

2011-05-22 スプライン補間とベジエ曲線をLispしてみる

前々からLispに触れてみたいと考えていた。ポール・グレアム氏の著書「ハッカーと画家」の影響である。そこには、Lispを学べば実際にLispプログラムを書くことがなくても良いプログラマになれると熱く語られていた。
しかし、いまいち踏み切れないでいる。いかんせん他のプログラミング言語と見た目が違う。
S式とかいうヘンテコな宣教師が「カッコカッコ...コッカコッカ」と呪文を唱えれば、カッコの奥からletとかいう控えめな教職者がlambda(ラムダ)とかいう名もない浮浪者に見返り(返り値)をねだってやがる。鬱陶しい奴らだ!
今日ではプログラミング言語も多様化し、しかもその多くがLispの特徴を取り入れつつある。わざわざこの古い言語に立ち返らなくても...という意識がどこかにある。プログラマでもないし。
とはいっても、アルゴリズムの勉強のついでに試してみるのもいい。そこで、視覚的に遊べそうなスプライン補間とベジエ曲線を題材にしてみた。
さて、これでLispの書籍を読んでもなんとかなるだろうか?


[ファイル構成]
spline_bezier.pdf : 詳細説明
spline.lisp       : スプライン補間
bezier.lisp       : ベジエ曲線
plot.bash         : プロット用スクリプト
spline.rb         : Ruby版(おまけ)

[試行環境]
Fedora14 + gnu clisp 2.49 + gnuplot 4.4.0
Win2K + Cygwin 1.7.9-1 + gnu clisp 2.48 + gnuplot 4.4.0
# gnuplotは、X環境が必要。

[使用例]
$ ./spline.lisp > spline.dat (スプライン曲線の座標生成)
$ ./bezier.lisp > bezier.dat (ベジエ曲線の座標生成)
$ ./plot.bash spline.dat     (曲線のプロット)




2008-05-03 ウェーブレット変換して遊ぶ

昔読んだ「これなら分かる応用数学教室」を読み返していると、なんとなくウェーブレット変換で遊びたくなった。gnuplotでrgbimageを試すのにも、ちょうどよい題材である。
ウェーブレット変換は、JPEG2000では、DCTの代わりに採用されいて、十年ほど前にかじった覚えがある。ウェーブレット解析の多重解像度分解は直感的に分かりやすい。関数を大まかに近似して、それと残りの部分とに分ける。その近似を更に近似と残りの部分とに分ける…といったことの繰り返し。そこに難しい理論は存在しない。こうした簡単な概念の歴史は意外と浅いことに驚かされる。その手順は、スケーリング関数を平行移動しながら次々と近似し、信号を線形結合する。 そして、次第にスケーリング関数の幅を広げて荒っぽく近似していく。その時の誤差成分を管理するのがウェーブレット関数である。
ここで重要なのは、スケーリング関数とウェーブレット関数が直交関係にあること。しかも、ウェーブレット関数は、その幅が広がっていく各段階(レベル)においても、直交基底を作っている。こうした互いの性質を持つ関数の組み合わせは、ハール関数のような実に簡単な特性で実現できるところにウェーブレット解析の凄さがある。信号解析でよく用いられるフーリエ解析が、周波数領域で時間的な情報が失われるのに対して、ウェーブレット解析では時間的周波数解析が可能である。ウェーブレット解析とは、どの場所(空間情報)でどれだけのスケール(周波数情報)の振動があるかを同時に指定するものである。


[ファイル構成]
wavelet.pdf : 詳細説明
wavelet.lzh : ファイル一式

[試行環境]
Win2K + Cygwin 1.5.25-11 + Octave 2.1.73 + gnuplot 4.2.3
Fedora8 + Octave 3.0.0 + gnuplot 4.2.2
# gnuplotは、X環境が必要。

!!! 注意 !!!
Fedora8でwxWidgetsをインストールしていると、gnuplotのTerminal typeがdefaultで'wxt'になる。
ちなみに、Cygwinのデフォルトは、'x11'。とりあえず一緒にするために“set terminal x11" を指定している。

[使用例]
1.DWT/IDWTの実行
  $ ./test_dwt2d.m -64 sample64x64.dat (二次元ウェーブレット変換の実行)

2. データの表示
  $ ./graph_rgb.bash sample64x64.dat (サンプル画像の表示)
  $ ./graph_rgb.bash dwt2d.dat       (DWTの結果表示)
  $ ./graph_rgb.bash idwt2d.dat      (IDWTの結果表示)






2008-04-06 フーリエ変換して遊ぶ

W.ダンハム著「オイラー入門」を読んでいると、なんとなくフーリエ変換が懐かしくなったので遊んでみた。
フーリエ変換は、関数を周波数スペクトルに分解する。その解析では、正弦関数と余弦関数の合成によって、任意の関数を作ることができることを利用する。ここで重要なのは、正弦関数と余弦関数は互いに直交するということ。関数の直交関係は、複素平面へ持ち込むことができ、オイラーの公式やド・モアブルの定理など数学的道具が有効となる。
ただし、フーリエ解析は、周期関数を仮定した概念であり、任意の関数に当てはめるには、特定の区間を周期関数として捉える必要がある。そこで問題になるのが、現実の世界では、通常非周期成分が含まれノイズ成分として現れることである。非周期性や不連続性のノイズ成分を除去するために、いろいろな窓関数が考案されている。


[ファイル構成]
fourier.pdf : 詳細説明
fourier.lzh : ファイル一式

[試行環境]
Win2K + Cygwin 1.5.25-11 + Octave 2.1.73 + gnuplot 4.2.3
Fedora8 + Octave 3.0.0 + gnuplot 4.2.2
# gnuplotは、X環境が必要。

!!! 注意 !!!
Fedora8でwxWidgetsをインストールしていると、gnuplotのTerminal typeがdefaultで'wxt'になる。 ちなみに、Cygwinのデフォルトは、'x11'。とりあえず一緒にするために“set terminal x11" を指定している。

[使用例]
1. 波形データの生成と表示
  $ ./make_wave.m (矩形波, デルタ関数, FM変調などを生成)
  $ ./graph_wave.bash square.dat (矩形波を表示)

2. DFT処理と結果表示
  $ ./dft_my.m square.dat
  $ ./graph_dft.bash

3. FFT処理と結果表示
  $ ./fft_my.m square.dat
  $ ./fft_oct.m square.dat (Octave関数を使用)
  $ ./graph_fft.bash

4. フィルタ処理と結果表示 (おまけ)
  $ ./filter.m
  $ ./graph_filter.bash




2007-05-01 Octaveで遊ぶ

Octave はフリーの数値演算言語で、Matlabと似通ったコマンドインターフェースを持つ。
(本家はこちら http://www.gnu.org/software/octave/)

正弦関数をテーブル近似して遊んだ。

鈴木昌治著「ディジタル数値演算回路の実用設計」を読んでいると、回路実装イメージをシミュレーションして遊んでみる気になった。本書では、逆数関数を直線補間により、テーブル近似する方法を述べているが、ここでは正弦関数で試してみる。
実用という意味では少々問題があるが、手軽に遊べる材料を与えてくれたことに感謝したい。


[ファイル構成]
sim_sin.pdf    : 詳細説明
make_table.m   : テーブル生成
sim_sin.m      : sin関数シミュレーション
graph_sin.bash : グラフ表示

[試行環境]
Win2K + Cygwin 1.5.24-2 + Octave 2.1.73 + gnuplot 4.0
Fedora core 6 + Octave 2.9.9 + gnuplot 4.0
# gnuplotは、X環境が必要。

[使い方]
1. テーブルファイル table.datを生成する
  $ ./make_table.m

2. sin関数シミュレーション結果ファイルsin.datを生成する。
  $ ./sim_sin.m

3. 結果をグラフ表示する。
  $ ./graph_sin.bash -t  (テーブルをグラフ表示する)
  $ ./graph_sin.bash -g1 (一次補間した時の誤差をグラフ表示する)
  $ ./graph_sin.bash -g2 (ニ次補間した時の誤差をグラフ表示する)
  $ ./graph_sin.bash -f1 (一次補間した時のsin関数をグラフ表示する)
  $ ./graph_sin.bash -f2 (ニ次補間した時のsin関数をグラフ表示する)




2006-12-29 ヒルベルト曲線で遊ぶ

Henry S. Warren, Jr著「ハッカーのたのしみ」を読んでエレガントなコードに魅せられた。しかし、全部を理解することは生涯かけても無理だろう。
自分自身の馬鹿さ加減に呆れて、その腹いせにヒルベルト曲線でも作って遊ぶしかない。ヒルベルト曲線とは全ての点において連続でかつ微分不可能という、なんとも酔っ払ってしまいそうな世界である。


[ファイル構成]
hilbert.c    : 本体
hilbert.bash : プロット用スクリプト

[試行環境]
Win2K + Cygwin 1.5.21-1 + gcc 3.4.4 + gnuplot 4.0
Fedora core 5 + gcc 4.1.1 + gnuplot 4.0
# gnuplotは、X環境が必要。

[使い方]
gcc hilbert.c -o hilbert (実行ファイルの作成)

hilbert.bash [dimension] (ファイルの実行)
# dimension : 次元数の設定 1, 2, 3, ...
# グラフ内のデータ領域をクリックすると終了。

(例)
$ ./hilbert.bash 5
# dimensiotn = 5 を指定した例 (下図)。




2006-08-14 Libtiffで遊ぶ

Libtiffは、Tiff画像ファイルを操作するためのC関数のライブラリである。
(本家はこちら http://www.libtiff.org/)
Libtiffは、TIFFフォーマットを意識せずに画像情報の取得または保存といった操作が容易に行える関数を用意している。
これらの関数を使って以下を試してみた。

  • tiffファイルから、RGBデータを取得する手順
  • RGBデータから、tiffファイルを生成する手順
  • tiffファイルから、YCbCrデータを取得する手順
  • YCbCrデータから、tiffファイルを生成する手順
  • tiffファイルから、2値データを取得する手順
  • 2値データから、tiffファイルを生成する手順

libtiff.pdf: 詳細説明




2006-07-31 Jpegで遊ぶ

Jpeg とビットマップの画像変換プログラムを作って遊んだ。
DCTの実装には、デジタル回路にも実装可能な Chen の高速アルゴリズムを採用。
エントロピー符号化には、ハフマン符号(2AC,2DCテーブル)を使用。


[bmp から jpeg へ変換する処理手順]
1. bmpファイルからRGBデータを取得する。
2. RGB / YCbCr 変換を行う。
3. 8 × 8 DCT演算を行う。
4. 量子化を行う。
5. ハフマン符号化を行う。
6. Jpeg マーカを付加して Jpeg ファイルを生成する。

[Jpeg から bmp へ変換する処理手順]
1. JpegファイルからYCbCr(YUV)データを取得する。
2. ハフマン復号化を行う。
3. 逆量子化を行う。
4. 8 × 8 IDCT演算を行う。
5. YCbCr / RGB 変換を行う。
6. bmp ヘッダを付加して bmp ファイルを生成する。

[試行環境]
Win2K + Cygwin 1.5.7-1 + gcc3.3.1
Fedora core 3 + gcc3.3.1
Solaris 8(Intel) +  gcc3.4.0
Solaris 8(SPARC) +  gcc2.95.2

jpeg2bmp.pdf: 詳細説明


ソースの欲しい方は...


0 コメント:

コメントを投稿