ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
5 апреля
1487679 Топик полностью
Бoмж (30.12.2024 17:43, просмотров: 312) ответил Mдэ на Без нейросети тут не обойтись.
Gemini: 

Привет! Обнаружение наличия/пропадания меандра 80 Гц за 0.3 секунды на STM32F4 с использованием FreeRTOS и прерываний — задача, требующая внимательного подхода к ресурсам и точности. Идея с кольцевым буфером и скользящим окном вполне рабочая, но можно рассмотреть и другие, возможно, более эффективные варианты.

Проблемы и ограничения:

  • Время реакции (0.3 секунды): Это довольно короткий промежуток, что накладывает ограничения на сложность алгоритма.
  • Точность (+-10 Гц): Допустимое отклонение в 10 Гц от 80 Гц (то есть диапазон 70-90 Гц) облегчает задачу.
  • FreeRTOS и прерывания: Использование RTOS позволяет организовать асинхронную обработку, а прерывания обеспечивают точное измерение времени.

Варианты решения:

  1. Прямой подсчет периодов:

    • В прерывании по изменению уровня на ноге процессора (например, по нарастающему фронту) засекаем время с помощью таймера (например, DWT Cycle Counter или TIM).
    • Сохраняем значения времен между последовательными фронтами в кольцевой буфер (например, на 10-20 измерений, чтобы покрыть несколько периодов).
    • В задаче FreeRTOS периодически (например, каждые 10 мс) анализируем буфер:
      • Вычисляем среднее значение периода.
      • Переводим период в частоту (f = 1/T).
      • Если частота находится в диапазоне 70-90 Гц, считаем, что меандр есть.
      • Если в течение определенного времени (например, 3-4 периодов или 30-40 мс) не было новых измерений в буфере, считаем, что меандр пропал.
    • Преимущества: Простота реализации, низкие вычислительные затраты.
    • Недостатки: Чувствительность к шумам и пропускам импульсов (одиночные выбросы могут исказить результат).
  2. Цифровой фильтр и детектор пересечения нуля:

    • В прерывании по изменению уровня сохраняем отсчеты времени, как и в предыдущем варианте.
    • Применяем простой цифровой фильтр (например, скользящее среднее или медианный фильтр) для сглаживания шумов.
    • Реализуем детектор пересечения нуля: считаем количество пересечений нуля за определенный интервал времени (например, 100 мс).
    • На основе количества пересечений нуля определяем частоту и наличие/отсутствие сигнала.
    • Преимущества: Лучшая устойчивость к шумам.
    • Недостатки: Несколько сложнее в реализации, требует больше вычислительных ресурсов.
  3. БПФ (Быстрое Преобразование Фурье):

    • Собираем блок отсчетов сигнала (например, 256 отсчетов).
    • Выполняем БПФ для получения спектра частот.
    • Анализируем спектр на наличие компоненты в диапазоне 70-90 Гц.
    • Преимущества: Высокая точность определения частоты, устойчивость к шумам.
    • Недостатки: Наиболее ресурсоемкий вариант, требует больше памяти и времени на вычисления. Для 80Гц и времени реакции 0.3с может оказаться слишком затратным.

Рекомендации:

  • Для вашей задачи с учетом требований к времени реакции и точности наиболее подходящим кажется вариант 1 (прямой подсчет периодов). Он прост в реализации и достаточно эффективен.
  • Используйте аппаратные таймеры STM32F4 для точного измерения времени. DWT Cycle Counter может быть полезен, если требуется максимальная точность, но TIM также вполне подойдет.
  • Оптимизируйте обработку прерываний, чтобы минимизировать их задержку.
  • Проведите тестирование на реальном железе, чтобы убедиться в корректности работы алгоритма и учесть возможные особенности сигнала.

Пример реализации (вариант 1, псевдокод):

C

// В прерывании по изменению уровня
volatile uint32_t last_time = 0;
uint32_t current_time = DWT->CYCCNT;
uint32_t period = current_time - last_time;
last_time = current_time;
add_to_circular_buffer(period);

// В задаче FreeRTOS
while (1) {
    vTaskDelay(pdMS_TO_TICKS(10)); // Периодичность анализа
    float avg_period = calculate_average_period(circular_buffer);
    if (avg_period > 0) {
        float frequency = SystemCoreClock / avg_period; // Преобразование в частоту
        if (frequency >= 70 && frequency <= 90) {
            // Меандр есть
        } else {
            // Частота вне диапазона
        }
    } else {
        // Меандр пропал (буфер пуст или нет новых измерений)
    }
}

Надеюсь, эти идеи и рекомендации помогут вам в решении вашей задачи. Если у вас возникнут дополнительные вопросы, не стесняйтесь задавать!

memento mori