信号処理について

こんにちは、NAKAといいます。

アナログデータ(NEW_DATA)取得毎に簡単なローパスフィルタをかけたくて移動平均処理(AVE_DATA)をしてました。
※下の例では16個(固定)の移動平均としています。

今までは、
      【方法A】
      DATA[DATA_COUNT] = NEW_DATA;
      DATA_COUNT++;
      DATA_COUNT %= 16;
      ADD_DATA = 0;
      for(ii=0; ii<16 ;ii++)
      {
       ADD_DATA = ADD_DATA + DATA[ii];
      }
      AVE_DATA = ADD_DATA >> 4;


のように毎回LOOPで加算して平均してたのですが、なんか無駄のような気がして
今日電車の中でバッファを新しいデータではなくて次に消去するデータにしたら
いいような気がして


次のようにしました。
      【方法B】
      ADD_DATA = ADD_DATA - DATA[DATA_COUNT];
      DATA[DATA_COUNT] = NEW_DATA;
      ADD_DATA = ADD_DATA + NEW_DATA;
      DATA_COUNT++;
      DATA_COUNT %= 16;
      AVE_DATA = ADD_DATA >> 4;

質問①【方法B】の方が処理的には早くなるのでしょうか?
質問②移動平均するのにもっと効率的な方法があるのでしょうか?

よろしくお願いします。

  • In reply to NAKA:

    NAKAさん、どんな仕様なのかわかりませんが
    16個のバッファを使用するのも手ですが
    long sum=0;
    long count=0;
    void ad_irq(void)
    {
    sum+=(long)ad & 0x3FF;
    count++;
    }
    long get(voud)
    {

    long value;

    value=sum/count;

    sum=0;
    count=0;

    return value;
    }
    にすれば、速度も速いし、変数も少ないのでは