学問の小部屋

ここは学問の黒板です。

FIRフィルタの計算効率調査

音声信号処理で多用されるFIRフィルタは、時間領域での積和演算で畳み込む方法と、信号をFFTして周波数空間でかける方法がある。
この2つの方法は等価な結果を生むが、計算コストは違う。
一般には低いtapsでは時間領域での計算の方が効率的であり、tapsが多くなるほどFFTの方が効率的になるとされており、今回参照するmatlabのサイトでもそのような結果が出ている。
そこで、よく使われるFIR係数のtap数によって、どの程度計算コストが変わるのかを調査した。

http://jp.mathworks.com/help/signal/ref/fftfilt.html

の記事を参考に、matlab R2014を使用してシミュレーションした。
試験用信号は48kHzfsのランダム信号10s分とし、FIRのtapsは64-2048まで2のべき乗ステップで計算を実行し、実行時間を評価した。
テスト環境はwindows7 ultimate 64bit, DDR3 32GBである。
はじめ試験用信号を短いサンプル数でテストしたところ、実行するごとに結果が大きく変わり誤差が大きいことがわかったので、10s分の信号を生成して誤差の少ない結果になるようにした。
シミュレーション結果は、512tapsあたりからFFTの方が効率的となり、1024tapsでは実行時間に2倍以上の差が出ていることがわかる。
ただ、FFTの結果はtapsが大きくなるほど実行時間が短くなるという結果が出ており、正確な計測ができているかをよく吟味する必要がある。

以上の結果から、

・時間領域での畳込みは512tapsまでと考え、それ以上のtapsを使用する際はFFTを使った方がよい。
・ただし、
http://www.ari-web.com/service/soft/reverb-4.htm
にて指摘されているように、リアルタイム演算でFFTのレイテンシが不具合につながる場合には、長いtapsをそのままFFTで計算するわけにはいかない
・よって、オフライン処理の場合は以上の考察を利用できるが、リアルタイム処理に適用するときはさらなる工夫が必要になることもある。