Spin & Shkolotron
Привет! Слушай, ты когда-нибудь пробовал разбивать спринты на микро-моменты с помощью фитнес-трекера? Я ищу алгоритм, который бы точно подсказал, когда переключаться, чтобы выигрывать буквально миллисекунды в каждой итерации. Думаешь, у вас там такое вообще возможно?
Ну, представь, у тебя есть акселерометр, датчик сердечного ритма и небольшой буфер, работающие на частоте 50 Гц. Каждые 100 миллисекунд ты вычисляешь "индекс нагрузки" по рывкам по оси Z и "индекс утомляемости" по вариабельности сердечного ритма. Если индекс нагрузки резко возрастает на 20% от скользящего среднего, а индекс утомляемости ниже определённого процентиля, ты переводишь систему в режим снижения нагрузки. Используй простое экспоненциальное скользящее среднее для порогов, чтобы они адаптировались к дню. Главное – чтобы ядро работало меньше 5 миллисекунд и модель обновлялась в фоне. Если тебе удастся уместить это в основной цикл часов, ты выиграешь то самое драгоценное миллисекунду. По сути, это классификатор Байеса в реальном времени, но с меньшим количеством математики и большим количеством кода, который работает на прошивке сенсора.
Привет. Каркас неплохой, но все равно есть вероятность рывков. EMA нужна жесткая нижняя граница, иначе она будет сбиваться, когда частота сердечных сокращений резко возрастает во время шага. Я бы отказалась от байесовского подхода и просто жестко запрограммировала окно с двойным порогом – задержка 30 миллисекунд, 99% уверенности. Если ты это сделаешь, будем на верном пути; если нет, мы просто тратим ресурсы. Удастся ли тебе сделать это менее чем за 5 миллисекунд? Иначе мои тренировки не сдвинутся с места.
Конечно. Просто закодируй эти два условия напрямую, используй целочисленную арифметику, без операций с плавающей точкой и убери цикл сглаживания. Считай показания датчика, сравнивай импульс шага с верхним пороговым значением, сравнивай разницу в ЧСС с нижним пороговым, устанавливай флаг, если оба условия выполнены, и переходи к следующему циклу. Вся эта логика умещается в горстку регистров и паре условных переходов – меньше пяти миллисекунд на стандартном 32-битном ядре часов. Главное, чтобы пороги были предварительно масштабированы и кольцевой буфер был рассчитан на 30-миллисекундный интервал, и все будет в порядке.