Calcolo dei derivati


9

Ho una serie di dati (array singolo). Se prendo questi dati e li disegno, vedo che ci sono più picchi. Tuttavia, se ingrandisco una sezione di dati, vedo che c'è un rumore sostanziale.

Mi piace rilevare quanti picchi nei dati utilizzano poco tempo ed energia della CPU. Ho pensato di rilevare le pendenze di questi picchi (potrebbe essere in aumento o in discesa acuto o regolare) e guardare il numero di pendenze per determinare il numero di picchi. (2 pendenze positive e negative per ogni picco)

Qualche suggerimento su come posso calcolare le pendenze in presenza di rumore?

Il codice andrà in un sistema incorporato, la memoria è limitata, quindi preferibilmente mi piace implementare qualcosa che non richiede alcuna copia significativa dei dati.


1
Sembri in un negozio che chiede qualcosa di cui hai bisogno

2
Se il rumore ha una frequenza relativamente elevata, è possibile filtrare i dati passa-basso
Paul R

4
Puoi pubblicare uno o più grafici di esempio dei tuoi dati? Questo ci aiuterà a vedere come appare. Il rilevamento dei picchi di solito non viene eseguito tramite la stima della derivata, poiché il calcolo della derivata di un segnale è molto sensibile al rumore (è un'operazione passa-alto). Potrebbero esserci delle caratteristiche al segnale di interesse che è possibile sfruttare. Inoltre, c'è sempre un compromesso tra la probabilità di rilevare correttamente un picco e la probabilità di dichiarare falsamente un picco che in realtà non è di interesse. Qual è più importante per la tua applicazione?
Jason R,

2
Se riesci a produrre una trama, sarebbe utile.
Jason R,

1
Vuoi rilevare i picchi, potresti voler cercare il rilevamento dei picchi (vedi dsp.stackexchange.com/questions/1302/peak-detection-approach ).
Geerten,

Risposte:


1

Dipende dal tipo di rumore e dal tipo di segnale. Mostra un esempio se vuoi una buona risposta. Ma, detto questo, in generale probabilmente vorrai filtrare il segnale passa-basso. Se fossi in te, prenderei uno spettro di potenza di Fourier per vedere se la maggior parte del rumore è ad alta frequenza e il segnale a cui tengo principalmente in un intervallo inferiore. Se si sovrappongono, vabbè è la vita. Dovrei pensare di più alle cose.

Un filtro passa-basso che è buono per il segnale rumoroso in molti casi è il filtro Savitzky-Golay. È descritto in Ricette numeriche e per Python c'è una funzione nel ricettario di Python Numpy. È semplicemente una convoluzione con un piccolo kernel. Puoi scegliere la dimensione della finestra in base alla larghezza dei picchi o ad altre funzioni, abbastanza ampia da eliminare il rumore, ma non più ampia delle caratteristiche. Può essere piccolo, diciamo cinque punti, o più grande come dozzine, cento forse.

Scegli anche un ordine polinomiale - di solito uso 2 o 4. L'ordine 2 va bene quando la finestra è piccola, <10 punti o si estende per meno di mezzo ciclo o giù di lì (se il tuo segnale assomiglia a un seno) mentre l'ordine 4 è meglio per abbinare forme di picco distorte, ma ama avere circa 9 o più punti. Molto dipende dalla forma e dalla frequenza del rumore.

Come altri affermano nei commenti, la ricerca di derivati ​​probabilmente non è la strategia migliore, ma se si desidera trovare derivati ​​comunque, il filtro Savitzky-Golay può farlo - levigando e riportando contemporaneamente la derivata anziché il segnale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.