今回は高速フーリエ変換です。
高速フーリエ変換には、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引数で行き、帰りを指定しています。
ほぼ?元に戻っていますね。
ちなみに、周波数の解析範囲は、標本化定理により、サンプリング周波数の半分(ナイキスト)までです。