# STM32 Audio Analyzer STM32 Audio Analyzer — система реального времени для измерения уровня звука и доминантной частоты на базе STM32F103C8T6 (Blue Pill) с веб‑дашбордом и хранением истории в TimescaleDB. Микроконтроллер оцифровывает сигнал с MAX4466, считает RMS (dBFS) и FFT (512 точек), отсылает метрики по USB CDC; на ПК коллектор пишет данные в PostgreSQL/TimescaleDB, FastAPI отдаёт REST/WS, React‑фронтенд показывает текущие значения и историю. ## Архитектура - **[MCU (firmware)](firmware/README.md)** - STM32F103C8T6, FreeRTOS, TinyUSB, CMSIS‑DSP. - ADC1 + DMA (circular, double‑buffer 2×512) с триггером от TIM3, частота дискретизации 22.05 кГц. - Обработка: удаление DC, RMS в dBFS, Hann‑окно, RFFT 512, поиск пика 100–8000 Гц. - Передача каждые 100 мс пакетом 12 байт по USB CDC. - **[Collector (Python)](services/collector/README.md)** - Читает бинарный протокол с /dev/ttyACM0, ресинхронизация по SOF=0xAA. - Проверка CRC‑8/ATM, диапазонов, подсчёт статистики ошибок. - Запись в TimescaleDB (`audio_data`), параллельно пушит JSON по WebSocket (`ws://…/ws/live`). - **[API (FastAPI)](services/api/README.md)** - REST `/api/v1/audio/latest|range|export/csv`, `/api/v1/stats/summary`, `/api/v1/events/loud`. - База: `audio_data` + непрерывный агрегат `audio_data_1min` (avg/max/min/доминирующая частота, доля тишины). - **[Frontend (React)](services/frontend/README.md)** - Live‑дашборд: вертикальный аудио‑метр, peak‑hold за 3 секунды, история частоты, текущая нота. - Источник данных — WebSocket `VITE_WS_URL`, REST для исторических запросов при необходимости. ## Структура репозитория ```text . ├── README.md ├── docker-compose.yml ├── db/ │ └── init.sql # схема TimescaleDB + агрегаты/retention ├── firmware/ # прошивка STM32 (FreeRTOS + TinyUSB + CMSIS-DSP) └── services/ ├── collector/ # serial→WS→DB ├── api/ # FastAPI REST + DB └── frontend/ # React/Vite дашборд ``` ## Быстрый старт ``` git clone --recurse-submodules ``` ```bash cp .example.env .env docker compose up --build ``` - БД: TimescaleDB на `localhost:5432` (`DB_NAME=audio_analyzer` по умолчанию). - API: `http://localhost:8000/api/v1`. - WebSocket коллектора: `ws://localhost:8001/ws/live`. - Frontend: `http://localhost:3000` (dev‑режим Vite).