11

誰かが時間依存信号を比較するために使用されるアルゴリズム/手法を教えてくれるかどうか疑問に思っていました. 理想的には、この仮想アルゴリズムは 2 つのシグナルを入力として受け取り、シグナル間の類似度を表す数値を返します (0 は 2 つのシグナルが統計的に無関係であり、1 はそれらが完全に一致していることを示します)。

もちろん、私の要求には問題があることを認識しています。つまり、これら 2 つのシグナルを比較するコンテキストで「類似性」を適切に定義する方法がわからないため、誰かが私を正しい方向に向けることができれば (調べる/知っておくべきことなど)、私もそれをいただければ幸いです。

4

6 に答える 6

14

相互相関関数は、従来の信号処理ソリューションです。Matlab にアクセスできる場合は、XCORR 関数を参照してください。max(abs(xcorr(Signal1, Signal2, 'coeff')))探しているものを具体的に提供し、Pythonにも同等のものがあります。

相互相関は、探している「類似性」が 2 つの信号間の線形関係の尺度であると想定しています。時間インデックスを持つ実数値の有限長信号の定義n = 0..N-1は次のとおりです。

C[g] = sum{m = 0..N-1} (x1[m] * x2[g+m])

gから実行され-N..Nます (その範囲外では、合計内の積は 0 です)。

数字を求めましたが、機能はかなり興味深いものです。機能ドメインgはラグドメインと呼ばれます。

x1とがタイム シフトによって関連付けられている場合x2、相互相関関数は、シフトに対応するラグでピークを持ちます。たとえば、 と がx1 = sin[wn]ありx2 = sin[wn + phi]、周波数が同じで位相が異なる 2 つの正弦波がある場合、相互相関関数は、位相シフトに対応するラグでピークを持ちます。

x2が のスケーリングされたバージョンである場合x1、相互相関もスケーリングされます。関数を で割って相関係数に正規化し、絶対値を取ることでそれを取り込むことができます(Matlabのその行にはこれらの操作があります)sqrt(sum(x1^2)*sum(x2^2))0..1

より一般的には、相互相関が良い/悪いことの要約を以下に示します。

相互相関は、ある信号が別の信号に線形に関連しているかどうか、つまり、問題の信号が
x2(t) = sum{n = 0..K-1}(A_n * x1(t + phi_n))
どこx1(t)にあるか、スケーリング係数であるか、時間シフトであるかを判断するのに適しています。これの意味は次のとおりです。x2(t)A_nphi_n

  1. 一方の信号が他方の時間シフトされたバージョンである場合(phi_n <> 0 for some n)、相互相関関数は非ゼロになります。
  2. 一方の信号が他方の信号のスケーリングされたバージョンである場合(A_n <> 0 for some n)、相互相関関数は非ゼロになります。
  3. 1 つの信号が他の信号のスケーリングされたバージョンとタイム シフトされたバージョンの組み合わせである場合 (両方ともA_nphi_nある数の n に対して非ゼロである)、相互相関関数は非ゼロになります。これは線形フィルターの定義でもあることに注意してください。

より具体的に言うとx1、 が広帯域ランダム信号であるとします。しましょうx2=x1。これで、正規化された相互相関関数は g=0 で正確に 1 になり、それ以外の場所ではほぼ 0 になります。x2を (線形に) フィルターをかけたバージョンの としますx1。相互相関関数は の近くで非ゼロになりg=0ます。非ゼロ部分の幅は、フィルターの帯域幅に依存します。

x1および周期的であるという特殊なケースについてx2は、回答の元の部分の位相シフトに関する情報が適用されます。

相互相関が役に立たないのは、2 つの信号が線形関係にない場合です。たとえば、異なる周波数の 2 つの周期信号は、直線的に関連していません。また、異なる時間に広帯域ランダム プロセスから抽出された 2 つのランダム信号もありません。また、形状が似ていても時間インデックスが異なる 2 つの信号ではありません。これは、基本周波数が等しくない場合のようなものです。

いずれの場合も、相互相関関数を正規化し、最大値を調べると、信号が線形に関連している可能性があるかどうかがわかります。数値が 0.1 未満のように低い場合は、無関係であると宣言しても問題ありません。それよりも高い場合は、正規化された相互相関関数と正規化されていない相互相関関数の両方をグラフ化し、構造を調べて、より注意深く調べます。周期的な相互相関は、両方の信号が周期的であることを意味し、相互相関関数が周囲で著しく高いg=0ことは、一方の信号が他方の信号のフィルター処理されたバージョンであることを意味します。

于 2009-08-14T02:12:01.687 に答える
1

一般的な解決策:データをヒストグラムにビン化し、カイ 2 乗検定またはコロモグロフ検定を使用できます。

どちらも、2 つの分布が同じ下位分布からのランダム サンプルを表す (つまり、統計内で同じ形状を持つ) 可能性を推定することを明示的に意図しています。

私は頭のてっぺんから ac 実装を知りませんが、ROOTは両方の c++ 実装を提供します。

ドキュメントもいくつかの論文を指していると思います。


CERNLIBは fortran77 で両方のアルゴリズムを提供していると思います。これはc にリンクできます。ROOT コードを翻訳する方が簡単かもしれません。

于 2009-08-14T02:04:37.167 に答える
1

高速フーリエ変換を試すことができます (ウィキペディアで FFT を調べてください。変換を実行するためのオープン ソース ライブラリがあります)。

FFT は、データを時間領域 (つまり、1 秒、2 秒、3 秒、4 秒のパルス) から周波数領域のデータ (つまり、1 秒ごとのパルス) に変換します。

次に、周波数とその相対的な強さをより簡単に比較できます。それはあなたにとって正しい方向への一歩となるはずです。

于 2009-08-14T02:09:06.293 に答える
1

ダイナミック タイム ワーピングは、異なる位置で時間を加速および減速することによって信号を一致させる必要がある場合に使用できるアプローチです。

于 2009-09-04T18:30:54.913 に答える
0

信号が何であるか、そして「同一性」のどの程度があなたにとって意味があるかについてはあまり言いません。ただし、信号が同相である場合 (つまり、2 つの信号を瞬間ごとに比較したい場合で、考慮すべき時間遅延がない場合) は、ピアソンの相関器を調べることをお勧めします。2 つの信号が同一の場合は値 1、完全に異なる場合は値 0、韻を踏んでいる場合は中間の値が返されます。追加の利点として、ピアソンズは信号が異なる方法で増幅されても気にしません (一方の信号が他方の信号の逆である場合を除いて、結果は -1 になります)。

それはあなたが探しているもののように聞こえますか?

http://en.wikipedia.org/wiki/Pearson_product-moment_correlation_coefficient

于 2010-09-24T14:16:31.457 に答える
0

私は信号処理を知らないので、これは推測です..:

あなたの信号は効果的に順序付けられたペアのリストですか?時間と振幅は(x,y)どこにありますか? もしそうなら、おそらく時間座標を捨てることができます-例えば:xy

Signal 1: [(x0,y0), (x1,y1), (x2,y2), (x3,y3), ...]
Signal 2: [(x0,z0), (x1,z1), (x2,z1), (x3,z3), ...]

捨てる時間:

Signal 1: [y0, y1, y2, y3, ...]
Signal 2: [z0, z1, z2, z3, ...]

次に、おそらく相関関係を探すことによって、振幅を互いに比較できます。おそらく、あなたはyに対してプロットすることができますz:

Comparing: [(y0,z0), (y1,z1), (y2,z2), (y3,z3), ...]

または、さまざまな相関係数のいずれかを計算します。

于 2009-08-13T23:03:17.090 に答える