# 🎵 Цифровой MEMS-микрофон ICS-43434

ICS-43434 — цифровой микрофон с 24-битным АЦП прямо на кристалле, выход по интерфейсу **I2S**.
Протокольно и электрически он близкий аналог [INMP441](../INMP441) (тот же формат I2S,
та же логика выбора канала L/R), но с более широким паспортным диапазоном частот и SNR — см.
[THEORY.md, раздел 3](THEORY.md#3-паспортные-параметры--по-общедоступным-источникам-не-сверено-с-оригинальным-pdf).

Этот компонент делает акцент только на самом датчике: чтение через I2S/DMA, метр громкости,
Serial Plotter — и даёт максимум физики звуковой волны через набор Python-инструментов, включая
работу с камертоном (точная частота, биения) и модель восприятия высоты звука ухом (мел-шкала).

## 📋 Навигация

| Файл | Что внутри |
| :--- | :--- |
| [WIRING.md](WIRING.md) | Подключение, таблица пинов, логика L/R-канала |
| [THEORY.md](THEORY.md) | Физика звуковой волны, I2S, Найквист, БПФ, биения, мел-шкала, почему нет абсолютных дБ SPL |
| [Lesson.md](Lesson.md) | Методический план уроков — звук, спектр, камертон и биения |
| [PREZ.md](PREZ.md) | Презентация модуля — тезисы для урока |

## 🛠 Состав компонента

- [`include/Ics43434.h`](include/Ics43434.h) — интерфейс класса драйвера.
- [`src/Ics43434.cpp`](src/Ics43434.cpp) — настройка канала I2S и чтение через DMA.
- [`src/main.cpp`](src/main.cpp) — тестовый стенд: метр громкости и режим Serial Plotter.
- [`tools/`](tools/) — четыре Python-инструмента (см. ниже).

## 🚀 Сборка и прошивка (PlatformIO)

```bash
cd Sensors/Sound/ICS43434
pio run -t upload && pio device monitor
```

По умолчанию пины настроены под ESP32 DevKit v1 (GPIO5/18/19) — см.
[`Ics43434::Config`](include/Ics43434.h#L25-L32) и [WIRING.md](WIRING.md). **Перед первым запуском
обязательно проверьте пин L/R (SEL)** — от него зависит поле `Config::channel`, при несовпадении
микрофон будет отдавать одни нули (см. [WIRING.md](WIRING.md#lr-sel-выбор-канала)).

### Тестовый стенд (Serial Monitor, 921600 бод)

По умолчанию стенд печатает метр громкости — пик, RMS и статус связи 10 раз в секунду:

```
[-18dBFS] peak= 4200 rms=3120.4 isAlive=1 ##############
```

Команда `p` переключает в режим Serial Plotter/Python — сырая волна звука, тот же поток читают
все скрипты из `tools/`.

## 🖥️ Python-инструменты

```bash
cd tools
python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
```

Перед запуском любого скрипта переключите стенд в режим Plotter командой `p` в Serial Monitor.

| Скрипт | Что показывает | Физика |
| :--- | :--- | :--- |
| [`01_noise_meter.py`](tools/01_noise_meter.py) | Осциллограмма + метр громкости (дБFS) | Звук как волна давления во времени |
| [`02_spectrum_fft.py`](tools/02_spectrum_fft.py) | Спектр (БПФ) + спектрограмма | Преобразование Фурье, форманты |
| [`03_tuning_fork.py`](tools/03_tuning_fork.py) | `--mode pitch`: точная частота камертона (pYIN); `--mode beats`: запись биений двух реальных источников | Резонанс, биения, тон Тартини |
| [`04_mel_hearing.py`](tools/04_mel_hearing.py) | Линейный спектр vs мел-спектрограмма одной записи | Психоакустика, нелинейность слуха |

```bash
python3 01_noise_meter.py /dev/ttyUSB0
python3 02_spectrum_fft.py /dev/ttyUSB0
python3 03_tuning_fork.py --mode pitch /dev/ttyUSB0
python3 03_tuning_fork.py --mode beats /dev/ttyUSB0
python3 04_mel_hearing.py /dev/ttyUSB0
```

Все относительные шкалы (LSB, дБFS) — не калиброванные дБ SPL, см.
[THEORY.md, раздел 8](THEORY.md#8-почему-нет-абсолютных-дб-spl). `03_tuning_fork.py` и
`04_mel_hearing.py` требуют `librosa` (тяжёлая зависимость, ставится через `requirements.txt`);
`beats`-режим также использует `scipy.signal.hilbert` для огибающей.
