P. N. Swartztaruber の FFTPACK は古くからあるライブラリィだが、 Java への移植である jfftpack (by Baoshe Zhang baoshe.zhang@uleth.ca) がある。
オリジナルの FFTPACK については、次の解説を書いた。
jfftpack をコンパイルして作った jfftpack.jar を載せておく。
次のテスト・プログラムを試そう。
/* * testfft.java * FFTPACK のJava版 jfftpack (http://www.netlib.org/fftpack/ で入手可) * http://www.math.meiji.ac.jp/~mk/labo/2007/jfftpack.jar に載せる * * jfftpack.jar の位置を環境変数 CLASSPATH で指定する。 * (1) Windows では set CLASSPATH=%CLASSPATH%;どこか\jfftpack.jar * (2) Linux では export CLASSPATH=$CLASSPATH:どこか/jfftpack.jar * * あるいは java コマンドの -classpath オプションを使う。 * java -classpath どこか/jfftpack.jar:. testfft * */ import ca.uol.aig.fftpack.*; public class testfft { public static void main(String args[]) { int i,n; double dx,x; double [] a; n = 1024; a = new double [n]; RealDoubleFFT myfft = new RealDoubleFFT(n); // n等分点上の関数値を求める dx = 2 * Math.PI / n; for (i = 0; i < n; i++) { x = i * dx; a[i] = 1+2*Math.cos(x)+3*Math.sin(x)+4*Math.cos(2*x); } // 離散Fourier変換 myfft.ft(a); // Fourier係数を求める a[0] /= n; for (i = 1; i < n; i++) a[i] = a[i] / (n / 2.0); // 1,2,3,4が現われますやら… for (i = 0; i < 10; i++) System.out.printf("i=%d: %f\n", i, Math.abs(a[i])); // System.out.println("i=" + i + ":" + Math.abs(a[i])); } } |
Knoppix の場合 |
knoppix$ tar xzf testjfftpack-unix.tar.gz knoppix$ cd testjfftpack-unix knoppix$ export CLASSPATH=/home/knoppix/testjfftpack-unix/jfftpack.jar:.あるいは export CLASSPATH=`pwd`:. knoppix$ javac testfft.java knoppix$ java testfft i=0: 1.000000 i=1: 2.000000 i=2: 3.000000 i=3: 4.000000 i=4: 0.000000 i=5: 0.000000 i=6: 0.000000 i=7: 0.000000 i=8: 0.000000 i=9: 0.000000 knoppix$ |
注 (2008/2/6 分かったこと): CLASSPATH を設定する 以外に、javac や java に -classpath jfftpack.jar:. と 指定するという手もある (短縮形 -cp jfftpack.jar:. も使える)。