Détection de crête du signal mesuré

Nous utilisons une carte d’acquisition de données pour prendre des mesures à partir d’un périphérique qui augmente son signal jusqu’à un pic et retombe ensuite à proximité de la valeur d’origine. Pour trouver la valeur de crête, nous recherchons actuellement la valeur la plus élevée dans la masortingce et utilisons l’index pour déterminer la synchronisation de la valeur de crête utilisée dans nos calculs.

Cela fonctionne bien si la valeur la plus élevée correspond au pic que nous recherchons, mais si le périphérique ne fonctionne pas correctement, nous pouvons voir un deuxième pic qui peut être supérieur au pic initial. Nous prenons 10 lectures par seconde 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 un certain nombre de points de part et d’autre 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é les 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 VI non standard. J’espérais donc avoir des commentaires sur le processus / les algorithmes impliqués plutôt qu’un code spécifique.

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

Je me rends compte que cela ne dépend pas de la langue, mais en supposant que vous utilisez LabView, il existe de nombreux VIs de traitement des signaux préemballés fournis avec LabView que vous pouvez utiliser pour faire du lissage et de la réduction du bruit. Les forums NI sont un endroit idéal pour obtenir une aide plus spécialisée sur ce genre de choses.

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

  1. Entre deux points dans vos données, (x(0), y(0)) et (x(n), y(n)) , additionnez y(i + 1) - y(i) pour 0 <= i < n et appelez ce T ("travel") et mettez R ("rise") à y(n) - y(0) + k pour y(n) - y(0) + k convenablement petit. 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 de manière symésortingque autour d'une courbe de base. Pour votre application, acceptez le premier pic avec un score supérieur à un seuil donné, ou parsingz la courbe de déplacement par valeur de montée pour obtenir des propriétés plus intéressantes.

  2. Utilisez des filtres adaptés pour obtenir une similarité avec une forme de pic standard (essentiellement, utilisez un produit scalaire normalisé par rapport à une forme quelconque pour obtenir une mésortingque de similarité en cosinus)

  3. Déconvolez-vous contre une forme de pic 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. Lisser les données et vérifier les sortingplets de points équidistants où, si x0 < x1 < x2, y1 > 0.5 * (y0 + y2) , ou vérifier 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é du sortingangle. L'utilisation de ratios simples vous fournira à nouveau un mécanisme de notation.

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

  6. Trouvez la meilleure correspondance dans les données avec une courbe simple de Gauss, Cauchy, Poisson ou What-You-You. Évaluez cette courbe sur une large plage et soustrayez-la d'une copie des données après avoir noté son emplacement maximal. Répéter. Prenez le premier pic dont les parameters du modèle (écart type probablement, mais certaines applications peuvent se soucier de kurtosis ou d'autres caractéristiques) répondent à certains critères. Faites attention aux artefacts laissés derrière lorsque les pics sont soustraits des données. Le meilleur match pourrait être déterminé par le type de pointage de match suggéré au point 2 ci-dessus.

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

Je vous encourage à suivre attentivement les recommandations de base. Le filtrage de Wiener ou tout autre filtrage ou parsing d'histogramme simple est souvent un moyen facile de faire le point en présence de bruit.

Enfin, si vos données sont généralement bruyantes et que vous obtenez des données de la carte en tant que sortie asymésortingque 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 sharepoint données, essayez de les sortinger observations et jeter le premier et le dernier quartile et la moyenne de ce qui rest. Il existe de nombreuses tactiques d’élimination des aberrations qui peuvent être très utiles.

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

Il existe une série de mises à jour très récentes dans les classes TSpectrum* de ROOT (un outil d’parsing de la physique nucléaire / des particules). Le code fonctionne en données un à trois dimensions.

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

De la documentation de la classe TSpectrum :

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 nucléaires et méthodes de recherche en physique A 401 (1997) 113-132.

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

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

Les documents sont liés à la documentation de la classe pour ceux qui ne possèdent 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.

Je voudrais consortingbuer à ce fil un algorithme que j’ai moi – même développé :

Il est basé sur le principe de la dispersion : si un nouveau sharepoint donnée est un nombre x donné d’écart-types par rapport à une moyenne mobile, l’algorithme signale (également appelé z-score ). L’algorithme est très robuste car il construit une moyenne mobile et une déviation distinctes , de sorte que les signaux ne corrompent pas le seuil. Les signaux futurs sont donc identifiés avec approximativement la même précision, indépendamment de 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 de 5 utilisera les 5 dernières observations pour lisser les données. Un threshold de 3,5 signalera si un sharepoint données est à 3,5 écarts-types de la moyenne mobile. Et une influence de 0,5 donne aux signaux la moitié de l’influence des points de données normaux. De même, une 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

Démonstration de l'algorithme de seuillage robuste

> Réponse originale

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

Gaussian flou 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, sortingez les pics par taille et vous avez terminé.

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

Je pense que vous voulez corréler votre signal avec un signal attendu et exemplaire. Mais cela fait si longtemps que j’ai étudié le traitement du signal et même à ce moment-là, je n’ai pas pris beaucoup de temps.

Vous pouvez appliquer une définition standard à votre logique et prendre note des pics supérieurs à x%.

Je ne connais pas grand chose à l’instrumentation, donc cela pourrait être totalement impraticable, mais là encore, cela pourrait être une autre direction utile. Si vous savez que les lectures peuvent échouer et qu’il y a un certain intervalle entre les pics à cause de telles défaillances, pourquoi ne pas effectuer une descente en gradient à chaque intervalle. Si la descente vous ramène à 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.

Existe-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 effectuant une FFT), vous obtiendrez de l’énergie dans la plupart des bandes. Mais si le “bon” pic possède de manière fiable de l’énergie présente à des fréquences qui n’existent pas dans le “mauvais” pic, ou vice versa, vous pourrez peut-être les différencier automatiquement.