Android/JavaでFFT(高速フーリエ変換)

TOP > Androidアプリ開発日誌 >  Android/JavaでFFT(高速フーリエ変換)
このエントリーをはてなブックマークに追加

AndroidでFFT(高速フーリエ変換)

 Android sdk にはフーリエ変換のライブラリが標準で(API Level 9 より android.media.audiofx.Visualizer)ついています。 また、apache.common.mathなどの数学ライブラリも有名でよく使用されています。フーリエ変換の説明は割愛しますが、FFT(高速フーリエ変換)はデータの個数を2のべき乗にすることで高速化を実現するアルゴリズムで音声・画像・信号処理に多く用いられます。 Java 以外では フリーソフトウェアの中ではもっとも高速といわれるFFTWが特に有名です。

Parallel Colt

 Parallel Colt とは、CERN(欧州原子核研究機構)Colt Project で開発されたJavaによる科学技術計算のためのライブラリをマルチスレッド化したもの。データ解析、線形代数、多次元配列、フーリエ変換、統計解析などを高速に行う事ができる数値計算ライブラリです。このなかでフーリエ変換まわりのみ使用する場合は JTransforms のみを使用する事ができます。

JTransformsの利用方法

JTransform のインポートJTransformsのjarファイルをダウンロードし、②ダウンロードしたjarファイルをインポートしてください。

AndroidでFFT(1次元の高速フーリエ変換)

package jp.mediawing.android.test2;

import android.app.Activity;
import android.os.Bundle;
import java.math.*;
import android.content.Context;
import android.graphics.Canvas;
import android.util.Log;
import android.view.View;
import java.io.IOException;
import android.content.Context;

import edu.emory.mathcs.jtransforms.fft.DoubleFFT_1D;

public class MainActivity extends Activity {

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		int FFT_SIZE = 8 ;
		double[] data ;
		data = new double[FFT_SIZE];

		// オリジナルデータを出力
		for ( int i=0; i<FFT_SIZE; i++ )
		{
			data[i] = 10.0 + i ;
			Log.d("ORG", "i=" + i + " val=" +data[i] ) ;
		}

		DoubleFFT_1D fft = new DoubleFFT_1D(FFT_SIZE) ;

		// フーリエ変換(FFT)の実行
		fft.realForward(data);
		// data[0]は実数成分、data[1]は虚数成分~data[n]は実数成分、data[n+1}は虚数成分
		for ( int i=0; i<FFT_SIZE; i++ )
		{
			// フーリエ変換後のデータを出力
			Log.d("FFT", "i=" + i + " val=" + data[i] ) ;
		}

		// 逆フーリエ変換
		fft.realInverse(data,  true) ;
		for ( int i=0; i<FFT_SIZE; i++ )
		{
			// 逆フーリエ変換後のデータを出力
			Log.d("IFFT", "i=" + i + " val=" + data[i] ) ;
		}
	}

}

Log.d の出力結果

オリジナルデータを
出力
タグテキスト
ORGi=0 val=10.0
ORGi=1 val=11.0
ORGi=2 val=12.0
ORGi=3 val=13.0
ORGi=4 val=14.0
ORGi=5 val=15.0
ORGi=6 val=16.0
ORGi=7 val=17.0
フーリエ変換後の
データを出力
タグテキスト
FFTi=0 val=108.0
FFTi=1 val=-4.0
FFTi=2 val=-4.0
FFTi=3 val=9.6568
FFTi=4 val=-4.0
FFTi=5 val=4.0
FFTi=6 val=-4.0
FFTi=7 val=1.6568
逆フーリエ変換後の
データを出力
タグテキスト
IFFTi=0 val=10.0
IFFTi=1 val=11.0
IFFTi=2 val=12.0
IFFTi=3 val=13.0
IFFTi=4 val=14.0
IFFTi=5 val=15.0
IFFTi=6 val=16.0
IFFTi=7 val=17.0