FIR フィルタの高速化2006年04月21日 22:20

FIR フィルターパフォーマンス計測結果
[録音データ加工] のフィルタは、FIR フィルタです。
カイザー窓を使用した窓関数法で設計しています。
ほとんど
 http://cessna373.asablo.jp/blog/2006/01/27/228275
の 『ディジタル信号処理の基礎』 で書かれている方法そのままです。

このフィルタを適用するのに、V1.21 までは素朴に一つずつ適用していました。
短いデータに低次のフィルタをかける場合はそれでも問題ありませんが、長いデータ、高次のフィルタになると処理時間が問題になります。

そこで FFT を使用してフィルタを適用する方法を試してみました。上の表はその結果です。
今回は相対的な比較だけ行いますのでマシンスペックは書いていません。

さて結果については、まあ当然といえば当然ですが非常に大きな差がでています。
これが FFT の威力、さらにいえば O(n^2) と O(n*log2(n)) の差です。
(フィルタの場合はデータサイズを n, フィルター次数を m (m << n) としたとき O(n*m) と O(n*log2(m)) になります)

FFT を使用した新ロジックは次バージョンから採用することにします。
旧ロジックでも 100(s) のデータに 1000*2(deg) のフィルターを掛けてせいぜい数十秒なので、どれだけ恩恵があるかは不明ですが。
ついでに、需要があるかどうかは分かりませんが、せっかくなのでフィルタ次数(の半分)の最大値を 1,000 から 10,000 に変更することにします。

なお FFT を使用するこの方法は、データ全体にまとめてフィルタをかける場合に限り有効です。
リアルタイムにフィルタをかける場合は、やはり一つずつ適用していく必要があります。

FFT を使用する方法も前述の 『ディジタル信号処理の基礎』 に書かれていますが、この中では対象データ全体に一度に適用しています。
しかしそれでは余分なメモリが必要になりますし、実行速度も最適なものにはなりません。
データの分割に少し工夫が必要なのですが、その辺はまた別の機会に書くことにします。