Java Apache Commons Mathを使って、高速フーリエ変換する




今回は高速フーリエ変換です。
高速フーリエ変換には、Apache Commons Mathを使います。

Apache Commons Mathの入手

mavenを使って入手

pom.xmlは、こんな感じ。
今回はフーリエ変換なので、Apache Commonsの中でも「Apache Commons Math」が対象。

なかなか4.0は正式版が出ないねw

手動で入手

手動で入手するのであれば、以下のjarを入手することになります。
「Apache Commons Math」は依存関係がないので、手動でも簡単に手に入れられますね。
https://mvnrepository.com/repos/central

  • commons-math3-3.6.1.jar

※2023年11月現在です。

ちなみに、Apache License 2.0で提供されています。

Apache Commons Mathを使って、高速フーリエ変換するサンプル

220Hz,振幅=2と440Hz,振幅=3の正弦波を合成。
これをフーリエ変換して、周波数領域のデータを出力。
さらに逆フーリエ変換して、時間領域に戻してデータを出力します。

実行結果

作成したデータ、フーリエ変換した周波数領域のデータ、逆フーリエ変換した時間領域のデータが出力されます。
220Hzと440Hzでスパイクが出ています。

サンプルの解説

Commons MathのFastFourierTransformerクラスを使うと、(離散の)フーリエ変換が簡単にできます。
ただし、高速フーリエ変換ですので、扱えるのは2^nサイズのデータに限られます。

時間領域から周波数領域へのフーリエ変換(行き)は、
FastFourierTransformer#transform(double[], TransformType.FORWARD)
周波数領域から時間領域への逆フーリエ変換(帰り)は、
FastFourierTransformer#transform(Complex[], TransformType.INVERSE)
を使ってます。第2引数で行き、帰りを指定しています。
ほぼ?元に戻っていますね。

ちなみに、周波数の解析範囲は、標本化定理により、サンプリング周波数の半分(ナイキスト)までです。