算術平均の高速算法

過去の信号入力を何点か平均して出力するフィルタを考えます。 図のようにN個の遅延を用いることで、現在の入力値からN個前の入力値までの和を 計算し、(N+1)で割ることで、(N+1)点平均を行うことができます。

このフィルタをDSPプログラムで実現する場合、そのままコーディングすると、 新しいサンプル値が入力される毎に、その値と、保存しておいた過去のN点分の 値を全て足し合わせる(N回の足し算を行う)必要があります。

この(N+1)点分の和を求める操作は、図に示す手法を用いると、 より効率的に行うことができます。

まず、時刻n-1でx(n-(N+1))~x(n-1)までの(N+1)点分の和S(n-1)が計算されていると します。次の時刻nで新たに計算すべき和S(n)はx(n-N)~x(n)までの(N+1)点分と なりますが、この値S(n)と一つ前に計算されているS(n-1)を比較してみると、 「S(n-1)から、それに含まれる最も古い値x(n-(N+1))を引き去って、代わりに 新たな値x(n)を加えると、S(n)となる」ことが分かります。S(n+1)を計算する 場合も同様に行うことができます。

すなわち、ある時刻において過去(N+1)点分の和を求めて保存しておけば、 その後の時刻における過去(N+1)点分の和は、保存してある和の値に対して、 順次「現在から(N+1)個前の値を引き算して、現在の値を足し算する」処理を 繰り返せば求められることになります。この場合、1ステップ当り必要な 演算回数は、N点平均を直接行う場合にN回の足し算が必要になるのに比べて、 1回の足し算と1回の引き算だけで済んでしまうため、プログラムの効率が 非常に良くなります。