peak_widths#
- scipy.signal.peak_widths(x, peaks, rel_height=0.5, prominence_data=None, wlen=None)[Quelle]#
Berechnet die Breite jedes Peaks in einem Signal.
Diese Funktion berechnet die Breite eines Peaks in Samples in einem relativen Abstand zur Höhe und Prominenz des Peaks.
- Parameter:
- xSequenz
Ein Signal mit Peaks.
- peaksSequenz
Indizes der Peaks in x.
- rel_heightfloat, optional
Wählt die relative Höhe, bei der die Peakbreite als Prozentsatz seiner Prominenz gemessen wird. 1.0 berechnet die Breite des Peaks auf seiner niedrigsten Konturlinie, während 0.5 bei halber Prominenzhöhe ausgewertet wird. Muss mindestens 0 sein. Weitere Erklärungen finden Sie in den Hinweisen.
- prominence_datatuple, optional
Ein Tupel aus drei Arrays, das der Ausgabe von
peak_prominencesentspricht, wenn es mit denselben Argumenten x und peaks aufgerufen wird. Diese Daten werden intern berechnet, wenn sie nicht bereitgestellt werden.- wlenint, optional
Eine Fensterlänge in Samples, die an
peak_prominencesals optionales Argument für die interne Berechnung von prominence_data übergeben wird. Dieses Argument wird ignoriert, wenn prominence_data angegeben ist.
- Rückgabe:
- widthsndarray
Die Breiten für jeden Peak in Samples.
- width_heightsndarray
Die Höhe der Konturlinien, bei denen die widths ausgewertet wurden.
- left_ips, right_ipsndarray
Interpolierte Positionen der linken und rechten Schnittpunkte einer horizontalen Linie auf der jeweiligen Auswertungshöhe.
- Löst aus:
- ValueError
Wenn prominence_data bereitgestellt wird, aber die Bedingung
0 <= left_base <= peak <= right_base < x.shape[0]für jeden Peak nicht erfüllt ist, den falschen Datentyp hat, nicht C-kontinuierlich ist oder nicht die gleiche Form hat.
- Warnungen:
- PeakPropertyWarning
Ausgelöst, wenn eine berechnete Breite 0 ist. Dies kann von den bereitgestellten prominence_data herrühren oder wenn rel_height auf 0 gesetzt ist.
Warnung
Diese Funktion kann unerwartete Ergebnisse für Daten mit NaNs liefern. Um dies zu vermeiden, sollten NaNs entweder entfernt oder ersetzt werden.
Siehe auch
find_peaksFindet Spitzen in einem Signal basierend auf Gipfeleigenschaften.
peak_prominencesBerechnet die Prominenz von Peaks.
Hinweise
Der grundlegende Algorithmus zur Berechnung der Breite eines Peaks lautet wie folgt:
Berechnen Sie die Auswertungshöhe \(h_{eval}\) mit der Formel \(h_{eval} = h_{Peak} - P \cdot R\), wobei \(h_{Peak}\) die Höhe des Peaks selbst ist, \(P\) die Prominenz des Peaks ist und \(R\) ein positives Verhältnis ist, das mit dem Argument rel_height angegeben wird.
Zeichnen Sie eine horizontale Linie auf der Auswertungshöhe zu beiden Seiten, beginnend an der aktuellen vertikalen Position des Peaks, bis die Linien entweder auf eine Steigung, den Signalrand treffen oder die vertikale Position der Basis des Peaks kreuzen (siehe
peak_prominencesfür eine Definition). Im ersten Fall, der Schnittstelle mit dem Signal, wird der wahre Schnittpunkt durch lineare Interpolation geschätzt.Berechnen Sie die Breite als den horizontalen Abstand zwischen den gewählten Endpunkten auf beiden Seiten. Daraus ergibt sich, dass die maximal mögliche Breite für jeden Peak der horizontale Abstand zwischen seinen Basen ist.
Wie oben gezeigt, müssen zur Berechnung der Breite eines Peaks seine Prominenz und seine Basen bekannt sein. Sie können diese selbst mit dem Argument prominence_data bereitstellen. Andernfalls werden sie intern berechnet (siehe
peak_prominences).Hinzugefügt in Version 1.1.0.
Beispiele
>>> import numpy as np >>> from scipy.signal import chirp, find_peaks, peak_widths >>> import matplotlib.pyplot as plt
Erstellen Sie ein Testsignal mit zwei überlagerten Harmonischen
>>> x = np.linspace(0, 6 * np.pi, 1000) >>> x = np.sin(x) + 0.6 * np.sin(2.6 * x)
Finden Sie alle Peaks und berechnen Sie ihre Breiten bei der relativen Höhe von 0,5 (Konturlinie bei halber Prominenzhöhe) und 1 (bei der niedrigsten Konturlinie bei voller Prominenzhöhe).
>>> peaks, _ = find_peaks(x) >>> results_half = peak_widths(x, peaks, rel_height=0.5) >>> results_half[0] # widths array([ 64.25172825, 41.29465463, 35.46943289, 104.71586081, 35.46729324, 41.30429622, 181.93835853, 45.37078546]) >>> results_full = peak_widths(x, peaks, rel_height=1) >>> results_full[0] # widths array([181.9396084 , 72.99284945, 61.28657872, 373.84622694, 61.78404617, 72.48822812, 253.09161876, 79.36860878])
Zeichnen Sie das Signal, die Peaks und die Konturlinien, bei denen die Breiten berechnet wurden
>>> plt.plot(x) >>> plt.plot(peaks, x[peaks], "x") >>> plt.hlines(*results_half[1:], color="C2") >>> plt.hlines(*results_full[1:], color="C3") >>> plt.show()