Современная электроника №8/2026

ИНЖЕНЕРНЫЕ РЕШЕНИЯ 9 WWW.CTA.RU СОВРЕМЕННАЯ ЭЛЕКТРОНИКА • № 8 / 2026 ми измерениями. Это приводит к трём критическим проблемам: ● взаимная компенсация (эффект ма- скировки): если по оси X значение равно +10, а по оси Y равно –10, их сумма даст 0. Для системы это будет выглядеть как полное отсутствие ак- тивности, хотя на самом деле прои- зошло сильное движение по двум направлениям; ● потеря вектора (подмена источни- ка): сумма X = 10, Y = 0, Z = 0 равна 10. Сумма X = 0, Y = 10, Z = 0 тоже рав- на 10. Получив на выходе число 10, алгоритм не сможет определить, по какой именно оси (или осям) при- шёл сигнал; ● физическая некорректность: с точки зрения геометрии сложение коорди- нат разных осей напрямую наруша- ет правила векторных пространств. Для решения проблемы суммирова- ния трёх осей необходимо: ● вычисление модуля вектора, что- бы получить единое общее значе- ние (интенсивность, силу) и гаран- тировать, что показатели одной оси не будут подменяться другими при сохранении весов [5]; ● исключение компенсации: возве- дение в квадрат убирает знаки ми- нус. Любое отклонение по любой из осей всегда увеличивает итоговый результат; ● равноправие осей: каждая ось вно- сит свой независимый вклад в «энергию» общего сигнала. Значе- ния не поглощают друг друга; ● структурирование данных в коде, чтобы избежать случайной подме- ны осей на этапе вычислений. Дан- ные должны быть изолированы на уровне архитектуры; ● в качестве дополнительного бонуса рассчитаем пиковые значения ам- плитуд и частот сигналов осей. Рекомендации по созданию библи- отеки. 1. Не следует использовать динами- ческое выделение памяти (malloc/ free), поскольку в микроконтролле- рах, особенно при реализации задач TinyML/ML, использование динами- ческой памяти обычно не рекомен- дуется. 2. Для STM32F407 (ядро Cortex-M4 с ап- паратным модулем вычислений с плавающей запятой FPU) опти- мальным решением является ис- пользование официальной и глубо- ко оптимизированной библиотеки CMSIS-DSP. Она выполняет FFT [6] в несколько раз быстрее алгоритмов, написанных без CMSIS-DSP, благода- ря применению SIMD-инструкций процессора. Преимущество данного подхода для STM32F407 – экономия тактов CPU: библиотека CMSIS-DSP написана разработчиками ARM на ассемблере с использованием инструкций SIMD, что позволяет обрабатывать 64 точки за микросекунды. Алгоритм нашей модели MML с использованием инструкции ARM CMSIS-DSP. // Некоторые глобальные объявления: #define LERN 10 // Количество циклов обучения #define LEN_WINDOWS 64 // Длина окна (степень двойки для FFT) #define NUM_FEATURES 3 // Количество извлекаемых признаков // Структура нашей модели MML typedef struct { float weights_AxisX[LERN] __attribute__ ((aligned(4))); // Веса оси X float weights_AxisY[LERN] __attribute__ ((aligned(4))); // Веса оси Y float weights_AxisZ[LERN] __attribute__ ((aligned(4))); // Веса оси Z float weights_sqr[LERN] __attribute__ ((aligned(4))); // Веса среднего значе- ния сигнала float bias; // Смещение } MML_Model_t; Три основные функции: 1. Инициализация математиче- ских модулей – anomalydetection_ init(void). 2. Обучениемодели – anomalydetection_ learn(float *inBuff). 3. Распознавание схожести  – anomalydetection_detect(float *inBuff, uint8_t *similarity). В функции инициализации проис- ходит: ● инициализация и заполнение всех массивов нулями; ● инициализация структуры FFT (RFFT) из библиотеки CMSIS-DSP. В функции обучения модели: ● происходит режим сбора данных – по 64 отсчёта для трёх осей X, Y, Z с акселерометра; ● оконное преобразование Фурье (STFT) – 64 значения в окне для каж- дой оси; ● извлекаются признаки частоты, пи- ковой амплитуды и общей энергии сигнала для трёх осей; ● обучение модели (сохранение веса для каждой оси X, Y, Z). В функции распознавания схожести: ● происходит режим сбора данных – по 64 отсчёта для трёх осей X, Y, Z с акселерометра; ● оконное преобразование Фурье (STFT) – 64 значения в окне для каж- дой оси; ● расчёт степени сходства на основе среднеквадратичной ошибки (RMSE/ RMS). В функции обучения модели и рас- познавания схожести используется одна функция: функция сбора дан- ных – 64 отсчёта для трёх осей X, Y, Z с акселерометра и оконное преобра- зование Фурье (STFT) – 64 значения в окне для каждой оси. MML_apply_stft_3axis( float *inBuff, float32_t *outFeatures, float32_t *outAxis_ XYZ, int window_size); Разберём её более подробно. ● Из общего входного отсчёта, состо- ящего из 64 значений для осей X, Y, Z, выделим массивы для каждой из осей X, Y, Z соответственно. standard_x[i]; // семпл – эталон оси X. standard_y[i]; // семпл – эталон оси Y. standard_z[i]; // семпл – эталон оси Z. ● Расчёт математических признаков спектра. Ищем доминирующую ча- стоту. arm_max_f32(&magnitude_buffer[1], (LEN_WINDOWS / 2) - 1, &max_ magnitude, &max_index); ● Используем векторную функцию CMSIS для поиска максимума ам- плитуды. ● Считаем среднюю мощность спек- тра через векторное суммирование CMSIS. arm_mean_f32(magnitude_ buffer, LEN_WINDOWS / 2, &sum_ magnitude); // Получаем признаки сигнала для каждой оси для оси X, Y, Z. features[0] = max_magnitude; // Пиковая амплитуда движения features[1] = max_index; // Домини- рующая частота (шаг/вибрации) features[2] = sum_magnitude; // Общая энергия сигнала. ● Вычисляем RMS каждого эталона, чтобы понять его масштаб/энергию. Алгоритм использует RMS (извле- кает квадратный корень), возвра- щая ошибку к исходной физической величине. Это делает сравнение с эталоном линейным и более инту- итивным. arm_rms_f32(standard_x, LEN_ WINDOWS, &ref_rms); arm_rms_f32(standard_y, LEN_ WINDOWS, &ref_rms);

RkJQdWJsaXNoZXIy MTQ4NjUy