• ベストアンサー

2つのアナログ信号が一致してるか検出する方法

ADCでデータa[n],b[n]を取り込み、「取り込んだ信号が一定以上になってから一定期間」の2つの信号が同じか違うかを比較したいです。 ただし、まったく同じ信号ではないためa[n]-b[n]だと0にはなりません。(ノイズや測定誤差) また、a[n]とb[n]は多少位相がずれているため、位相を合わせる作業も必要です。(これは現在何とかやってますが、完全に一致はしませんので、それでも比較できる方法があれば・・・) 今現在は積分して誤差1割まで許容してますが、似た波形でも1割以上の誤差になることも結構あり、困っています。(特に小さい波形の場合は一致する確立が低い) また、積分では面積が似ているかどうかを判断しているだけなので、やりたいことと少し違うかな?と思ってます。 このように波形の形状を比較する場合は普通はどのような処理をするのでしょうか? 人間が波形を見て波形を比較し、似ているか似ていないかを比較するのはいったいどのような原理なのか分かればいいのですが。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

> コヒーレンシという手法がいまいちよく分からないです。 > 単純に各周波数ごとの値を比較する事でしょうか? コヒーレンシまたはコヒーレンスというのは、二つの信号がどの程度一致しているかを表す指標のようなもので、1であれば完全に一致、0であれば全く一致しないことを意味します。検索エンジンでざっと調べたのですが、あまりよい情報が得られませんでした。一応参考URLを挙げておきますので、のぞいてみてください。 実際問題として、コヒーレンシが1になることはないのですが、古い記憶をたどると、測定誤差やノイズの影響より、FFTを行う際にエイリアシング除去用に用いた窓関数の影響が最も大きかったような気がします。 # ほとんどC/C++とは関係のない話題になってしまいましたね。

参考URL:
http://www.hulinks.co.jp/support/flexpro/v7/dataanalysis_crsp.html
silverbear
質問者

お礼

># ほとんどC/C++とは関係のない話題になってしまいましたね。 すいません。物理とか化学とかだとプログラムでやるのに一ひねりしないと出来ない様な回答がくるのでは?と思ったもので。 URLの内容を調べてみようと思います。 窓関数の影響の方が大きいと言うのであれば問題なさそうですね。 ありがとうございました。

その他の回答 (5)

  • walkingdic
  • ベストアンサー率47% (4589/9644)
回答No.6

ご質問内容だけでは直ちにどんな方法がよいのかわからないので、いくつか試してみるしかないと思います。 で、やり方についてはニューメリカルレシピ・イン・シー Numerical Recipes in C (技術評論社)という本があるのでそれを読んでください。サンプルコードがありますから、それですぐに試せます。 ノイズがあってということだとロバスト性が欲しいと思いますのでノンパラメトリック法の中で選択した方が良いかもしれません。 統計学上意味のある相関係数が求められます。

silverbear
質問者

お礼

ありがとうございます。 >ニューメリカルレシピ・イン・シー この本が近くの書店で見当たらなかったため、ネットで注文する事になりそうです。安い本ではないのでちょっと躊躇しています。(かったは良いけど使えないのでは見ても理解できないのでは駄目なので) とりあえずコヒーレンス関数のプログラムをDLしたら出来そうな気がしたので、今はコヒーレンス関数の方向で進めています。

回答No.5

それぞれの信号の微分を(サンプル間の差da[n]=a[n]-a[n-1], db[n]=b[n]-b[n-1])求めて、 da[j]とdb[k]をずらして比べて一致(誤差範囲も考慮)する場所を探してみるとかしてみたらどうでしょう?

silverbear
質問者

お礼

ありがとうございます。 微分同士の差の合計とかで比較してみようと思います。

  • coredump
  • ベストアンサー率46% (12/26)
回答No.4

どもです。 相互相関関数って奴で2つの信号の類似性と位相差をある程度チェックできたと思います。 http://www.teu.ac.jp/hiha/SignalProcessing/correlation/crosscorrelation.html

silverbear
質問者

お礼

ありがとうございます。 コヒーレンスの方がなかなか分からなくて相互相関関数まで行かなかったんですが、先に相互相関関数をやってみました。 すると、同相のサイン波はMAX0.5のサイン波、方形波とサイン波だとMAX0.6のサイン波、1の直流同士だと1の直流、0の直流同士だと0の直流となりました。 サイン波同士よりも方形波とサイン波の方が値が大きくなるのはちょっと困るんですが、これはどうすればいいのでしょうか?

回答No.3

位相がずれていなければ、ADCにかける前に差動回路にかけるのですが・・・。 回答になってなくてすみません。

silverbear
質問者

お礼

それは一応a[n]-b[n]でも出来るんですが、やはり位相がずれているためそれだと比較にならないんです。また、位相を合わせてから計算しても立ち上がりが急な波形の場合、多少の位相のずれでインパルスが出てしまい、判断に困ってしまうためそれは断念しました。 また、信号が一致していることを確認した後にはa[n]とb[n]を使う予定があるため、ADCに入れる前に差動を通してしまうとADCが3個必要になってしまうため、それはちょっと出来ないんです。 説明不足ですいませんでした。 ありがとうございます。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

かなり以前に似たようなことをやったときは、FFTで周波数系列のデータに変換してからコヒーレンシを求めたように記憶しています。

silverbear
質問者

お礼

やはりFFTですか。 実はFFTも考えてはいたのですが、どの程度一致するかの基準がいまいち分からなかったのでやってませんでした。 やってみようと思います。 コヒーレンシという手法がいまいちよく分からないです。 単純に各周波数ごとの値を比較する事でしょうか?

関連するQ&A