トップ «前の日記(2008年08月31日) 最新 次の日記(2008年09月06日)» 編集

のろのろのろ雑記


2008年09月02日 [ColdFire] ColdFire×P2P地震情報(5) ノイズを除去する

_ [ColdFire] ColdFire×P2P地震情報(5) ノイズを除去する

 Interface 9月号付録基板を使い,P2P地震情報のサービスを作ってしまう勝手な企画です.過去の記事は,タイトルのColdFireカテゴリからどうぞ.

(2)〜(4) のおさらい

  • 地震計として使うためには,「ズレ」「ノイズ」「サンプリング間隔」の3点を考える必要があるようです.
    • タイマを使うことで,サンプリング回数を保つことがそれなりにできました.
    • "0 gの電圧差""傾いた設置"の問題は,静止した状態を"地震計にとっての0 g"と考えることでクリアしました.
    • 時間の経過による傾きの変化などは,移動平均を用いることでクリアしました.

1 gあたりの感度差は,今回はそのままで

 "(2) 地震計としてのColdFire基板"において,『加速度センサによる1 gあたりの感度差は約±75 Galの差として現れることがあります.』と記しました.この差を補正するには,それぞれの軸で0 gの状態と1 gの状態を調べ,正しい値となるよう常に一定倍率を掛ける方法が考えられます.

 しかし,一般的な環境で各軸に0 gと1 gの状態を作り出すのは難しく,正確な補正は期待できません.誤った補正が掛かる可能性もあります.さらに,この感度差による誤差はそれほど大きいものではありません.

 感度差が 740 mV/g 〜 800 mV/g (Typical) 〜 860 mV/g の間で変動するということは, 92.5 % 〜 107.5 % の間で変動する,つまり誤差は±7.5 %ということになります.

 気になると言えば気になりますが,そこまで問題となるレベルではありませんので今回はそのままにします.

"移動平均" でノイズ問題もクリア

 これまで様々な問題を取り上げてきましたが,最後に『ノイズがあります.』と記した部分を解決しましょう.前回オフセットの算出に移動平均を使いましたが,これをデータにも使います.「データをならす」といったイメージで,細かなノイズを取り除きます.

 これも一種のフィルタで,「非常にすばやい変化には追従できない」という副作用があります.以下に数パターンの特性を,気象庁が計測震度の計算に用いるフィルタの特性とともに示しました.凡例は "サンプリング周波数 / 移動平均サンプル数" を表しています.

080902_filter.png

 高周波数帯(1 Hz以上)の特性が変わり,ローパスフィルタのように作用しています.気象庁フィルタと同じとはいきませんが,1 Hz〜3 Hz辺りは"20 Hz / 4 Samples"が近い値になっています.

 実は,これだけではノイズは完全に取れていません.フーリエ変換すると分かりますが,静止状態のノイズはかなり幅広く分布しています.ただ,ノイズ除去を厳しくしすぎると地震波特有の波形を見失う恐れがあるので,これ以上フィルタを掛けるのは避けます. 080902_noise.png

 それでは恒例になりましたサンプルプログラム,前回のオフセットと今回のノイズ除去を組み合わせてみました.サンプリング間隔が未調整で25 Hzくらいで出てきますが,あくまでサンプルです.

main(){
  int i,index,ind_n;
  int *sample=MemoryAlloc(120); int *nr=MemoryAlloc(6); long *offset=MemoryAlloc(12);
  // init
  InitAd(0x70); index=0; ind_n=17;
  for(i=0;i<3;i++){offset[i]=0;nr[i]=0;}
  for(i=0;i<60;i++)sample[i]=0;
  // loop
  #stop 0
  for(;;) {
    if(Getc(0)!=0)break;
    index=(index+1)%20;ind_n=(ind_n+1)%20;
    for(i=0;i<3;i++){
      offset[i]-=sample[i*20+index];nr[i]-=sample[i*20+ind_n];
      sample[i*20+index]=GetAd(i+4);
      offset[i]+=sample[i*20+index];nr[i]+=sample[i*20+index];
      PrNum(nr[i]/3-offset[i]/20);PrStr(", ");
    }
    PrStr("\r\n");SystemSleep();
  }
  MemoryFree(sample);MemoryFree(nr);MemoryFree(offset);
}

2種類の"移動平均"で,気象庁フィルタに近づく?

080902_filter-mix.png

 サンプリング周波数20 Hzを基本とし,オフセット(基準点)に最新20サンプルの移動平均を用いるケース,データに最新3サンプルの移動平均を用いるケース,それらを組み合わせたケース,そして気象庁が計測震度の計算に用いるフィルタ,それぞれの特性を示しました.

 当初目標としていた『5HzPGA』,0.1 Hz〜5 Hzまでのバンドパスフィルタを掛けることと比べると,0.1 Hzや5 Hzで信号強度が約0.3 倍に落ち込んでいることから,『5HzPGA』として用いるには不適切な特性であることが分かります.まっとうにバンドパスしようとすると複雑な処理が必要になるので,無理があります.

 一方,気象庁フィルタと比べると多くの部分が近似しています.気象庁の計測震度「っぽいもの」を目指す可能性が急浮上してきました.がんばってみましょう.

今回のまとめ

  • ノイズについては,移動平均を使うことで緩和しました.
  • 何故か気象庁フィルタに近い特性を示したので,その方向でがんばることにしました

次回以降の予定

 これで全問題をクリアし,"地震計としてのColdFire基板"が一応出来上がりました.次回以降は,以下のような点を考えて"ColdFire基板 地震計"を制作していきます.

  • 震度の計算が必要ですが,気象庁の方法を実装するのは無理があります.また,『5HzPGA』と別物になるため,5HzPGAのデータに基づく算出も出来ません.
    • 計測震度と,その元になった波形データをフィルタに通した値との相関を見出せるかもしれません.
    • ここから最大加速度だけでがんばれるかもしれません.
  • 通信仕様を全く考えていません.

参考