Outils pour utilisateurs

Outils du site


detection_pics_signal

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
detection_pics_signal [2019/11/29 12:33] josephdetection_pics_signal [2019/11/29 12:37] (Version actuelle) joseph
Ligne 1: Ligne 1:
 <markdown> <markdown>
-# Comment trouver les pics d'un signal?+# Comment trouver les pics d'un signal ?
  
 En traitement du signal, trouver les pics ("peaks" en anglais) peut être assez utile. Comment faire cela en Python ? En traitement du signal, trouver les pics ("peaks" en anglais) peut être assez utile. Comment faire cela en Python ?
Ligne 21: Ligne 21:
  
 J'ai utilisé une sinusoïde bruitée dont la fréquence varie, volontairement, parce qu'elle présente de nombreuses difficultés. Nous pouvons voir que le paramètre `width` n'est pas très utile ici parce que si on définit une largeur minimale trop élevée, alors il ne pourra pas suivre les pics très proches dans la partie haute fréquence. Si on règle la largeur trop bas, on aura beaucoup de pics indésirables dans la partie gauche du signal. Même problème avec `distance`. `threshold` ne compare qu'aux voisins directs, ce qui n'est pas utile ici. `prominence` est celle qui donne la meilleure solution. Notez que l'on peut combiner plusieurs de ces paramètres ! (issu d'une réponse que j'ai postée sur stackoverflow). J'ai utilisé une sinusoïde bruitée dont la fréquence varie, volontairement, parce qu'elle présente de nombreuses difficultés. Nous pouvons voir que le paramètre `width` n'est pas très utile ici parce que si on définit une largeur minimale trop élevée, alors il ne pourra pas suivre les pics très proches dans la partie haute fréquence. Si on règle la largeur trop bas, on aura beaucoup de pics indésirables dans la partie gauche du signal. Même problème avec `distance`. `threshold` ne compare qu'aux voisins directs, ce qui n'est pas utile ici. `prominence` est celle qui donne la meilleure solution. Notez que l'on peut combiner plusieurs de ces paramètres ! (issu d'une réponse que j'ai postée sur stackoverflow).
 +
 +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)      # MEILLEURE SOLUTION
 +peaks3, _ = find_peaks(x, width=20)
 +peaks4, _ = find_peaks(x, threshold=0.4)     
 +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()
 +~~~
 +
 </markdown> </markdown>
 +
  
 {{tag>dsp traitement-du-signal peak-finding joseph}} {{tag>dsp traitement-du-signal peak-finding joseph}}
detection_pics_signal.1575030827.txt.gz · Dernière modification : 2019/11/29 12:33 de joseph