scipy.signal.

peak_widths#

scipy.signal.peak_widths(x, пики, rel_height=0.5, prominence_data=None, wlen=None)[источник]#

Вычислить ширину каждого пика в сигнале.

Эта функция вычисляет ширину пика в выборках на относительном расстоянии до высоты и значимости пика.

Параметры:
xпоследовательность

Сигнал с пиками.

пикипоследовательность

Индексы пиков в x.

rel_heightfloat, опционально

Выбирает относительную высоту, на которой измеряется ширина пика, в процентах от его выступа. 1.0 вычисляет ширину пика на его самой низкой контурной линии, а 0.5 оценивает на половине высоты выступа. Должно быть не менее 0. См. примечания для дальнейшего объяснения.

prominence_dataкортеж, необязательный

Кортеж из трёх массивов, соответствующий выводу peak_prominences при вызове с теми же аргументами x и пики. Эти данные вычисляются внутренне, если не предоставлены.

wlenint, необязательный

Длина окна в выборках, передаваемая в peak_prominences как необязательный аргумент для внутреннего вычисления prominence_data. Этот аргумент игнорируется, если prominence_data задано.

Возвращает:
шириныndarray

Ширины для каждого пика в выборках.

width_heightsndarray

Высота контурных линий, на которых ширины где вычислено.

left_ips, right_ipsndarray

Интерполированные позиции левой и правой точек пересечения горизонтальной линии на соответствующей высоте оценки.

Вызывает:
ValueError

Если prominence_data предоставлен, но не удовлетворяет условию 0 <= left_base <= peak <= right_base < x.shape[0] для каждого пика, имеет неправильный тип данных, не является C-непрерывным или не имеет той же формы.

Предупреждает:
PeakPropertyWarning

Возникает, если любая вычисленная ширина равна 0. Это может быть вызвано предоставленными prominence_data или если rel_height установлено в 0.

Предупреждение

Эта функция может возвращать неожиданные результаты для данных, содержащих NaN. Чтобы избежать этого, NaN следует либо удалить, либо заменить.

Смотрите также

find_peaks

Найти пики внутри сигнала на основе свойств пиков.

peak_prominences

Вычислить выдающуюся высоту пиков.

Примечания

Базовый алгоритм вычисления ширины пика следующий:

  • Вычислить высоту оценки \(h_{eval}\) по формуле \(h_{eval} = h_{Peak} - P \cdot R\), где \(h_{Peak}\) является высотой самого пика, \(P\) это значимость пика и \(R\) положительное отношение, заданное аргументом rel_height.

  • Провести горизонтальную линию на высоте оценки в обе стороны, начиная с текущей вертикальной позиции пика, пока линии либо не пересекут склон, границу сигнала или не пересекут вертикальную позицию основания пика (см. peak_prominences для определения). Для первого случая, пересечение с сигналом, истинная точка пересечения оценивается с помощью линейной интерполяции.

  • Вычислите ширину как горизонтальное расстояние между выбранными конечными точками с обеих сторон. Как следствие, максимально возможная ширина для каждого пика — это горизонтальное расстояние между его основаниями.

Как показано выше, для вычисления ширины пика необходимо знать его выступ и основания. Вы можете предоставить их самостоятельно с помощью аргумента prominence_data. В противном случае они вычисляются внутренне (см. peak_prominences).

Добавлено в версии 1.1.0.

Примеры

>>> import numpy as np
>>> from scipy.signal import chirp, find_peaks, peak_widths
>>> import matplotlib.pyplot as plt

Создать тестовый сигнал с двумя наложенными гармониками

>>> x = np.linspace(0, 6 * np.pi, 1000)
>>> x = np.sin(x) + 0.6 * np.sin(2.6 * x)

Найти все пики и вычислить их ширины на относительной высоте 0.5 (линия контура на половине высоты prominence) и 1 (на самой нижней линии контура на полной высоте prominence).

>>> 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])

Построить сигнал, пики и контурные линии, на которых были рассчитаны ширины

>>> 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