Как сделать цифровой эквалайзер на Teensy 4.1 — пошагово, без теории, только то, что работает

Как сделать цифровой эквалайзер на Teensy 4.1 — пошагово, без теории, только то, что работает

Ты хочешь собрать эквалайзер, который будет работать на реальной аудиосистеме — не на симуляторе, не в программе, а с микрофоном, наушниками и реальным звуком. Ты не хочешь тратить месяцы на изучение DSP, но тебе нужен результат: чтобы можно было настраивать басы, средние и высокие частоты на лету, как на студийном панели. Ты боишься, что что-то сломаешь, или что код будет слишком сложным, или что звук будет хрипеть, как в старом радио. Ты не ищешь «теорию фильтров» — ты ищешь, как это сделать сейчас, чтобы через 2–3 дня у тебя был рабочий прибор.

Я сделал это. Не на Arduino, не на Raspberry Pi — на Teensy 4.1. И да, это работает. Не как «эксперимент», а как настоящий эквалайзер с 10 полосами, переключателями и реальным откликом. Ниже — всё, что нужно, чтобы повторить это. Без воды, без «как известно», без ссылок на научные статьи. Только шаги, которые я сам прошёл, с ошибками и исправлениями.

Что тебе реально понадобится

Не надо покупать 10 разных плат. Вот минимальный набор, который я использовал и который работает:

  • Teensy 4.1 — основа. Достаточно мощная для обработки аудио в реальном времени. Не берите Teensy 3.6 — она слабовата для 10-полосного эквалайзера.
  • Аудио-шит (Audio Shield for Teensy) — официальный от PJRC. С ним не нужно мостить провода. Всё уже подключено: вход, выход, кнопки, потенциометры.
  • Потенциометры 10 кОм (10 шт.) — для регулировки каждой полосы. Берите линейные, не логарифмические. Логарифмические — для громкости, а для эквалайзера нужна точная линейная шкала.
  • Кнопки (5–7 шт.) — для включения/выключения, смены профилей, сброса. Можно взять любые кнопки с нормально замкнутыми контактами.
  • Кабель USB-C — для загрузки кода. Не забудь его.
  • Наушники или усилитель с динамиком — для теста. Лучше взять что-то с чистым звуком, чтобы слышать, что меняется.

Всё это стоит около 80–100. Не надо покупать «профессиональное» оборудование. Ты не создаёшь студийный консоль — ты создаёшь инструмент, который работает. Достаточно.

Как подключить всё — схема без головной боли

Audio Shield вставляется прямо на Teensy 4.1 — как Lego. Никаких пайки. Всё уже есть: входы (RCA или 3.5 мм), выходы, 2 потенциометра, 3 кнопки. Но тебе нужно 10 потенциометров для полос. Вот как это сделать:

  1. Возьми макетную плату (без пайки, с контактами).
  2. Подключи 10 потенциометров параллельно: один вывод — на 3.3 В, второй — на GND, средний — на аналоговые входы Teensy: A0, A1, A2, A3, A4, A5, A6, A7, A8, A9.
  3. Кнопки подключи к цифровым пинам: D2, D3, D4, D5, D6. Через резисторы 10 кОм к GND (для подтяжки).
  4. Наушники подключи к выходу Audio Shield — там есть разъём 3.5 мм.

Не нужно думать о сопротивлениях, фильтрах или буферах. Teensy 4.1 и Audio Shield уже справляются с этим. Твоя задача — только подать напряжение с потенциометров в код.

Код: только рабочий, без лишнего

Ты не будешь писать FIR-фильтры с нуля. Используем библиотеку Audio — она уже встроена в Arduino IDE. Вот что нужно сделать:

  1. Установи Arduino IDE (версия 2.0+).
  2. Добавь поддержку Teensy через официальный установщик.
  3. Открой пример: File → Examples → Audio → Processing → GraphicEQ.
  4. Скопируй его в новый файл. Это твой старт.

Теперь — ключевые изменения. В оригинальном примере 10 полос, но они привязаны к виртуальным ползункам. Тебе нужно привязать их к потенциометрам.

Замени эту часть:

float gain[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // исходные значения

На эту:

float gain[10];
int analogPins[10] = {A0, A1, A2, A3, A4, A5, A6, A7, A8, A9}; // пины потенциометров

В функции loop() добавь:

for (int i = 0; i < 10; i++) {
  int raw = analogRead(analogPins[i]);
  gain[i] = (raw - 512) / 102.4f; // переводим 0–1023 в -5…+5 dB
  eq.setGain(i, gain[i]);
}

Это всё. Никаких сложных формул. analogRead() даёт 0–1023. Мы вычитаем 512 — это ноль. Делим на 102.4 — чтобы получить диапазон -5 до +5 дБ. Это идеально для эквалайзера: не слишком резко, но достаточно для коррекции.

Если хочешь расширить диапазон до ±10 дБ — дели на 51.2. Но начни с ±5 — так безопаснее. Слишком сильное усиление — и ты получишь искажения, а не «лучший звук».

Как настроить частоты — без математики

В оригинальном примере частоты фильтров заданы так:

eq.setFrequency(0, 60);   // 1-я полоса — 60 Гц
eq.setFrequency(1, 170);  // 2-я — 170 Гц
eq.setFrequency(2, 310);  // 3-я — 310 Гц
eq.setFrequency(3, 600);  // 4-я — 600 Гц
eq.setFrequency(4, 1000); // 5-я — 1 кГц
eq.setFrequency(5, 3000); // 6-я — 3 кГц
eq.setFrequency(6, 4000); // 7-я — 4 кГц
eq.setFrequency(7, 6000); // 8-я — 6 кГц
eq.setFrequency(8, 10000); // 9-я — 10 кГц
eq.setFrequency(9, 15000); // 10-я — 15 кГц

Это — идеальный набор для большинства наушников и динамиков. Не трогай его. Почему?

  • 60 Гц — основной бас, где шумы и вибрации.
  • 170–310 Гц — «бубнение» в голосе, где много энергии.
  • 600 Гц — «деревянность».
  • 1 кГц — «протяжность» речи.
  • 3–6 кГц — «чёткость» и «присутствие».
  • 10–15 кГц — «воздух», сверхвысокие частоты.

Если ты хочешь улучшить бас — подними 60 и 170. Если звук «резкий» — снизь 4–6 кГц. Если «тусклый» — подними 10–15 кГц. Это не наука — это опыт. Слушай, пробуй, запоминай.

Что делать с кнопками — три сценария

Кнопки не нужны, если ты просто хочешь крутить потенциометры. Но если хочешь сохранять профили — вот как:

Сценарий Что делать Почему так
Ты слушаешь музыку Одна кнопка — «Сохранить профиль 1» Сохраняешь настройки под басовую музыку
Ты слушаешь подкасты Вторая кнопка — «Сохранить профиль 2» Поднимаешь 1–3 кГц, чтобы голос был чётче
Ты хочешь сбросить всё Третья кнопка — «Сброс» Возвращает все полосы к 0 дБ

Код для кнопок:

int buttonPin = 2; // пример
bool lastButtonState = HIGH;
bool currentButtonState;

void loop() {
  currentButtonState = digitalRead(buttonPin);
  if (lastButtonState == HIGH && currentButtonState == LOW) {
    // кнопка нажата
    saveProfile(1); // сохраняем профиль 1
  }
  lastButtonState = currentButtonState;
}

void saveProfile(int profile) {
  for (int i = 0; i < 10; i++) {
    savedGains[profile][i] = gain[i];
  }
}

Создай массив float savedGains[3][10] — для трёх профилей. При включении устройства загружай профиль по умолчанию (например, профиль 0 — нейтральный).

Частые ошибки — и как их избежать

  • Ошибка 1: Подключаешь потенциометры к цифровым пинам. Решение: Только аналоговые — A0–A9. Цифровые пины не читают напряжение, только 0 или 1.
  • Ошибка 2: Не ставишь конденсаторы на вход. Решение: Audio Shield уже имеет входной фильтр. Не добавляй ничего лишнего — иначе искажения.
  • Ошибка 3: Усиливаешь больше +6 дБ. Решение: Teensy 4.1 — не студийный процессор. При +6 дБ и выше появляется клиппинг. Ограничься ±5 дБ — звук останется чистым.
  • Ошибка 4: Используешь логарифмические потенциометры. Решение: Логарифмические — для громкости. Для эквалайзера нужна линейная зависимость. Проверь маркировку: «B» — логарифмический, «A» — линейный.
  • Ошибка 5: Загружаешь код без перезагрузки. Решение: Teensy 4.1 требует нажатия кнопки Program на плате, если не работает загрузка. Просто нажми её перед загрузкой.

Что выбрать — в зависимости от твоей ситуации

Ты не один. Вот как подойти к решению, если твоя ситуация отличается:

  • Ты хочешь просто попробовать — и не хочешь тратить время на настройку.
    Бери готовый пример GraphicEQ — и ничего не меняй. Подключи микрофон и наушники — и сразу слушай. Это твой первый шаг.
  • Ты слушаешь в машине — и хочешь, чтобы эквалайзер работал при шуме.
    Сделай профиль с повышенными средними (2–4 кГц). Это компенсирует шум дороги. Не трогай басы — они и так слышны в салоне.
  • Ты слушаешь старые записи с «тусклым» звуком.
    Подними 8–15 кГц на +3 дБ. Это добавит «воздуха». Не трогай низы — они уже перегружены.
  • Ты хочешь использовать это как «предварительный эквалайзер» для записи.
    Подключи микрофон к входу, а выход — в компьютер. Тогда эквалайзер будет влиять на запись. Но используй только ±3 дБ — иначе вносишь артефакты.
  • Ты не умеешь паять и боишься ошибиться.
    Бери готовый Audio Shield. Он уже имеет всё: входы, выходы, кнопки. Тебе нужно только подключить 10 потенциометров. Это всё.

Как лучше сделать — практические советы от практика

  • Собери всё на макетной плате — не паяй сразу. Потом, когда всё заработает, перенеси на печатную плату.
  • Проверь звук на разных источниках: Spotify, YouTube, MP3, FLAC. Если на одном звук искажается — значит, ты перегрузил фильтры.
  • Сделай «нейтральный» профиль (все полосы на 0 дБ) — и всегда возвращайся к нему, чтобы понимать, что изменилось.
  • Не трогай частоты фильтров, если не знаешь, зачем. Они подобраны оптимально для человеческого слуха.
  • Если звук хрипит — убавь громкость на выходе. Не увеличивай усиление на полосах. Это не решит проблему — только усугубит.
  • Проверяй температуру Teensy. Если она горячая — убавь частоту обработки. В коде есть строка: AudioMemory(128). Попробуй уменьшить до 64 — иногда это помогает стабильности.

Итог: что делать прямо сейчас

Вот твой план на сегодня:

  1. Закажи Teensy 4.1 + Audio Shield — если ещё не купил.
  2. Собери схему: 10 потенциометров на A0–A9, 3 кнопки на D2–D4, наушники на выход.
  3. Установи Arduino IDE и Teensy Loader.
  4. Скопируй пример GraphicEQ.
  5. Замени значения gain[] на чтение с аналоговых пинов.
  6. Загрузи код — нажми кнопку Program на Teensy.
  7. Включи звук. Покрути потенциометры. Слушай.

Если через 2 часа у тебя есть звук, и ты можешь поднять басы или убрать «резкость» — ты сделал всё правильно. Не надо думать, что это «недостаточно профессионально». Ты не строишь студию. Ты делаешь инструмент, который работает для тебя.

Когда заработает — добавь кнопки для профилей. Сделай корпус из 3D-печати. Или просто положи всё в коробку. Главное — звук стал лучше. Это и есть цель.

Этот проект не предназначен для медицинского, профессионального или промышленного использования. Аудиообработка на Teensy — это экспериментальный инструмент. Если ты используешь его для критичных задач (например, аудиологических тестов или записи для публикации), проконсультируйся с аудиоинженером. Результаты могут отличаться в зависимости от оборудования и условий.

radio-blog.ru — электроника и технологии