Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page

信号処理について

こんにちは、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】の方が処理的には早くなるのでしょうか?
質問②移動平均するのにもっと効率的な方法があるのでしょうか?

よろしくお願いします。

  • NAKAさん
    ノイズのある環境ではファイルタは重要ですよね
    http://bluefish.orz.hm/sdoc/fftw_digifil.html#
    は参考にはなりませんでしょうか

  • わわいです
    そりゃBのほうがループ回さんで済む分早いですねー
    オイラがするときには、最後の
    > AVE_DATA = ADD_DATA >> 4;
    を省いて、ADD_DATAそのままで16ビット値として扱ったりしますな
    #12bitA/Dの場合ですが
  • In reply to わわい:

    速度はBの方が早いのではないですか
    もっとわかりやすくなりませんかー

    データ列がありその中の16個の移動平均をしながら出力する?

    速度が遅いので早くできないか?

     for(ii=0; ii<16 ;ii++)
          {
           ADD_DATA = ADD_DATA + DATA[ii]; 
          }
          AVE_DATA = ADD_DATA >> 4;

    単にここだけなら

    (DATA[0]+DATA[1]+DATA[2]+DATA[3]+DATA[4]+DATA[5]+DATA[6]+DATA[7]+DATA[8]+DATA[9]+DATA[10]+

    DATA[11]+DATA[12]+DATA[13]+DATA[14]+DATA[15])>>4

    にすれば早くならないかな?

    コンパイルされた時点で同じことかな?

    【方法B】
          ADD_DATA = ADD_DATA - DATA[DATA_COUNT];

    加算しておいたものを捨てずに使うんだ、なるほど

  • チョコです。
    同じようなことをサンプルプログラム等のIICスレーブ関係のプログラムでやっています。
    ただし,通常のループでは,合計値だけにしておき,読み出すときに割るだけにしています。
    これ以外に,回数ごとのデータは保存するとメモリを消費しすぎるので,合計値のみを保存
    しておき,合計値から平均値を引いて,新たな値を加算する方法を考えたこともあります。
    この方法では,誤差が蓄積していくので,ある周期で初期化する必要があり,その処理が
    面倒で採用はしませんでしたが。
    2016年までにpostした分は初期値を0として開始していましたが,2017年のR5F10Y16での
    ソフトウェアによるI2Cバススレーブでは,1回目の変換結果で埋めることで移動平均の回数
    より早いタイミングで読み出しても大きくずれないようにしています。

    RL78/G13で,IICA0のスレーブでの例(4チャネル16回)
    japan.renesasrulz.com/.../296

    RL78/G10で,ソフトウェアでのスレーブの例(2チャネル4回)
    japan.renesasrulz.com/.../388
  • In reply to チョコ:

    チョコさんの
    1.通常のループでは,合計値だけにしておき,読み出すときに割るだけにしている
    2.回数ごとのデータは保存するとメモリを消費しすぎるので,合計値のみを保存
    しておき,合計値から平均値を引いて,新たな値を加算する方法を考えたこともあります。
    なるほど
    3.1回目の変換結果で埋めることで移動平均の回数より早いタイミングで読み出しても大きくずれないようにして
    います。
    なるほど、

  • In reply to IKUZO:

    【方法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;//シフトして平均
    実際やってみるとどうなるのかな、ADD_DATA の初期値は【方法A】で入れるのかな

    チョコさんの方法で一回目のデータで埋める?

  • In reply to IKUZO:

    余談ですが、私の方法は移動平均ではないですが、確率グラフみたいなものでやっています、
    結構いいですよ、一定時間で、同じ数値が現れた回数を、記憶しておき、一番多いものを採用します。
  • In reply to IKUZO:

    チョコです。
    最頻値ですか。面白いですね。
    安定した状態では使えそうですが,増えていくときや減っていくときの値をどうするか気になりますね。
  • In reply to チョコ:

    みなさん反応ありがとうございます。 NAKAです。

    >合計値から平均値を引いて,新たな値を加算する方法を考えたこともあります。
    ⇒ははっ!同じことを考えたことがありますがフィルタの特性が変わってきちゃいますので

    4or8の移動平均で高周波をとって、32or64の移動平均との差分を取ることで、DCカットっぽい値になるのかなぁ~と思ってます。こうしたデータをリアルタイムでモニタ&保存してます。効率がいいフィルタ関数なんかがあるといいなぁと思いました。

    P.S.
    コードでもうちょっとだけお利口さんに見せるには
    ADD_DATA = ADD_DATA - DATA[DATA_COUNT];
    DATA[DATA_COUNT++] = NEW_DATA;
    ADD_DATA += NEW_DATA;
    DATA_COUNT %= 16;
    AVE_DATA = ADD_DATA >> 4;

    な感じ?やってることは変わってませんが(汗)

  • In reply to チョコ:

    最頻値かぁ?
    ちょっとやりたいこととずれてきたかな?.......(笑)
  • In reply to NAKA:

    最頻値は固定したデータの時ですね、ゆらゆら揺れるデータから一位にレベルいくらとか
    オーディオのような元から変化したデータを取りたいときは、移動平均でしょうね。
  • In reply to IKUZO:

    最頻値で一致するといっても、全てのビットを使用するわけではなく、右シフトしますから、ローパスフィルタのような役割になるのではないでしょうか?
  • >DATA_COUNT %= 16;

    これってカウンタ値が16以上にならないようにしているんですか?
    それなら 0x0F でANDを取った方が簡単で速いと思います。
  • In reply to リカルド:

    わわいです
    >それなら 0x0F でANDを取った方が簡単で速いと思います。
    まー、これはコンパイラの最適化で、DATA_COUNT&=0xf; に置き換えられたりしますねー
  • In reply to リカルド:

    リカルドさん NAKAです。
    おもしろーい!!なるほど!頭の体操ですね!
    リングバッファの数が16でなくて15や13の時はちょっと厳しいのかな?
    16個も15個もそんなにかわらない!と言われそうですが.......(笑)

Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page