2013-10-31 12 views
5

Ho un segnale costante a tratti mostrato di seguito. Voglio rilevare la posizione della transizione del passo (contrassegnata in rosso).Rileva passaggi in un segnale costante a tratti

mio approccio attuale:

Attualmente sto implementando l'ultima fase di rilevamento delle discontinuità. Tuttavia, non riesco a ottenere la posizione precisa e finisco con molti falsi rilevamenti.

La mia domanda:

  1. È questo l'approccio corretto?
  2. Se sì, qualcuno può gettare alcune informazioni/algoritmi da utilizzare per l'ultimo passaggio?
  3. Si prega di suggerire un approccio alternativo/migliore.

Grazie

Original, Smoothed, DWT-detailed Coeff at level 1 plots

risposta

4

Convolve il segnale con un primo derivato di una gaussiana per trovare le posizioni di passo, simile a un Canny edge detection in 1-D. Puoi farlo in un approccio multi-scala, partendo da un sigma "grande" (diciamo ~ 10 pixel) per rilevare i massimi locali, quindi a un sigma più piccolo (~ 2 pixel) per convergere sui pixel corretti dove sono i passaggi.

È possibile visualizzare un'implementazione di questo approccio here.

+0

Il link per il download non funziona sul link interessante che hai inviato, forse qualcuno ne ha una copia? – Xavier

+0

era solo un collegamento al documento originale: Canny, John. "Un approccio computazionale per il rilevamento dei bordi." Transazioni IEEE su analisi del modello e intelligenza della macchina 6 (1986): 679-698. https://scholar.google.com/scholar?cluster=6445737130860653197&hl=en&as_sdt=0,5 – bla

3

Se la funzione è davvero a tratti costante, perché non utilizzare solo abs di diff rispetto ad una soglia?

th = 0.1; 
x_steps = x(abs(diff(y)) > th) 

dove x un vettore con i valori x-asse, y è tuoi dati dell'asse y, ed th è una soglia.

Esempio:

>> x = [2 3 4 5 6 7 8 9]; 
>> y = [1 1 1 2 2 2 3 3]; 
>> th = 0.1; 
>> x_steps = x(abs(diff(y)) > th) 

x_steps = 

    4  7 
+0

Il segnale è costante a tratti, ma le transizioni tra i passaggi non sono nitide (il suo cambiamento lineare come mostrato nell'immagine). Quindi, prendere la differenza tra valore precedente e valore attuale non porta a risultati attesi. –

+0

+1 Ho apprezzato la semplicità della risposta, sebbene possa fallire con segnali casuali generici non stepwise e con segnali stepwise con increspature su transizioni. – AstoundingJB

0

Penso che l'uniformità con un filtro passa-basso più nitido dovrebbe funzionare meglio.

Provare a utilizzare medfilt1() (un filtro mediano), poiché si dispone di livelli molto concreti. Se sai quanto è lungo il tuo plateau, puoi prendere mezzo/quarto della lunghezza del plateau, ad esempio. Quindi otterresti dei bordi molto nitidi. Gli spigoli dovrebbero essere rilevabili usando un wavelet di Haar o anche solo usando una semplice differenziazione.

2

Per quanto riguarda il punto 3: (Si prega di suggerire un/migliore approccio alternativo)

suggerisco di usare un Potts "filtro". Questo è un approccio variazionale per ottenere una stima accurata del segnale costante a tratti (simile alla minimizzazione della variazione totale).Può essere interpretato come filtro mediano adattivo. Data la stima di Potts, i punti di salto sono i punti di gradiente non-zero di u, cioè diff (u) ~ = 0. (Esistono implementazioni Matlab gratuite dei filtri Potts sul web) Vedi anche http://en.wikipedia.org/wiki/Step_detection

0

Variazione totale Il Denoising può produrre un segnale costante a tratti. Quindi, come sottolineato sopra, "abs di diff rispetto a una soglia" restituisce la posizione delle transizioni. Esistono algoritmi molto efficienti per TVDN che elaborano milioni di dati entro millisecondi:

http://www.gipsa-lab.grenoble-inp.fr/~laurent.condat/download/condat_fast_tv.c

Ecco un'implementazione di un approccio variazionale con pitone e interfaccia MATLAB che utilizza anche TVDN:

https://github.com/qubit-ulm/ebs