算術平均の高速算法


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

Simple Implementation
算術平均の直接実現

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

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

Fast Implementation
算術平均の高速算法

まず、時刻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回の引き算だけで済んでしまうため、プログラムの効率が 非常に良くなります。


[戻る 8.1.7 自動音量調整] [Top]

(作成: 2000年7月19日, 最終更新: 2000年10月31日)