Domanda

Utilizziamo una scheda di acquisizione dati per acquisire letture da un dispositivo che aumenta il suo segnale fino a un picco e poi ritorna vicino al valore originale.Per trovare il valore di picco attualmente cerchiamo nell'array la lettura più alta e utilizziamo l'indice per determinare la tempistica del valore di picco che viene utilizzato nei nostri calcoli.

Funziona bene se il valore più alto è il picco che stiamo cercando ma se il dispositivo non funziona correttamente possiamo vedere un secondo picco che può essere più alto del picco iniziale.Effettuiamo 10 letture al secondo da 16 dispositivi in ​​un periodo di 90 secondi.

Il mio pensiero iniziale è quello di scorrere le letture controllando per vedere se il punto precedente e quello successivo sono inferiori alla corrente per trovare un picco e costruire una serie di picchi.Forse dovremmo considerare una media di un numero di punti su entrambi i lati della posizione attuale per tenere conto del rumore nel sistema.È questo il modo migliore di procedere o esistono tecniche migliori?


Usiamo LabVIEW e ho controllato il file Forum LAVA e ci sono una serie di esempi interessanti.Questo fa parte del nostro software di test e stiamo cercando di evitare di utilizzare troppe librerie VI non standard, quindi speravo in un feedback sul processo/algoritmi coinvolti piuttosto che su un codice specifico.

È stato utile?

Soluzione

Potresti provare la media del segnale, ad es.per ogni punto, media il valore con i 3 o più punti circostanti.Se i segnali di rumore sono enormi, anche questo potrebbe non essere d'aiuto.

Mi rendo conto che questo era indipendente dal linguaggio, ma supponendo che tu stia utilizzando LabView, ci sono molti VI di elaborazione del segnale preconfezionati forniti con LabView che puoi utilizzare per eseguire il livellamento e la riduzione del rumore.IL Forum NI sono un ottimo posto per ottenere un aiuto più specializzato su questo genere di cose.

Altri suggerimenti

Esistono tantissimi metodi classici di rilevamento dei picchi, ognuno dei quali potrebbe funzionare.Dovrai vedere cosa, in particolare, limita la qualità dei tuoi dati.Ecco le descrizioni di base:

  1. Tra due punti qualsiasi nei tuoi dati, (x(0), y(0)) E (x(n), y(n)), addizionare y(i + 1) - y(i) per 0 <= i < n e chiama questo T ("viaggio") e tramontare R ("salire a y(n) - y(0) + k per adeguatamente piccolo k. T/R > 1 indica un picco.Funziona bene se è improbabile un grande spostamento dovuto al rumore o se il rumore si distribuisce simmetricamente attorno a una forma di curva base.Per la tua applicazione, accetta il primo picco con un punteggio superiore a una determinata soglia oppure analizza la curva dei valori di corsa per aumento per proprietà più interessanti.

  2. Utilizza filtri corrispondenti per valutare la somiglianza con una forma di picco standard (sostanzialmente, utilizza un prodotto scalare normalizzato rispetto a una forma per ottenere una metrica coseno di somiglianza)

  3. Deconvolve rispetto a una forma di picco standard e controlla valori elevati (anche se spesso trovo che 2 siano meno sensibili al rumore per l'uscita della semplice strumentazione).

  4. Liscia i dati e controlla la presenza di triplette di punti equidistanti dove, se x0 < x1 < x2, y1 > 0.5 * (y0 + y2), oppure controlla le distanze euclidee in questo modo: D((x0, y0), (x1, y1)) + D((x1, y1), (x2, y2)) > D((x0, y0),(x2, y2)), che si basa sulla disuguaglianza triangolare.Anche l'uso di rapporti semplici ti fornirà un meccanismo di punteggio.

  5. Adatta un modello di miscela 2-gaussiano molto semplice ai tuoi dati (ad esempio, Numerical Recipes ha una bella porzione di codice già pronta).Prendi il picco precedente.Questo gestirà correttamente i picchi sovrapposti.

  6. Trova la migliore corrispondenza nei dati con una semplice curva gaussiana, di Cauchy, di Poisson o qualunque altra curva.Valuta questa curva su un ampio intervallo e sottraila da una copia dei dati dopo aver notato la posizione del picco.Ripetere.Prendi il primo picco i cui parametri del modello (probabilmente la deviazione standard, ma alcune applicazioni potrebbero preoccuparsi della curtosi o di altre caratteristiche) soddisfano alcuni criteri.Fare attenzione agli artefatti lasciati quando i picchi vengono sottratti dai dati.La migliore corrispondenza potrebbe essere determinata dal tipo di punteggio suggerito al punto 2 sopra.

Ho già fatto quello che stai facendo tu:individuazione di picchi nei dati di sequenza del DNA, individuazione di picchi nei derivati ​​stimati dalle curve misurate e individuazione di picchi negli istogrammi.

Ti incoraggio a prestare attenzione alla corretta linea di base.Il filtraggio di Wiener o altri filtraggi o la semplice analisi dell'istogramma rappresentano spesso un modo semplice per stabilire una linea di base in presenza di rumore.

Infine, se i tuoi dati sono tipicamente rumorosi e stai ottenendo dati dalla scheda come output single-ended senza riferimenti (o anche referenziati, semplicemente non differenziali), e se stai calcolando la media di molte osservazioni in ciascun punto dati, prova a ordinarli osservazioni ed eliminare il primo e l'ultimo quartile e calcolare la media di ciò che rimane.Esistono numerose tattiche di eliminazione anomale che possono essere davvero utili.

Questo problema è stato studiato in dettaglio.

Esistono una serie di implementazioni molto aggiornate nel file TSpectrum* classi di RADICE (uno strumento di analisi della fisica nucleare/particellare).Il codice funziona con dati da uno a tre dimensioni.

Il codice sorgente ROOT è disponibile, quindi puoi prendere questa implementazione se lo desideri.

Dal Spettro documentazione della classe:

Gli algoritmi utilizzati in questa classe sono stati pubblicati nei seguenti riferimenti:

[1] M.Morhac et al.:Metodi di eliminazione di base per spettri gamma-raggi di coincidenza multidimensionale.Strumenti e metodi nucleari nella ricerca sulla fisica A 401 (1997) 113-132.

[2] M.Morhac et al.:Deconvoluzione dell'oro efficiente e bidimensionale e la sua applicazione alla decomposizione degli spettri a raggi gamma.Strumenti e metodi nucleari nella ricerca sulla fisica A 401 (1997) 385-408.

[3] M.Morhac et al.:Identificazione dei picchi negli spettri gamma-raggi di coincidenza multidimensionale.Strumenti e metodi nucleari nella fisica della ricerca A 443 (2000), 108-125.

I documenti sono collegati alla documentazione della classe per quelli di voi che non hanno un abbonamento online NIM.


La versione breve di ciò che viene fatto è che l'istogramma viene appiattito per eliminare il rumore, quindi i massimi locali vengono rilevati mediante forza bruta nell'istogramma appiattito.

Vorrei contribuire a questo thread con un algoritmo that Mi sono sviluppato:

Si basa sul principio di dispersione:se un nuovo punto dati si trova a un dato numero x di deviazioni standard da una media mobile, l'algoritmo segnala (chiamato anche punteggio z).L'algoritmo è molto robusto perché costruisce a separato media e deviazione in movimento, in modo tale che i segnali non corrompano la soglia.I segnali futuri vengono quindi identificati con approssimativamente la stessa precisione, indipendentemente dalla quantità di segnali precedenti.L'algoritmo richiede 3 input: lag = the lag of the moving window, threshold = the z-score at which the algorithm signals E influence = the influence (between 0 and 1) of new signals on the mean and standard deviation.Ad esempio, a lag di 5 utilizzerà le ultime 5 osservazioni per livellare i dati.UN threshold di 3,5 segnalerà se un punto dati è a 3,5 deviazioni standard dalla media mobile.E un influence di 0,5 dà segnali metà dell'influenza che hanno i normali punti dati.Allo stesso modo, un influence pari a 0 ignora completamente i segnali per il ricalcolo della nuova soglia:un'influenza pari a 0 è quindi l'opzione più robusta.

Funziona come segue:

Pseudocodice

# Let y be a vector of timeseries data of at least length lag+2
# Let mean() be a function that calculates the mean
# Let std() be a function that calculates the standard deviaton
# Let absolute() be the absolute value function

# Settings (the ones below are examples: choose what is best for your data)
set lag to 5;          # lag 5 for the smoothing functions
set threshold to 3.5;  # 3.5 standard deviations for signal
set influence to 0.5;  # between 0 and 1, where 1 is normal influence, 0.5 is half

# Initialise variables
set signals to vector 0,...,0 of length of y;   # Initialise signal results
set filteredY to y(1,...,lag)                   # Initialise filtered series
set avgFilter to null;                          # Initialise average filter
set stdFilter to null;                          # Initialise std. filter
set avgFilter(lag) to mean(y(1,...,lag));       # Initialise first value
set stdFilter(lag) to std(y(1,...,lag));        # Initialise first value

for i=lag+1,...,t do
  if absolute(y(i) - avgFilter(i-1)) > threshold*stdFilter(i-1) then
    if y(i) > avgFilter(i-1)
      set signals(i) to +1;                     # Positive signal
    else
      set signals(i) to -1;                     # Negative signal
    end
    # Adjust the filters
    set filteredY(i) to influence*y(i) + (1-influence)*filteredY(i-1);
    set avgFilter(i) to mean(filteredY(i-lag,i),lag);
    set stdFilter(i) to std(filteredY(i-lag,i),lag);
  else
    set signals(i) to 0;                        # No signal
    # Adjust the filters
    set filteredY(i) to y(i);
    set avgFilter(i) to mean(filteredY(i-lag,i),lag);
    set stdFilter(i) to std(filteredY(i-lag,i),lag);
  end
end

Dimostrazione

Demonstration of robust thresholding algorithm

> Risposta originale

Questo metodo è fondamentalmente tratto dal libro "Vision" di David Marr

Sfocatura gaussiana del segnale con l'ampiezza prevista dei picchi.questo elimina i picchi di rumore e i dati di fase non vengono danneggiati.

Quindi rilevamento dei bordi (lo farà LOG)

Quindi i tuoi bordi erano i bordi delle caratteristiche (come i picchi).cerca i picchi tra i bordi, ordina i picchi per dimensione e il gioco è fatto.

Ho usato variazioni su questo e funzionano molto bene.

Penso che tu voglia farlo correlazione incrociata il tuo segnale con un segnale atteso ed esemplare.Ma è passato così tanto tempo dall'ultima volta che ho studiato l'elaborazione del segnale e anche allora non ci ho prestato molta attenzione.

Non so molto di strumentazione, quindi potrebbe essere del tutto poco pratico, ma potrebbe essere una direzione diversa utile.Se si sa come le letture possono fallire, e c'è un certo intervallo tra i picchi dati tali fallimenti, perché non fare una discesa del gradiente ad ogni intervallo.Se la discesa ti riporta in una zona che hai cercato in precedenza, puoi abbandonarla.A seconda della forma della superficie campionata, questo potrebbe anche aiutare a trovare i picchi più velocemente della ricerca.

Esiste una differenza qualitativa tra il picco desiderato e il secondo picco indesiderato?Se entrambi i picchi sono "netti" - cioèbreve durata: quando osservi il segnale nel dominio della frequenza (eseguendo FFT) otterrai energia nella maggior parte delle bande.Ma se il picco "buono" ha in modo affidabile energia presente a frequenze che non esistono nel picco "cattivo", o viceversa, potresti essere in grado di differenziarli automaticamente in questo modo.

Potresti applicarne alcuni Deviazione standard alla tua logica e prendi nota dei picchi superiori al x%.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top