algorithm - Détection de crête du signal mesuré

Translate

Nous utilisons une carte d'acquisition de données pour prendre des lectures à partir d'un appareil qui augmente son signal jusqu'à un pic, puis retombe près de la valeur d'origine. Pour trouver la valeur de crête, nous recherchons actuellement dans le tableau la lecture la plus élevée et utilisons l'index pour déterminer le moment de la valeur de crête qui est utilisée dans nos calculs.

Cela fonctionne bien si la valeur la plus élevée est le pic que nous recherchons mais si l'appareil ne fonctionne pas correctement, nous pouvons voir un deuxième pic qui peut être plus élevé que le pic initial. Nous prenons 10 lectures par seconde à partir de 16 appareils sur une période de 90 secondes.

Mes premières pensées sont de parcourir les lectures en vérifiant si les points précédents et suivants sont inférieurs au courant pour trouver un pic et construire un tableau de pics. Peut-être devrions-nous examiner une moyenne d'un certain nombre de points de chaque côté de la position actuelle pour tenir compte du bruit dans le système. Est-ce la meilleure façon de procéder ou existe-t-il de meilleures techniques?


Nous utilisons LabVIEW et j'ai vérifié leForums LAVAet il y a un certain nombre d'exemples intéressants. Cela fait partie de notre logiciel de test et nous essayons d'éviter d'utiliser trop de bibliothèques de VI non standard, donc j'espérais des commentaires sur le processus / algorithmes impliqués plutôt que sur du code spécifique.

This question and all comments follow the "Attribution Required."

Toutes les réponses

Translate

Vous pouvez essayer la moyenne du signal, c'est-à-dire pour chaque point, faire la moyenne de la valeur avec les 3 points ou plus environnants. Si les éclats de bruit sont énormes, même cela peut ne pas aider.

Je me rends compte que c'était indépendant du langage, mais en supposant que vous utilisez LabView, il existe de nombreux VIs de traitement de signal pré-emballés fournis avec LabView que vous pouvez utiliser pour effectuer le lissage et la réduction du bruit. leForums NIsont un excellent endroit pour obtenir une aide plus spécialisée sur ce genre de choses.

La source
Translate

Il existe de nombreuses méthodes classiques de détection des pics, dont chacune pourrait fonctionner. Vous devrez voir ce qui, en particulier, limite la qualité de vos données. Voici les descriptions de base:

  1. Entre deux points quelconques de vos données,(x(0), y(0))et(x(n), y(n)), additionnezy(i + 1) - y(i)pour0 <= i < net appelle çaT("voyage") et définirR("monter") ày(n) - y(0) + kpour convenablement petitk. T/R > 1indique un pic. Cela fonctionne bien si un déplacement important dû au bruit est peu probable ou si le bruit se répartit symétriquement autour d'une forme de courbe de base. Pour votre application, acceptez le premier pic avec un score supérieur à un seuil donné, ou analysez la courbe de déplacement par valeur de montée pour des propriétés plus intéressantes.

  2. Utilisez des filtres correspondants pour marquer la similitude avec une forme de pic standard (essentiellement, utilisez un produit scalaire normalisé contre une forme pour obtenir une métrique cosinus de similitude)

  3. Déconvolvez par rapport à une forme de crête standard et vérifiez les valeurs élevées (bien que je trouve souvent 2 pour être moins sensible au bruit pour une sortie d'instrumentation simple).

  4. Lissez les données et recherchez des triplets de points également espacés où, six0 < x1 < x2, y1 > 0.5 * (y0 + y2), ou vérifiez les distances euclidiennes comme ceci:D((x0, y0), (x1, y1)) + D((x1, y1), (x2, y2)) > D((x0, y0),(x2, y2)), qui repose sur l'inégalité triangulaire. L'utilisation de ratios simples vous fournira à nouveau un mécanisme de notation.

  5. Ajustez un modèle de mélange 2-gaussien très simple à vos données (par exemple, Numerical Recipes a un bon morceau de code prêt à l'emploi). Prenez le sommet précédent. Cela traitera correctement les pics qui se chevauchent.

  6. Trouvez la meilleure correspondance dans les données avec une simple courbe gaussienne, de Cauchy, de Poisson ou de ce que vous avez. Évaluez cette courbe sur une large plage et soustrayez-la d'une copie des données après avoir noté son emplacement de pic. Répéter. Prenez le premier pic dont les paramètres du modèle (écart-type probablement, mais certaines applications peuvent se soucier de l'aplatissement ou d'autres caractéristiques) répondent à certains critères. Méfiez-vous des artefacts laissés lorsque les pics sont soustraits des données. Le meilleur match pourrait être déterminé par le type de score de match suggéré au n ° 2 ci-dessus.

J'ai fait ce que vous faites auparavant: trouver des pics dans les données de séquence d'ADN, trouver des pics dans des dérivés estimés à partir de courbes mesurées et trouver des pics dans des histogrammes.

Je vous encourage à vous occuper attentivement de l'établissement de base approprié. Le filtrage de Wiener ou tout autre filtrage ou une simple analyse d'histogramme est souvent un moyen facile d'établir une référence en présence de bruit.

Enfin, si vos données sont généralement bruyantes et que vous récupérez des données de la carte en tant que sortie asymétrique non référencée (ou même référencée, mais pas différentielle), et si vous faites la moyenne de nombreuses observations dans chaque point de données, essayez de les trier observations et jeter le premier et le dernier quartile et faire la moyenne de ce qui reste. Il existe une multitude de tactiques d'élimination des valeurs aberrantes qui peuvent être vraiment utiles.

La source
Translate

Ce problème a été étudié en détail.

Il existe un ensemble d'implémentations très à jour dans leTSpectrum*classes deRACINE(un outil d'analyse de physique nucléaire / des particules). Le code fonctionne dans des données à une à trois dimensions.

Le code source ROOT est disponible, vous pouvez donc récupérer cette implémentation si vous le souhaitez.

DuTSpectredocumentation de classe:

Les algorithmes utilisés dans cette classe ont été publiés dans les références suivantes:

[1] M.Morhac et al.: Méthodes d'élimination de fond pour les spectres gamma à coïncidence multidimensionnelle. Instruments et méthodes nucléaires dans la recherche en physique A 401 (1997) 113-132.

[2] M.Morhac et al.: Déconvolution d'or efficace unidimensionnelle et bidimensionnelle et son application à la décomposition des spectres gamma. Instruments et méthodes nucléaires dans la recherche en physique A 401 (1997) 385-408.

[3] M.Morhac et al.: Identification des pics dans les spectres gamma à coïncidence multidimensionnelle. Instruments et méthodes nucléaires en physique de recherche A 443 (2000), 108-125.

Les articles sont liés à partir de la documentation du cours pour ceux d'entre vous qui n'ont pas d'abonnement en ligne NIM.


La version courte de ce qui est fait est que l'histogramme aplati pour éliminer le bruit, puis les maxima locaux sont détectés par force brute dans l'histogramme aplati.

La source
Translate

Je voudrais contribuer à ce fil un algorithme quiJe me suis développé:

Il est basé sur le principe dedispersion: si un nouveau point de données est un nombre x donné d'écarts-types par rapport à une moyenne mobile, l'algorithme signale (également appeléscore z). L'algorithme est très robuste car il construit unséparémoyenne et déviation mobiles, de sorte que les signaux ne corrompent pas le seuil. Les signaux futurs sont donc identifiés avec approximativement la même précision, quelle que soit la quantité de signaux précédents. L'algorithme prend 3 entrées:lag = the lag of the moving window, threshold = the z-score at which the algorithm signalsetinfluence = the influence (between 0 and 1) of new signals on the mean and standard deviation. Par exemple, unlagsur 5 utilisera les 5 dernières observations pour lisser les données. UNEthresholdde 3,5 signalera si un point de données est éloigné de 3,5 écarts-types de la moyenne mobile. Et uninfluencede 0,5 donne des signauxmoitiéde l'influence que les points de données normaux ont. De même, uninfluencede 0 ignore complètement les signaux pour recalculer le nouveau seuil: une influence de 0 est donc l'option la plus robuste.

Cela fonctionne comme suit:

Pseudocode

# 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

Démo

Demonstration of robust thresholding algorithm

> Réponse originale

La source
Translate

Cette méthode est essentiellement tirée du livre "Vision" de David Marr

Le gaussien brouille votre signal avec la largeur attendue de vos pics. cela élimine les pics de bruit et vos données de phase ne sont pas endommagées.

Puis détection de bord (LOG fera l'affaire)

Ensuite, vos bords étaient les bords des entités (comme les pics). regardez entre les bords pour les pics, triez les pics par taille et vous avez terminé.

J'ai utilisé des variantes à ce sujet et elles fonctionnent très bien.

La source
Translate

Je pense que tu veuxcorrélation croiséevotre signal avec un signal exemplaire attendu. Mais cela fait si longtemps que j'étudie le traitement du signal et même alors je n'y ai pas fait attention.

La source
Translate

Je ne connais pas grand-chose à l'instrumentation, donc cela pourrait être totalement irréalisable, mais là encore, cela pourrait être une direction différente utile. Si vous savez comment les lectures peuvent échouer et qu'il existe un certain intervalle entre les pics en raison de ces échecs, pourquoi ne pas faire une descente de gradient à chaque intervalle. Si la descente vous ramène dans une zone que vous avez déjà recherchée, vous pouvez l'abandonner. Selon la forme de la surface échantillonnée, cela peut également vous aider à trouver des pics plus rapidement que la recherche.

La source
Translate

Y a-t-il une différence qualitative entre le pic souhaité et le deuxième pic indésirable? Si les deux pics sont «nets» - c'est-à-dire de courte durée - lorsque vous regardez le signal dans le domaine fréquentiel (en faisant FFT), vous obtiendrez de l'énergie dans la plupart des bandes. Mais si le "bon" pic a une énergie fiable présente à des fréquences qui n'existent pas dans le "mauvais" pic, ou vice versa, vous pourrez peut-être les différencier automatiquement de cette façon.

La source
Translate

Vous pourriez en appliquerÉcart-typeà votre logique et notez les pics supérieurs à x%.

La source
prochain:
sql - Minuteur