Question

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

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

Mes premières pensées sont de parcourir les lectures pour vérifier si les points précédents et suivants sont inférieurs au courant afin de trouver un pic et de 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é le Forums LAVA et il existe 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, j'espérais donc des commentaires sur le processus/les algorithmes impliqués plutôt que sur du code spécifique.

Était-ce utile?

La solution

Vous pouvez essayer la moyenne du signal, c'est-à-direpour chaque point, faites la moyenne de la valeur avec les 3 points environnants ou plus.Si les bruits 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 du signal préemballés fournis avec LabView que vous pouvez utiliser pour effectuer le lissage et la réduction du bruit.Le Forums NI sont un excellent endroit pour obtenir une aide plus spécialisée sur ce genre de choses.

Autres conseils

Il existe de très nombreuses méthodes classiques de détection des pics, et chacune d’entre elles peut fonctionner.Vous devrez voir ce qui limite en particulier 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)), additionnez y(i + 1) - y(i) pour 0 <= i < n et appelle ça T ("voyage") et définissez R ("monter") à y(n) - y(0) + k pour convenablement petit k. T/R > 1 indique un pic.Cela fonctionne correctement 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 des valeurs de déplacement par montée pour des propriétés plus intéressantes.

  2. Utilisez des filtres adaptés pour évaluer la similarité avec une forme de pic standard (essentiellement, utilisez un produit scalaire normalisé par rapport à une forme pour obtenir une métrique cosinusoïdale de similarité)

  3. Déconvolutionnez par rapport à une forme de pic standard et vérifiez les valeurs élevées (bien que je trouve souvent que 2 sont moins sensibles au bruit pour une sortie d'instrumentation simple).

  4. Lissez les données et vérifiez les triplets de points équidistants où, si x0 < 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. Adaptez un modèle de mélange à 2 gaussiens très simple à vos données (par exemple, Numerical Recipes contient un joli 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 de Gauss, de Cauchy, de Poisson ou autre.Évaluez cette courbe sur une large plage et soustrayez-la d'une copie des données après avoir noté l'emplacement de son pic.Répéter.Prenez le premier pic dont les paramètres du modèle (probablement l'écart type, mais certaines applications peuvent se soucier de l'aplatissement ou d'autres caractéristiques) répondent à certains critères.Faites attention aux artefacts laissés lorsque les pics sont soustraits des données.Le meilleur match peut être déterminé par le type de score de match suggéré au point 2 ci-dessus.

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

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

Enfin, si vos données sont généralement bruyantes et que vous extrayez des données de la carte sous forme de 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 très utiles.

Ce problème a été étudié de manière assez détaillée.

Il existe un ensemble d'implémentations très récentes dans le TSpectrum* cours de RACINE (un outil d'analyse de physique nucléaire/particule).Le code fonctionne avec des données unidimensionnelles à tridimensionnelles.

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

Du TSpectre documentation de classe :

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

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

[2] M. Morhac et al. :Efficace en une et deux dimensions Gold de la déconvolution et son application aux la décomposition des spectres des rayons gamma.Instruments et méthodes nucléaires Recherche en physique A 401 (1997) 385-408.

[3] M. Morhac et al. :Identification des pics de coïncidence multidimensionnelle gamma-ray spectres.Instruments nucléaires et Méthodes 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 est aplati pour éliminer le bruit, puis les maxima locaux sont détectés par force brute dans l'histogramme aplati.

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

Il est basé sur le principe de dispersion:si un nouveau point de données est à un nombre x d'écarts types donné d'une certaine moyenne mobile, l'algorithme signale (également appelé score z).L'algorithme est très robuste car il construit un séparé moyenne mobile et déviation, de telle sorte que les signaux ne corrompent pas le seuil.Les signaux futurs sont donc identifiés avec à peu près 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 signals et influence = the influence (between 0 and 1) of new signals on the mean and standard deviation.Par exemple, un lag sur 5 utilisera les 5 dernières observations pour lisser les données.UN threshold de 3,5 signalera si un point de données est à 3,5 écarts types de la moyenne mobile.Et un influence de 0,5 donne des signaux moitié de l’influence qu’ont les points de données normaux.De même, un influence de 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

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

Le flou gaussien de 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).recherchez les pics entre les bords, triez les pics par taille et vous avez terminé.

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

Je pense que tu veux corrélation croisée votre signal avec un signal attendu et exemplaire.Mais cela fait tellement longtemps que je n’ai pas étudié le traitement du signal et même alors, je n’y ai pas beaucoup prêté attention.

Je ne connais pas grand-chose en instrumentation, donc cela pourrait être totalement peu pratique, 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 cas de tels échecs, pourquoi ne pas effectuer une descente de gradient à chaque intervalle.Si la descente vous ramène dans une zone déjà recherchée, vous pouvez l'abandonner.En fonction de la forme de la surface échantillonnée, cela peut également vous aider à trouver des pics plus rapidement qu'une recherche.

Existe-t-il une différence qualitative entre le pic souhaité et le deuxième pic non désiré ?Si les deux pics sont « nets », c'est-à-direcourte durée - lorsque vous regardez le signal dans le domaine fréquentiel (en effectuant la FFT), vous obtiendrez de l'énergie dans la plupart des bandes.Mais si le « bon » pic a de l'énergie présente de manière fiable à 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.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top