Question

Je peux écrire quelque chose moi-même en trouvant des passages par zéro de la dérivée première ou quelque chose, mais il semble comme une fonction assez-commune à inclure dans les bibliothèques standard. Quelqu'un sait d'un?

Mon application particulière est un tableau 2D, mais il serait habituellement utilisé pour trouver des pics dans TFR, etc.

Plus précisément, dans ce genre de problèmes, il y a plusieurs pics forts, et puis beaucoup de petits « pics » qui sont simplement causés par le bruit qui doit être ignorée. Ce ne sont que des exemples; pas mes données réelles:

1 pics dimensions:

 sortie de FFT avec des pics

pics en 2 dimensions:

transformée de Radon sortie avec un pic cerclée

L'algorithme de pointe trouver trouverait l'emplacement de ces pics (pas seulement leurs valeurs), et devrait idéalement trouver le vrai sommet inter-échantillon, non seulement l'indice avec une valeur maximale, en utilisant probablement interpolation quadratique ou quelque chose.

En général, vous ne se soucient quelques pics forts, de sorte qu'ils avaient soit être choisis parce qu'ils sont au-dessus d'un certain seuil, ou parce qu'ils sont les premiers sommets d'une liste ordonnée n , selon leur indice d'amplitude.

Comme je l'ai dit, je sais comment écrire quelque chose comme moi-même. Je demande simplement s'il y a une fonction pré-existante ou package qui est connu pour bien fonctionner.

Mise à jour:

traduit un script Matlab et il fonctionne décemment pour le cas 1-D, mais pourrait être mieux .

Mise à jour Mise à jour:

a créé une meilleure version pour le cas 1-D.

Était-ce utile?

La solution

Je ne pense pas que ce que vous recherchez est fourni par SciPy. Je voudrais écrire le code moi-même, dans cette situation.

L'interpolation spline et le lissage de scipy.interpolate sont tout à fait agréable et peut être très utile dans les pics de montage, puis de trouver l'emplacement de leur maximum.

Autres conseils

Je suis à la recherche à un problème similaire, et je l'ai trouvé quelques-unes des meilleures références proviennent de la chimie (des pics de trouver des données-spectrométrie de masse). Pour un bon examen approfondi des algorithmes de recherche pic lire cette . Ceci est l'un des meilleurs critiques les plus clairs des techniques de pointe de constatation que j'ai couru à travers. (Ondelettes sont les meilleurs pour trouver des pics de ce genre dans les données bruyantes.).

On dirait que vos pics sont clairement définis et ne sont pas cachés dans le bruit. Cela étant le cas, je vous recommande d'utiliser des dérivés savtizky-Golay lisses pour trouver les pics (Si vous différencier uniquement les données ci-dessus, vous aurez un gâchis de faux positifs.). Ceci est une technique très efficace et il est assez facile à mis en place (vous avez besoin d'une classe de matrice w / opérations de base). Si vous trouvez simplement le passage à zéro de la dérivée première S-G Je pense que vous serez heureux.

La fonction scipy.signal.find_peaks , comme son nom l'indique, est utile pour cela. Mais il est important de bien comprendre ses paramètres width, threshold, distance et surtout prominence pour obtenir une bonne extraction de pointe.

D'après mes tests et la documentation, le concept de proéminence est « le concept utile » pour garder les bons pics, et jeter les pics bruyants.

Quelle est (topographique) importance? Il est « la hauteur minimale nécessaire pour descendre pour obtenir du sommet à tout type de terrain supérieur » , comme on peut le voir ici:

 ici

L'idée est:

  

Plus l'importance, plus "important" le pic est.

Test:

 ici

J'ai utilisé un (bruyant) sinusoïde de fréquence variable dans le but, car il montre beaucoup de difficultés. Nous pouvons voir que le paramètre width est pas très utile ici parce que si vous définissez un width minimum trop élevé, alors il ne sera pas en mesure de suivre des pics très proches dans la partie haute fréquence. Si vous définissez width trop bas, vous auriez beaucoup de pics indésirables dans la partie gauche du signal. Même problème avec distance. threshold compare uniquement avec les voisins directs, ce qui est pas utile ici. prominence est celui qui donne la meilleure solution. Notez que vous pouvez combiner plusieurs de ces paramètres!

Code:

import numpy as np
import matplotlib.pyplot as plt 
from scipy.signal import find_peaks

x = np.sin(2*np.pi*(2**np.linspace(2,10,1000))*np.arange(1000)/48000) + np.random.normal(0, 1, 1000) * 0.15
peaks, _ = find_peaks(x, distance=20)
peaks2, _ = find_peaks(x, prominence=1)      # BEST!
peaks3, _ = find_peaks(x, width=20)
peaks4, _ = find_peaks(x, threshold=0.4)     # Required vertical distance to its direct neighbouring samples, pretty useless
plt.subplot(2, 2, 1)
plt.plot(peaks, x[peaks], "xr"); plt.plot(x); plt.legend(['distance'])
plt.subplot(2, 2, 2)
plt.plot(peaks2, x[peaks2], "ob"); plt.plot(x); plt.legend(['prominence'])
plt.subplot(2, 2, 3)
plt.plot(peaks3, x[peaks3], "vg"); plt.plot(x); plt.legend(['width'])
plt.subplot(2, 2, 4)
plt.plot(peaks4, x[peaks4], "xk"); plt.plot(x); plt.legend(['threshold'])
plt.show()

Il y a une fonction nommée scipy scipy.signal.find_peaks_cwt qui sonne comme est adapté à vos besoins, mais je n'ai pas l'expérience avec elle, je ne peux pas recommander ..

http://docs.scipy.org/ doc / scipy / référence / produit / scipy.signal.find_peaks_cwt.html

Pour ceux qui ne sûr que des algorithmes de pointe à utiliser la recherche en Python, voici un aperçu rapide des alternatives: https://github.com/MonsieurV/py-findpeaks

me Désirant un équivalent à la fonction findpeaks MatLab, j'ai trouvé que le fonction detect_peaks de Marcos Duarte est une bonne prise.

Assez facile à utiliser:

import numpy as np
from vector import vector, plot_peaks
from libs import detect_peaks
print('Detect peaks with minimum height and distance filters.')
indexes = detect_peaks.detect_peaks(vector, mph=7, mpd=2)
print('Peaks are: %s' % (indexes))

Ce qui vous donnera:

 résultats detect_peaks

pics dans un spectre Détection de manière fiable a été étudié un peu, par exemple tous les travaux sur la modélisation sinusoïdale pour la musique / signaux audio dans les années '80. Cherchez « Modélisation sinusoïdales » dans la littérature.

Si vos signaux sont aussi propres que l'exemple, un simple « me donner quelque chose avec une amplitude plus élevée que les voisins N » devrait fonctionner raisonnablement bien. Si vous avez des signaux bruyants, d'une manière simple mais efficace est de regarder vos pics dans le temps, pour les suivre: vous détectez alors des raies spectrales au lieu de pics spectraux. OIEau, vous calculer la FFT sur une fenêtre glissante de votre signal, pour obtenir un ensemble de fréquences dans le temps (aussi appelé spectrogramme). Vous regardez ensuite l'évolution du pic spectral dans le temps (par exemple dans des fenêtres consécutives).

Il existe des fonctions et des méthodes statistiques standard pour trouver des valeurs aberrantes à des données, ce qui est probablement ce que vous avez besoin dans le premier cas. L'utilisation des dérivés résoudrait votre deuxième. Je ne suis pas sûr d'une méthode qui permet de résoudre les deux fonctions continues et des données échantillonnées, cependant.

Tout d'abord, la définition de « pic » est vague si sans informations supplémentaires. Par exemple, pour la série suivante, appelleriez-vous 5-4-5 un pic ou deux?

1-2-1-2-1-1-5-4-5-1-1-5-1

Dans ce cas, vous aurez besoin d'au moins deux seuils: 1) un seuil élevé qu'au-dessus qui peut un registre de valeur extrême comme un pic; et 2) un seuil bas de sorte que les valeurs extrêmes séparées par de petites valeurs ci-dessous, il deviendra deux pics.

détection de crête est un sujet bien étudié dans la littérature théorie des valeurs extrêmes, aussi connu comme « declustering des valeurs extrêmes ». Ses applications typiques comprennent l'identification des événements de risque en fonction des lectures continues des variables environnementales par exemple l'analyse de la vitesse du vent pour détecter les tempêtes.

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