Контроллер студийных мониторов с коррекцией АЧХ
Предыстория
История создания данного девайса началась с того, что я задумал прикупить пару студийных мониторов для работы с музыкой дома, однако, в отличии от обычных мультимедийных колонок, мониторы чаще представляют собой два независимых устройства. Т.е. регулировать громкость можно только на компьютере либо отдельно на каждом мониторе. Помимо этого, при работе в специализированном ПО (DAW) часто не используются стандартные драйвера и, соответственно, системный аудиомикшер и регулятор громкости просто не работают. Все это делает простую регулировку громкости совсем не тривиальной задачей. Регулировать звук можно фактически только изменяя уровень мастер-канала в DAW, что совсем неудобно. Конечно, в профессиональных внешних звуковых картах внешняя регулировка тоже предусмотрена, но не все ими пользуются. Для решения этой проблемы существуют мониторные контроллеры, бывают пассивные и активные. В самом простом пассивном варианте это просто потенциометр с ручкой в корпусе с разъемами на вход и выход. Возможности активных ограничены только фантазией разработчика и бюджетом покупателя. Вот как раз такой активный регулятор с дополнительными функциями мы и будем конструировать.
Первым делом я ознакомился с ассортиментом и ценами магазинов, и был не очень приятно удивлен:
Оборудование специализированное и цены на него соответствующие. Что ж, остается подумать, как это можно сделать самому с минимальными затратами и максимальной пользой. Изначально я думал сделать такой же простой пассивный регулятор на потенциометре, с парой переключателей. Но у таких регуляторов есть существенные недостатки. Во-первых, механические особенности работы потенциометра, а именно шумы при повороте ручки. Конечно, они есть не всегда, и чаще появляются спустя некоторое время после физического износа, но, тем не менее, проблема есть, и проблема известна. Во-вторых, это неодинаковое изменение сопротивления и, как следствие, дисбаланс громкости каналов, особенно это заметно, когда регулятор установлен близко к минимальному значению. Конечно, существуют более дорогие «аудиофильские» модели потенциометров, по стоимости сравнимые с готовыми контроллерами или даже выше. Но даже они не страхуют от проблемы дисбаланса, т.к. в документации у них указан допустимый разброс сопротивления +/-20%, но точной идентичности регулировки сопротивления в обоих каналах тоже никто не обещает.
Решение
Поразмыслив и взвесив все за и против, я решил разрабатывать устройство на базе цифрового сигнального процессора (DSP). Для наших задач хватит одного из самых простых и дешевых ADAU1701 от Analog Devices. Как ни странно, но себестоимость всего проекта едва дотягивает до стоимости самого дешевого пассивного мониторного контроллера, но наше устройство будет полностью лишено всех его недостатков, да еще вдобавок будет иметь несколько дополнительных функций. Самой интересной, а, может быть, теперь и основной из них является возможность коррекции амплитудно-частотной характеристики аудиосистемы (АЧХ).
Техзадание
Для начала определимся, какой функционал нужен.
Регулировка громкости. Ну тут все понятно, собственно, ради этого все и затевалось. DSP имеет несколько встроенных аналого-цифровых преобразователей, что позволяет осуществлять регулировку громкости абсолютно любым, самым дешевым и простым одинарным потенциометром. Без шорохов, без скачков, сколь угодно плавно.
Моно микс. Часто в процессе сведения и мастеринга аудиоматериала возникает необходимость проверить моно-совместимость. Поэтому в любом приличном мониторном контроллере есть функция суммирования каналов.
Мьют (отключение звука). Тут тоже, думаю, пояснений не нужно, удобная и нужная вещь.
Включение/отключение коррекции АЧХ. В процессе настройки, а также перенастройки, если место установки мониторов или помещение изменилось, очень удобно включать и отключать коррекцию для контроля внесенных изменений и сравнения звука до/после.
Индикатор клиппинга. Очень важная вещь, т.к. выходной уровень сигнала профессиональных внешних звуковых карт может запросто перегрузить вход DSP, поэтому этот момент нужно всегда контролировать, чтобы не допустить появления нежелательных искажений.
Теперь по подключениям. Мне нужен один стерео вход и один стерео выход, т.к. у меня один источник звука и одна пара мониторов. Однако DSP позволяет сделать два выхода без дополнительных трудозатрат, если это нужно. Питание схемы будет осуществляться от USB компьютера, через него же все будет настраиваться и прошиваться.
Комплектующие
Далее, собственно, о том железе, на базе которого это все будет построено. Сердцем системы является отладочная плата на базе DSP процессора ADAU1701 от Analog Devices. Платы эти выпускаются разными производителями, я использовал китайский вариант, как один из самых удобных на мой взгляд:
Для программирования платы DSP также существуют различные варианты программаторов. Один из самых популярных — это отладочная плата на базе микроконтроллера CY7C68013A.
Собрать всю конструкцию было решено в корпусе Gainta G706 140×110х35 мм. Можно, конечно, сделать и меньше, но тогда будут проблемы с расположением внешних разъемов.
Ну и остаются только сами разъемы для сигнальных кабелей (XLR и ¼» TRS), разъем USB type B, переключатель, кнопки, и потенциометр. В плане набора комплектующих проект достаточно простой.
Сборка
Начнем со схемы проекта. Печатную плату разводить смысла я не вижу, устройство не серийное и имеет довольно простую коммутацию, все соединения были выполнены монтажным проводом и пайкой.
Схема проекта
Схема в PDF в хорошем качестве.
Кратко рассмотрим основные узлы. Блок контроля и индикации содержит три кнопки (вкл/выкл коррекции, мьют, и моно микс), потенциометр для регулировки громкости и индикатор клиппинга. Были использованы кнопки с фиксацией и подсветкой, подключены они согласно схеме таким образом, что при нажатии на кнопку она кладет на землю подключенный к ней вывод DSP и зажигает встроенный светодиод. Подключение потенциометра для регулировки громкости и светодиода, сигнализирующего о перегрузке (клипп-детоктор), полностью взято из документации на DSP.
Стоит упомянуть о подключении USB. Как видно по схеме, все контакты идут на двухпозиционный переключатель. В одном положении линии данных подключены к плате программатора, а питание подается как на программатор, так и на сам модуль DSP напрямую (режим программирования и настройки). В другом же положении с USB берется питание только для платы DSP, которая подключена через изолированный DC-DC преобразователь для уменьшения помех и наводок на аудио тракт.
Не претендуя на какую бы то ни было серьезную эстетику и дизайн, я просто собрал все в корпус, и покрасил его черной матовой краской из баллончика.
Внутренности устройства
Далее к самому главному — подключению и программированию самого DSP.
Подключение и настройка
Первым делом нужно скачать и установить драйвера и ПО для нашего программатора, в качестве которого выступит плата CY7C68013A. Все программное обеспечение является свободным, можно найти и скачать без проблем, например тут.
Кроме драйверов нам необходима программа CyConsole (можно установить как отдельно так и в составе пакета CySuiteUSB), после установки драйверов и подключения отладочной платы по USB окно программы выглядит так:
В диспетчере устройств плата должна определиться как:
Отлично, теперь можно перейти к самому модулю DSP. Его программирование и прошивка осуществляются через ПО SigmaStudio, которое так же бесплатно скачивается с официального сайта компании (Доступен не из всех регионов, в конце статьи приложу архив со всем необходимым).
Для программирования DSP микроконтроллеров в SigmaStudio используется USBi программатор, в качестве которого у нас будет выступать отладочная плата CY7C68013A, упомянутая выше. Этот микроконтроллер может эмулировать различные интерфейсы и протоколы, сделать это можно разными способами. Самый простой и надежный — это запустить специальный скрипт в программе CyConsole.
Есть и другие варианты
а именно прошить память EEPROM либо через эту же программу, либо просто выпаять ее и зашить на программаторе. Однако, данный способ заработал только на одной из двух моих отладочных плат, другая упорно игнорировала прошивку памяти, хотя шилось все хорошо и без ошибок. Поэтому рекомендовать я этот метод не буду, особенно для начинающих, т.к. способ со скриптом проще и надежней, желающие же поэкспериментировать, смогут самостоятельно, без труда найти в сети информацию про прошивке епромки.
Необходимый нам скрипт (называется ADI_USBi.spt) можно найти в папке программы SigmaStudio по адресу
C:\Program Files\Analog Devices\SigmaStudio 4.7\USB drivers\x64
При подключенной плате в программе CyConsole нужно нажать на «load script», найти его по указанному выше адресу и нажать «Play script»
Если плата рабочая и установлены драйвера, то после запуска скрипта наша плата превращается в USBi программатор, и название платы, отображаемой в программе должно измениться:
Это окно сворачиваем, но не закрываем. Запускаем проект для SigmaStudio, и, если все хорошо, то на вкладке Hardware Configuration надпись USB будет подсвечена зеленым фоном. Это означает, что можно создавать, редактировать и загружать проекты.
Проект корректора в SigmaStudio
В главном окне проект выглядит следующим образом:
Кратко опишу логику работы и назначение модулей.
Первый модуль на пути сигнала — это моно сумматор Mg1, переключатель MX1, который управляется внешней кнопкой, позволяет выбрать либо исходный стерео сигнал, либо сумму левого и правого каналов в каждом канале.
Также к моно сигналу подключен пиковый детектор (перегрузки). Модуль Abs1 для простоты вычислений переворачивает отрицательную полуволну сигнала, который затем сравнивается в модуле ABCD 1 с максимально допустимым уровнем (0 dB, на самом деле, чуть-чуть меньше) и если уровень сигнала равен или больше этого уровня, то на выход GPIO_1 подается логическая единица, и загорается светодиод, сигнализируя о клиппинге.
Далее сигнал идет на регулятор гейна и на модуль параметрического эквалайзера, с помощью которого и осуществляется коррекция АЧХ. Переключатель MX1_2 позволяет отключать коррекцию.
Следующий в цепи модуль — это мьют, тут все просто: переключатель MX1_3 выдает либо исходный сигнал, либо тишину (логический ноль).
И последний модуль — это регулировка громкости. Она плавно изменяется от 0 до -45 dB (дальше в минус бесконечность) с шагом в 1 dB согласно таблице в модуле Lookup Table1.
Измерения АЧХ и настройку коррекции разберем чуть позже, а пока будем считать, что мы все сделали, настроили как хотели. В общем, проект готов, и нам необходимо просто запрограммировать нашу плату.
Первым делом компилируем и загружаем в оперативную память проект:
Если все прошло хорошо, в правом нижнем углу отобразиться сообщение об успешной загрузке:
После этого устройство будет работать, как от него и ожидалось: регулировать, корректировать и пр. Можно проверить работу всех кнопок, индикатора, регулятора громкости. Если что не так — поправить и загрузить повторно, в общем, отладить работу прибора. Иногда на этом моменте возникают ошибки (SigmaStudio, к сожалению, не отличается ни стабильностью работы, ни удобством для пользователя — это не только мое мнение, но и многих пользователей из сети. Но на сегодняшний день это одна из немногих, если не единственная, доступных сред программирования DSP, поэтому запасаемся терпением и работаем с тем, что есть). При возникновении ошибки загрузки можно попробовать загрузить программу в DSP повторно, если не помогает — отключить и подключить все заново (не забывая после переподключения запустить скрипт в CyConsole).
Если все работает, как надо, то следующим шагом необходимо записать программу в энергонезависимую память (пока она только у нас на компьютере и в оперативной памяти DSP). Для этого переходим во вкладку Hardware Configuration, кликаем правой кнопкой мыши на модуле ADAU1701 и выбираем «Write Lastest Compilation to E2PROM»
После этого откроется диалоговое окно записи, в котором необходимо указать протокол подключения и объем установленной памяти:
В моей схеме программатор подключен по протоколу I2С установлена епромка на 64 kbit, поэтому выбираем этот протокол, указываем объем памяти и жмем OK, начнется процесс записи.
Если запись прошла без ошибок, то необходимо перезагрузить устройство переключив переключатель питания в рабочий режим (когда питание подается только на DSP, без программатора), и после включения DSP должен самостоятельно запустить программу уже из EEPROM.
Измерение и коррекция АЧХ
Свою основную функцию (регулировку громкости) устройство уже выполняет. Самое время перейти к процессу замера АЧХ и настройки фильтров параметрического эквалайзера.
Disclaimer
Сделаю небольшую оговорку для звукорежиссеров, аудиофилов, специалистов по акустике помещений — в общем, всех тех, кто может найти ошибки и неточности в описанном подходе измерений и коррекции. Сама эта тема довольно сложная, многогранная и неоднозначная, а этот проект любительский и дилетантский, нацеленный в основном на энтузиастов, начинающих музыкантов и bedroom продюсеров. Поэтому на истину в последней инстанции я не претендую, напротив, если вам есть что подсказать, знаете что можно улучшить в текущих условиях, то я буду рад почитать об этом в комментариях и принять к сведению.
Продолжим. Для дальнейших действий нам потребуется измерительный микрофон (я использовал Superlux ECM-999), программа REW (Room EQ Wizard), ну и ваша любимая музыка для субъективной оценки результата.
В целом, методика коррекции проста: необходимо снять АЧХ акустической системы (колонки + комната) и внести изменения в корректирующий эквалайзер с учетом этих измерений (где много — убавить, где мало — прибавить). Но сделать это можно множеством способов с очень разным результатом. Я опишу тот способ, который мне понравился больше всего.
Подключаем микрофон и запускаем программу REW. Если у вас нет измерительного микрофона — не страшно, для наших целей и точности вполне подойдет любой электретный микрофон (обычная рабочая петличка), разница между ними зачастую
крайне мала…
Superlux ECM-999 и какая то USB петличка
При первом запуске программа предложит настроить входы и выходы, указать калибровочный файл для микрофона.
Измерить АЧХ можно разными способами (Свип-тон, белый шум). Мне больше нравится вариант с белым шумом и усреднением измерений. Открываем окно генератора, выбираем белый шум.
Открываем окошко анализатора реального времени (RTA), жмем на шестеренку, указываем сглаживание (⅓ или 1/6 октавы), повторение — бесконечно, остановится после 20 измерений например, этого достаточно.
После этого микрофон помещаем в район, где будет голова при прослушивании. Возвращаемся к генератору, запускаем его и запускаем анализатор (красная кнопка, правый верхний угол). На графике появится кривая АЧХ, которая поначалу будет меняться, но потом стабилизируется. Во время измерений микрофон можно перемещать, +/-20 см от расчётного расположения головы слушателя, аккуратно, старясь не задевать провод. При измерениях следует установить такой уровень громкости, на котором вам будет комфортно работать или слушать музыку. После того как будет произведено 20 замеров, измерения остановятся. Можно отключить генератор, нажать кнопку Current с иконкой дискеты, это сохранит усредненный замер АЧХ, и с ним можно будет дальше работать.
У меня получилось примерно так:
В принципе, с этим уже можно работать, анализировать, попытаться понять и исправить физически. До того как начать коррекцию в цифре, лучше всего попытаться максимально улучшить картину путем различной расстановки колонок, изменения местоположения прослушивания, устранения первичных отражений и пр. Впрочем, это отдельная огромная тема, тут мы ее подробно рассматривать не будем. Исходим из того, что с помещением мы сделали все, что только было возможно, и продолжаем.
Теперь необходимо рассчитать параметры фильтров для эквалайзера, это можно сделать в этой же программе.
Открываем окно эквалайзера (EQ), на первой вкладке указываем что у нас полноценная колонка, и автоматически рассчитываем целевой уровень громкости.
На следующей вкладке (настройки фильтров) указываем диапазон, в котором будет происходить коррекция (нижняя граница у меня 40 Гц, верхняя — 10кГц. Нижнюю точку рекомендую выбирать там, где кривая АЧХ максимально близка к целевой прямой, и где-то от 40Гц до 70Гц. Ниже корректировать колонки/мониторы нет смысла и выше 10кГц — тоже). Остальные параметры можно оставить без изменения, как на картинке. После этого нажимаем Match response to target и происходит расчет фильтров. Ожидаемое изменение кривой АЧХ также отображается на графике.
Теперь, если нажать сверху кнопку EQ Filters, появится окно с параметрами фильтров (частота, гейн, добротность). У меня получилось 8 штук, их количество зависит от установленной прямоты целевой кривой (Flatness Target). Наш DSP поддерживает до 16 фильтров, но все-таки не стоит увлекаться, на мой взгляд, 6–10 фильтров вполне достаточно.
Осталось дело за малым — просто перенести настройки фильтров в модуль эквалайзера, скомпилировать и прошить проект и оценить полученный результат.
В моем случае это выглядит примерно так:
Есть пара точек по графику, которые превышают исходный уровень примерно децибела на 3. На этот случай перед модулем эквалайзера есть регулятор громкости, которым можно скорректировать это превышение, убрав те же 3 — 4 дБ.
Результат
Замер АЧХ моей акустики до (красная линия) и после (зеленая линия) коррекции:
Пара слов о замерах, коррекции и вообще подходе ко всему этому процессу. Вообще, для студий считается приемлемым уровень неравномерности АЧХ в +/-3дБ. У меня получилось что то около +/-5 дБ. С учетом того, что акустика находится в обычной комнате, считаю результат вполне неплохим. Субъективно, в звуке пропал гул и бубнеж (Мода в 130 Гц — это беда квартир с потолками 2,5 м, т.е. очень многих), а также высокие частоты стали не такими резкими, помягче и поприятней.
После настройки фильтров я рекомендую субъективно на слух оценить звук, сравнить с коррекцией и без, и, возможно, что-то немного подправить. Не стоит спешить, т.к. если акустика была в использовании долгое время, то, скорее всего, вы привыкли к ее звучанию, и более ровный и «правильный» звук может показаться лишенным чего-то важного. Также не стоит сильно увлекаться прямотой результирующей кривой. Надо помнить, что корректируем мы только чистый сигнал, а реверберация комнаты остается без изменений, и, если вывести все по графикам очень ровно, то вряд ли это будет звучать хорошо.
Еще есть мнения, что замерять и корректировать нужно отдельно каждую колонку, но я с этим не согласен. Используемый DSP позволяет это сделать (всего-то нужно повесить не один эквалайзер на два канала, а на каждый — свой), и я так тоже пробовал делать. Но разные настройки для колонок добавляют больше стерео информации в звук, и в результате он кажется шире, чем есть на самом деле, кому-то это может даже понравиться, но если мы говорим все-таки о мониторинге, то это не пойдет на пользу. Хотя ПО, используемое для аналогичных целей (тот же Sonarworks), создает разные настройки для обоих каналов, но там есть момент замера АЧХ колонки вблизи самого динамика (т.е. для минимизации влияния комнаты), и возможно именно эти данные обуславливают разницу в корректировках. При желании и это можно повторить в нашем DSP, если необходимо.
На этом, я думаю, можно закончить. Спасибо за уделенное время. Если есть вопросы, пишите в комментарии, постараюсь ответить. Архив с софтом, схемами и самим проектом.