scipy.signal.

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_prominences entspricht, 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_prominences als 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_peaks

Findet Spitzen in einem Signal basierend auf Gipfeleigenschaften.

peak_prominences

Berechnet 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_prominences fü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()
../../_images/scipy-signal-peak_widths-1.png