2009-08-13 15 views
10

Mi chiedevo se qualcuno potesse indicarmi un algoritmo/tecnica che viene utilizzato per confrontare i segnali dipendenti dal tempo. Idealmente, questo ipotetico algoritmo prenderebbe 2 segnali come input e restituirebbe un numero che sarebbe la percentuale di somiglianza tra i segnali (0 è che i 2 segnali sono statisticamente non correlati e 1 è che sono una corrispondenza perfetta).Algoritmo per associare i segnali dipendenti dal tempo (1D)

Ovviamente, mi rendo conto che ci sono problemi con la mia richiesta, ovvero che non sono sicuro di come definire correttamente la "similarità" nel contesto del confronto di questi 2 segnali, quindi se qualcuno potrebbe anche indicarmi il giusto direzione (riguardo a cosa dovrei cercare/sapere, ecc.), lo apprezzerei pure.

risposta

0

Non so di elaborazione del segnale, quindi questa è una supposizione ..:

È il segnale in modo efficace una lista di coppie ordinate (x,y), dove x è il tempo e l'ampiezza y? Se è così, allora forse si potrebbe buttare via poi coordinare tempo - ad esempio: tempo

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

Gettare via:

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

Quindi è possibile confrontare le ampiezze con l'altro, magari alla ricerca di un correlation . Forse si potrebbe tracciare y contro z:

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

o calcolare uno dei vari coefficienti di correlazione.

1

Soluzione generale: è possibile collocare i dati in istogrammi e utilizzare un test del chi quadrato o un test di Kolomogrov.

Entrambi sono esplicitamente intesi per stimare le probabilità che le due distribuzioni rappresentino campioni casuali da la stessa distribuzione di sottoendone (ovvero: avere la stessa forma all'interno delle statistiche).

Non so implementazione ac fuori dalla parte superiore della mia testa, ma ROOT fornisce C++ realizzazione di entrambi:

Credo che i documenti indicano una certa anche i documenti.


penso che CERNLIB fornisce entrambi gli algoritmi in Fortran77, che si può link per c. La traduzione del codice ROOT potrebbe essere più semplice.

1

Si potrebbe provare una trasformazione di Fourier veloce (cercare FFT in Wikipedia, ci sono librerie open source per l'esecuzione di conversioni).

FFT trasformerà i dati dal dominio del tempo (ad esempio un impulso a 1s, 2s, 3s, 4s ...) a dati in dominio di frequenza (ad esempio un impulso ogni secondo).

Quindi è possibile confrontare più facilmente le frequenze e le relative intensità.Dovrebbe essere un passo nella giusta direzione per te.

+0

Non è un cattivo suggerimento per alcuni tipi di input, ma in realtà si lascia l'OP con lo stesso problema: come due confrontare a spettri. – dmckee

+0

dmckee: con la differenza che i segnali trasformati di Fourier sarebbero confrontabili punto per punto senza spostamenti. A proposito, "spettri" è il termine sbagliato per i segnali originali, poiché ciò implicherebbe energia (o misura equivalente) sull'asse x. – Svante

14

cross-correlation function è la soluzione di elaborazione del segnale classica. Se hai accesso a Matlab, consulta la funzione XCORR. max(abs(xcorr(Signal1, Signal2, 'coeff'))) ti darebbe esattamente quello che stai cercando e un equivalente esiste anche in Python.

La correlazione incrociata presuppone che la "somiglianza" che stai cercando sia una misura della relazione lineare tra i due segnali. La definizione di segnali a lunghezza finita a valori reali con indice temporale n = 0..N-1 è:

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

g piste da -N..N (fuori di tale intervallo il prodotto all'interno della somma è 0).

Sebbene sia stato richiesto un numero, la funzione è piuttosto interessante. Il dominio di funzione g è chiamato dominio di ritardo.

Se x1 e sono correlati da uno spostamento temporale, la funzione di correlazione incrociata avrà il suo picco al ritardo corrispondente allo spostamento. Ad esempio, se si disponesse di x1 = sin[wn] e x2 = sin[wn + phi], quindi due onde sinusoidali alla stessa frequenza e fase diversa, la funzione di correlazione incrociata avrebbe il suo picco al ritardo corrispondente allo sfasamento.

Se x2 è una versione ridimensionata di x1, anche la correlazione incrociata verrà ridimensionata. È possibile normalizzare la funzione in base a un coefficiente di correlazione dividendo per sqrt(sum(x1^2)*sum(x2^2)) e portarlo in 0..1 prendendo un valore assoluto (quella riga di Matlab ha queste operazioni).

Più in generale, di seguito è riportato un riepilogo di ciò che la correlazione incrociata è buona/cattiva.

correlazione incrociata funziona bene per determinare se un segnale è correlata linearmente ad un altro, cioè se
x2(t) = sum{n = 0..K-1}(A_n * x1(t + phi_n))
dove x1(t) e x2(t) sono i segnali in questione, A_n sono fattori di scala, e phi_n sono salti temporali. Le implicazioni di questo sono:

  1. Se un segnale è un tempo spostato versione dell'altro (phi_n <> 0 for some n) la funzione di cross-correlazione sarà diverso da zero.
  2. Se un segnale è una versione ridimensionata dell'altro (A_n <> 0 for some n), la funzione di correlazione incrociata sarà diversa da zero.
  3. Se un segnale è una combinazione di versioni ridimensionate e time shift dell'altro (sia A_n e phi_n non sono zero per un certo numero di n), la funzione di correlazione incrociata sarà diversa da zero. Si noti che questa è anche una definizione di un filtro lineare.

Per ottenere più concreto, supponiamo che x1 sia un segnale casuale a banda larga. Lasciare x2=x1. Ora la funzione di correlazione incrociata normalizzata sarà esattamente 1 a g = 0, e vicino a 0 ovunque altro. Ora lasciare che x2 sia una versione (linearmente) filtrata di x1. La funzione di correlazione incrociata sarà diversa da zero vicino a g=0. La larghezza della parte diversa da zero dipenderà dalla larghezza di banda del filtro.

Per il caso speciale di x1 e x2 periodico, vengono applicate le informazioni sullo sfasamento nella parte originale della risposta.

Laddove la correlazione incrociata sarà non è utile se i due segnali non sono correlati linearmente. Ad esempio, due segnali periodici a frequenze diverse non sono correlati linearmente. Né sono due segnali casuali tratte da un processo casuale a larga banda in momenti diversi. Né sono due segnali di forma simile ma con indici di tempo diversi: questo è come il caso di frequenza fondamentale non equo.

In tutti i casi, la normalizzazione della funzione di correlazione incrociata e la visualizzazione del valore massimo indicano se i segnali sono potenzialmente correlati linearmente - se il numero è basso, come sotto 0,1, mi conviene dichiararli estranei. Più in alto di questo aspetto e lo esaminerei con maggiore attenzione, rappresentando graficamente le funzioni di correlazione incrociata normalizzate e non normalizzate e osservando la struttura. Una correlazione incrociata periodica implica che entrambi i segnali sono periodici e una funzione di correlazione incrociata che è notevolmente più elevata attorno a g=0 implica che un segnale è una versione filtrata dell'altro.

+0

Non è del tutto chiaro dalla domanda, ma se oort vuole una misura di uguaglianza di forma (piuttosto che in fase), allora la correlazione incrociata non è ottimale: dato un segnale di base s_b e due segnali di test t_1, t_2, non è adatto per dire quale segnale di test è più simile al segnale di base. – dmckee

+0

Sto cercando una funzione che fornisca una misura di uguaglianza di forma. Cosa sarebbe più adatto? – oort

+0

@oort: guarda la mia risposta per un paio di scelte. Questi sono più complicati della correlazione incrociata, ma in realtà vanno direttamente alla somiglianza della forma. – dmckee

1

Dynamic Time Warping è un approccio che è possibile utilizzare se i segnali devono essere abbinati accelerando e rallentando il tempo in diverse posizioni.

0

Non si dice molto su quali siano i segnali e quale misura di "uguaglianza" sarebbe significativa per voi. Ma, se i segnali sono in fase (cioè, vuoi confrontare i due segnali istante per istante, e non ci sarà alcun ritardo temporale da considerare), ti suggerirei di guardare il correlatore di Pearson. Ti dà un valore di 1 se i due segnali sono identici, un valore di 0 se sono del tutto dissimili, e qualcosa in mezzo se fanno un po 'di rima. Come ulteriore vantaggio, a Pearson's non importa se i segnali sono amplificati in modo diverso, (eccetto se un segnale è l'inverso dell'altro ti dà un risultato di -1).

Questo suona come quello che stai cercando?

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

Problemi correlati