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