今回はC言語ベースのFFTライブラリについて紹介します。音や画像などを処理する場合に欠かせない処理としてFFTがあります。1次元の場合はFFT処理で時間毎の信号を周波数ごとの信号に変換できます。1からFFT処理を実装するよりも多くの場合はライブラリを活用すると思います。今回は代表的なFFTライブラリを紹介したいと思います。
・ライセンス
GPL、商用ライセンス
・メリット
多次元対応
CPUの拡張命令によってより高速な処理が可能
マルチスレッド対応
・デメリット
GPLライセンス
専用ライブラリを組み込む必要がある
fotranコンパイラが必要
malloc使用
→組み込み系には向かない
・ライセンス
修正 BSD
・メリット
BSDライセンス
FFTWと互換インタフェース
多次元対応
fotranコンパイラ不要
・デメリット
全てのFFTW関数と互換があるわけではない
コード構成が複雑
malloc使用
→組み込み系には向かない
・ラインセンス
フリーソフトウェア
・メリット
コード構成がシンプルで移植が容易
CPUの拡張命令未使用で移植性が高い
マルチスレッド対応
malloc使用/未使用選択可能
組み込み系にも移植可能
・デメリット
CPUの拡張命令未使用で速度は期待できない
・ライセンス
Apache2.0
・メリット
ARM DSPを活用した高速処理
・デメリット
ARMDSP搭載マイコンのみ使用可能
ARMDSP専用で移植性が低い
サイズ最大4096点
PCアプリケーションで使用する場合はFFTSSやFFTSGがお勧めです。組み込み系の場合はFFTSGがお勧めです。
STM32マイコンでFPU搭載の場合、FFTSGとCMSIS-DSPライブラリで同じ処理点数で速度差はほとんどありませんでした。DSPを使用するCMSIS-DSPライブラリの方がハードウェア演算を利用するため、若干速くなります。
ただ、最適化されたFFTとFPUによってFFTSGも高速に処理できるため、あまり差がなくなっています。一方、CMSIS-DSPライブラリは最大4096点と用意されている関数の点数に制約があります。また、事前にVisualStudio等のコンソールアプリケーションとして単体テストしてからマイコンに移植するといった用途も考えるとFFTSGの一択となります。FFTSGのソースコードはdoubleとなっているため、STM32マイコン等に移植する際にはソースコード内のdoubleを丸ごとfloatに置換させるとFPUで高速に処理できるようになります。なお、FFTSGはサイズ最大4096点の制約がないものの、4096点以上の場合に膨大なRAMメモリが必要となります。高性能マイコンや外部RAM搭載マイコンが必要となります。