Частью этой головоломки является " обнаружение начала ", и для решения этой проблемы был написан ряд сложных алгоритмов. Вот больше информации о onsets .
Следующая часть - это Расстояние Хэмминга . Эти алгоритмы позволяют выполнять нечеткие сравнения, входные данные представляют собой 2 массива, а выходные данные представляют собой целочисленное «расстояние» или разницу между двумя наборами данных. Чем меньше число, тем более похожи 2. Это очень близко к тому, что вам нужно, но это не точно. Я сделал несколько изменений в алгоритме расстояния Хэмминга, чтобы вычислить новое расстояние, у него, вероятно, есть имя, но я не знаю, что это такое. По сути, это суммирует абсолютное расстояние между каждым элементом в массиве и возвращает общее количество. Вот код для этого в Python.
import math
def absolute_distance(a1, a2, length):
total_distance=0
for x in range(0,length):
total_distance+=math.fabs(a1[x]-a2[x])
return total_distance
print(absolute_distance([1,3,9,10],[1,3,8,11],4))
Этот скрипт выводит 2, которое является расстоянием между этими двумя массивами.
Теперь, чтобы собрать эти кусочки. Вы можете использовать Обнаружение начала, чтобы найти начало всех волн в наборе данных. Затем вы можете зациклить эти места, сравнивая каждую волну с образцом P-Wave. Если вы нажмете на QRS Complex, расстояние будет самым большим. Если вы нажмете еще одну P-волну, число не будет равно нулю, но будет намного меньше. Расстояние между любой Р-волной и любой Т-волной будет довольно небольшим, ОДНАКО это не проблема, если вы сделаете следующее предположение:
The distance between any p-wave and any other p-wave will be smaller than the distance between any p-wave and any t-wave.
Ряд выглядит примерно так: pQtpQtpQt ... Р-волна и Т-волна находятся рядом друг с другом, но поскольку эта последовательность предсказуема, ее будет легче читать.
С другой стороны, вероятно, существует решение этой задачи на основе исчисления. Однако в моем понимании подгонка кривых и интегралы делают эту проблему более беспорядочной. Функция расстояния, которую я написал, найдет разность площадей , которая очень похожа, вычитая интеграл обеих кривых.
Возможно, можно пожертвовать начальными вычислениями в пользу итерации по 1 точке за раз и, таким образом, выполнять вычисления расстояния O (n), где n - количество точек на графике. Если бы у вас был список всех этих вычислений расстояний и вы знали, где 50 последовательностей pQt, то вы знали бы 50 самых коротких расстояний, которые не перекрывают , где все местоположения p-волн. Бинго! Как это для простоты? Однако компромисс - это потеря эффективности из-за увеличения числа расчетов расстояния.