5 NumRu/fftライブラリ

5.1 特徴

 NumRu/fft ライブラリ(以下,本ライブラリ)は, C言語,あるいはFORTRANで記述された既存のライブラリを利用して実際の計算を行なう, ラッパーライブラリである.現在対応しているライブラリは,FFTW ライブラリである.今後, ISPACKに含まれる FTPACK ライブラリにも対応する予定である.本ライブラリをインストールする前に,これらのライブラリをインストールしておく必要がある.

 FFTW[11]は,"Fastest Fourier Transform in the West."の頭文字からとられた名前であることが象徴する様に,非常に優れた高速フーリエ変換ライブラリである.FFTWライブラリ自体は,C言語で記述されている.可搬性にも考慮がなされており,Rubyとほぼ同程度にあらゆるOSで使用する事ができる.但し,FFTWにはコサイン変換,サイン変換が存在しない.

 ISPACK[14]は,「主に簡単な流体方程式の数値計算に必要となる基本的な道具(スペクトル変換, 時間積分, IO, 等)をサブルーチン群としてまとめたもの」(石岡(2000)より引用)である.この中に含まれているFTPACKを使用する.ISPACKは,主にベクトル計算機上で使用されることを念頭においた設計となっている.しかし,個人利用の範囲内でも十分に高速である.

 FFTに対するRuby側の入出力として,NArrayクラスを採用している.田中(2000-2001)[9]によるとNArrayパッケージは,「多次元数値配列クラスです. 1,2,4 byte 整数,単/倍 精度 実数/複素数,およびRubyオブジェクトを要素に持つことができます.これによりRubyでも大量の数値を扱う計算が,簡単かつ高速にできるようになります.」とある.Ruby本体にも配列は存在し,多次元配列を構成する事は可能だが,データの要素一つ一つをオブジェクトとして構造体に包んでしまうため,演算の速度は著しく遅くなる.これを回避した仕様となっているのが,NArrayクラスである.

 これらのライブラリの仲立ちをし,Ruby上で使用できるようにしたものが,拙作「NumRu/fft」ライブラリである.本ライブラリはデータを整形して高速フーリエ変換ライブラリにデータを渡し,出力を再びRubyで扱えるものに整形しなおすというものであるので,実行速度は高速フーリエ変換ライブラリにほとんど依存している.

5.2 仕様

 本ライブラリは,以下の8つのクラスメソッドを提供する.

但し,このうち現在(ver. 0.0.2a),使用可能なメソッドは fft, ffti の二つである.

5.3 インストール方法

 インストール方法を述べる.本ライブラリは,Ruby拡張ライブラリの規則に従って作成されているため,環境に依存しない,容易なインストールが可能である.

  1. NumRu/fft パッケージをダウンロードし,任意のディレクトリに展開する.
    # tar xzvf numru_fft-0.0.2a.tar.gz
  2. 展開してできたディレクトリへ移動する.
    # cd numru_fft-0.0.2a/
  3. extconf.rb スクリプトを実行する.
    # ruby extconf.rb
  4. make コマンドを実行する.
    # make
  5. make install コマンドを実行する.
    # make install

5.4 使用方法

 現在のバージョンでは,NArray#fft(),NArray#ffti()で実行する事が可能である.しかし,次回リリースでは,fftの一連のメソッドはNumRuモジュールのモジュールメソッドになる予定である.

 参考として,以下本ライブラリに添付しているテストスクリプトの全文を示す.

require "narray"

if File.exist?("./fft.so")
  require "fft"
else
  require "numru/fft"
end

na=NArray.scomplex(100,100,100)
na[2,0..99,0..99]=1.0
na=na.fft(0)
na=na.fft(1)
na=na.fft(2)

na.ffti

nb=NArray.dcomplex(100,100,100)
nb[10,0..99,0..99]=1.0
nb=nb.fft(0,2)
nb=nb.fft(1)
nb.ffti(-1)

print "ok.\n"