今回は高速正弦変換、高速余弦変換を見ていきます。
実変換 RealTransformer
正弦/余弦変換は、フーリエ変換と異なり実関数を実関数へ変換する実変換 (Real Transform) です。 したがって、変換の返り値は double の配列で、引数にとれるのは double の配列もしくは(1変数)実数関数を表す型 UnivariateRealFunction です。commons-math には実変換を表すインターフェース RealTransformer が定義されていて、高速正弦/余弦変換を表すクラス FastSineTransformer/FastCosineTransformer はこのインターフェースを実装しています:
package org.apache.commons.math.transform; public interface RealTransformer{ double[] transform(double[] f); double[] transform(UnivariateRealFunction f, double min, double max, int n); double[] inversetransform(double[] f); double[] inversetransform(UnivariateRealFunction f, double min, double max, int n); }
使い方は FastFourierTransformer (こちらを参照)とだいたい同じです:
- FastSineTransformer / FastCosineTransformer クラスのインスタンスを生成する
- transform() / inversetransform() メソッドで変換を実行する
引数の配列(もしくはサンプリングする数)はやはり2の累乗でなければなりません(FastSineTransformer の場合*1)。 Groovy でのサンプルコードはこんなの:
import org.apache.commons.math.transform.FastSineTransformer import org.apache.commons.math.analysis.UnivariateRealFunction int n = 2**8 def f = { double x -> Math.random() } as UnivariateRealFunction // 1. インスタンス生成 def trans = new FastSineTransformer() // 2. 変換の実行 def Fn = trans.transform(f, -1d, 1d, n)
高速フーリエ変換を表すクラス FastFourierTransformer もそうだけど、いちいちインスタンス化して使わないといけない仕様なのが謎。 そんな大した手間ではありませんが。
ともかく、高速正弦/余弦変換をそれぞれ簡単に見ていきましょう。
高速正弦変換 FastSineTransformer
まずは高速正弦変換。 これは正弦関数 の直交関係をベースにしています。 別に知らなくてもいいかもしれませんが・・・ まぁそれはともかく、FastFourierTransformer と同様、FastSineTransformer にも変換メソッドが2種類定義されています:
- transform() / inversetransform()
- transform2() / inversetransform2()
これらはやはり規格化だけの違いです。
transform() / inversetransform()
transform() :
inversetransform() :
transform2() / inversetransform2()
transform() :
inversetransform() :
高速余弦変換 FastCosineTransformer
次は高速余弦変換。 こちらもほとんど FastFourierTransformer や FastSineTransformer と同じです。 ただし、引数の double の配列は2の累乗 + 1 でないといけないので注意。transform() / inversetransform()
transform() :
inversetransform() :
transform2() / inversetransform2()
transform() :
inversetransform() :
- 作者: 森口繁一,一松信,宇田川〓久
- 出版社/メーカー: 岩波書店
- 発売日: 1987/03/13
- メディア: 単行本
- この商品を含むブログ (5件) を見る
*1:FastCosineTrasformer の場合は2の累乗+1でなければなりません。