Paul N. Swarztrauber の FFTPACK は古くからあるライブラリィだが、 Java への移植 jfftpack (by Baoshe Zhang [email protected]) がある。
FFTPACK については、マニュアルの邦訳 「FFTPACK」 を用意してある。
卒研では、サンプル・プログラム testjfftpack-unix.tar.gz, testjfftpack-win.lzh を用意した。
knoppix$ tar xzf testjfftpack-unix.tar.gz knoppix$ cd testjfftpack-unix knoppix$ javac -cp jfftpack.jar testfft.java knoppix$ java -cp jfftpack.jar:. testfft |
1 /* 2 * testfft.java 3 * FFTPACK のJava版 jfftpack (http://www.netlib.org/fftpack/ で入手可) 4 * http://www.math.meiji.ac.jp/~mk/labo/2007/jfftpack.jar に載せる 5 * 6 * jfftpack.jar の位置を環境変数 CLASSPATH で指定する。 7 * (1) Windows では set CLASSPATH=%CLASSPATH%;どこか\jfftpack.jar 8 * (2) Linux では export CLASSPATH=$CLASSPATH:どこか/jfftpack.jar 9 * 10 * あるいは java コマンドの -classpath オプションを使う。 11 * java -classpath どこか/jfftpack.jar:. testfft 12 * 13 */ 14 15 import ca.uol.aig.fftpack.*; 16 17 public class testfft { 18 public static void main(String args[]) { 19 int i,n; 20 double dx,x; 21 double [] a; 22 n = 1024; 23 a = new double [n]; 24 RealDoubleFFT myfft = new RealDoubleFFT(n); 25 // n等分点上の関数値を求める 26 dx = 2 * Math.PI / n; 27 for (i = 0; i < n; i++) { 28 x = i * dx; 29 a[i] = 1+2*Math.cos(x)+3*Math.sin(x)+4*Math.cos(2*x); 30 } 31 // 離散Fourier変換 32 myfft.ft(a); 33 // Fourier係数を求める 34 a[0] /= n; 35 for (i = 1; i < n; i++) 36 a[i] = a[i] / (n / 2.0); 37 // 1,2,3,4が現われますやら… 38 for (i = 0; i < 10; i++) 39 System.out.printf("i=%d: %f\n", i, Math.abs(a[i])); 40 // System.out.println("i=" + i + ":" + Math.abs(a[i])); 41 } 42 }
[chronos:sound/sound/jfftpack] mk% 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 [chronos:sound/sound/jfftpack] mk% |
無事に , , , , 0, となりました。