рейтинг блогов

Разработка USB звуковой карты с цифровой передачей звука

топ 100 блогов alex_avr228.12.2017 Больше двух лет назад передо мной встала задача передачи звука на сравнительно большие расстояния. Нужно было передавать несколько каналов звука, выходящих с USB звуковой карты на усилители, стоявшие в разных комнатах того же здания на расстояниях от 15 до 40 метров от компьютера. Студийное качество звука хоть было и не нужно, но тем не менее звук должен был быть достаточно качественным. Как выяснилось, простых, дешевых и надежных средств решить подобную задачу нет (во всяком случае я не нашел), поэтому пошел долгий путь эволюции собственных решений.

Разработка USB звуковой карты с цифровой передачей звука


Первое, самое простое решение, которое первый раз и было применено в виду крайней внезапности задачи (пришлось срочно доделывать за другими людьми) - пустить сигнал со звуковой карты напрямую на усилители, без каких либо других мер, по витой паре (правда хорошей - с отдельным экраном для каждой пары). Это было сделано и работает до сих пор. Разумеется этот вариант плох9и это было понятно изначально, но деваться было некуда). Во-первых на 40 метрах на провод наводятся существенные помехи. Что не удивительно. Местами провода идут параллельно с проводами 220В. Во-вторых, гальванической развязки нет, а земляные петли есть, что добавляет еще шумов. Таким способом было подключено 6 каналов. Вся эта ужасная система, как ни странно, работает до сих пор, хотя на один из каналов, каким-то непостижимым образом тихо наводится какое-то радио!

К следующему проекту я уже подготовился чуть лучше. Изучив тему узнал, что для подобной задачи во всяком студийном и прочем проф. оборудовании используется балансное подключение. В балансном подключении передается не обычный линейный сигнал, и дифференциальный - по сути тот же линейный + еще один инвертированный. На принимающей стороне сигналы вычитаются друг из друга. При этом большинство помех убираются, так как они наводятся на проводник и с прямым и инвертированным сигналом одинаково. Первым разочарованием стало то, что дешевых и доступных преобразователей такого сигнала нет. Их вообще не так чтобы было очень много, большинство к тому же на 2 канала, а цены такие, что вся система встанет в десятки тысяч рублей для одного проекта, что несколько много. При этом, что интересно, схема преобразования сигнала в дифференциальный и обратно - очень простая и требует всего несколько операционных усилителей и кучку рассыпухи. Правда есть нюанс - параметры деталей схемы должны быть весьма точными. Например при применении 5% резисторов коэффициент подавления помех очень сильно снижается, нужно использовать минимум 1% резисторы. В общем закончилось все тем, что я просто разработал пару платок, преобразующих сигнал туда-обратно:

Разработка USB звуковой карты с цифровой передачей звука

Платки были протестированы в реальной жизни и в целом показали себя неплохо, но не идеально. Во-первых в первых версиях параметры деталей схемы были видимо не достаточно точными, да еще и ОУ оказались фейковыми, перемаркированными, поэтому небольшая часть помех, все-таки присутствовала, хотя на совсем незначительном уровне, на практике несущественном. Во-вторых, проблема земляных петель никуда не делась - при питании плат совместно с некоторыми другими устройствами возникали жуткие помехи, как результат, приходилось для питания этих плат ставить полностью независимые, изолированные блоки питания. В третьих, система была просто довольно громоздкой и неудобной - неудачно выбранные разъемы, куча плат с передающей стороны, достаточно одному контакту быть где-то ненадежным - и все, привет плохой звук.

В следующем проекте дополнительно встала задача к восьми каналам звука выходящего с компьютера подмешивать звук с микрофона для системы громкой связи. Идея делать это через компьютер была отвергнута по той причине, что громкая связь должна быть надежной и не должна зависеть от работы компьютера, который может зависнуть, перезагрузиться и т.п. А значит звук надо было подмешивать на уровне железа. Для этой задачи я решил поискать готовые микшеры. И тут ждало внезапное открытие - микшеров с 8 каналами входа + микрофон и 8 каналами выхода просто нет. Если не считать подобные варианты, конечно:

Разработка USB звуковой карты с цифровой передачей звука

У большинства простых микшеров 2-3-4-5 входов, а выход всего один, стерео. Ставить четыре микшера, чтобы подмешать звук микрофона на 8 каналов показалось как-то избыточно и опять же дорого, поэтому на этом этапе было решено сделать собственный микшер на 8 каналов входа + микрофон и 8 каналов выхода, причем выходы сделать балансными, чтобы отказаться от кучи плат, описанных выше. Сказано-сделано. И родился такой франкенштейн:

Разработка USB звуковой карты с цифровой передачей звука

Слева, черная коробочка - это собственно микшер. Сверху - входы от звуковой карты (серебристая коробочка справа) и микрофона, снизу выходы на витую пару уходящую далеко к усилителям. на передней панели регулировка громкости микрофона. Фото платы у меня не сохранилось, но 3D рендер выглядит так:

Разработка USB звуковой карты с цифровой передачей звука

Справа не показан трансформатор. Он огромный и тяжелый. Да, в какой-то момент психанул и поставил трансформатор и линейные стабилизаторы, потому, что многие импульсные блоки питания шумят, к тому же нужно было двуполярное питание для работы схемы, а времени разбираться не было. Все это дело вполне успешно и без особых проблем заработало, но перфекционист во мне чуть не повесился. Громоздкая, греющаяся, некрасивая конструкция, с кучей проводов и аналоговыми сигналами гуляющими на большие расстояния меня не радовала.

И тут появилась идея: а что если передавать звук в цифровом виде, чтобы избежать проблем всяких там наводок, да земляных петель (если сделать развязку). Стандарт передачи звука в цифровом виде есть и называется он S/PDIF. Сигнал передается по оптоволокну либо коаксиальному кабелю, разъем есть даже на многих материнских платах. Однако, использовать этот стандарт не получилось по ряду причин. Во-первых гарантированное расстояние передачи по обоим типам подключения - 10 метров. А мне надо 50-60. Во-вторых S/PDIF передает только стерео сигнал, а мне нужно много каналов (вроде есть какие-то замороченные варианты передачи большего количества каналов, но я не вникал).
Затем я посчитал, какая нужна пропускная способность для передачи несжатого звука в цифровом виде с частотой дискретизации 48кГц и разрешением 16 бит и получил 768000 бит/с на канал. Т.е. примерно 1.5 Мбит на два канала. Такая скорость более чем достижима на хорошо изученном и распространенном RS-485 интерфейсе. Его и решил использовать.

Вначале я думал о том, чтобы поставить АЦП, принимать звук от звуковой карты и передавать его в цифровом виде. Следующим этапом была идея запаять чип от звуковой карты прямо на свою плату, тем самым избавившись от внешних проводов и лишних коробочек. Однако внутренний перфекционист не давал покоя. Лишнее преобразование в аналог и обратно на одной плате - просто тупо и некрасиво. Да и с АЦП возни было бы много. К счастью в железе все это даже не начинало проектироваться, потому что пришла дерзкая идея сделать вообще полностью свою звуковую карту. Дерзкая - потому что USB устройство я до этого разрабатывал всего один раз в жизни, используя готовые библиотеки, а между тем USB славится своей сложностью. Но тем не менее, я стал искать и нашел в сети пару примеров двухканальных USB звуковых карт на STM32. Кроме того я нашел человека в России, который даже занимался таким проектом.

Дабы не тратить время, которого было очень мало, я решил заказать разработку прошивки для восьми канальной звуковой карты этому человеку. Не буду долго все описывать, но скажу, что в целом первый опыт передачи написания прошивки на аутсорс оказался печальным. Вначале все шло неплохо, но когда оставалось сделать вроде бы уже не самые сложные вещи (типа передачи по UART) начались какие-то проблемы и тормоза. Прошивки присылались все реже, одни баги менялись другими, некоторые требования задания игнорировались, все начало затягиваться...

В какой-то момент я плюнул и понял, что придется все-таки самому лезть в код и разбираться. Залез, разобрался, ужаснулся, увидев это:

Разработка USB звуковой карты с цифровой передачей звука

И понял, почему довести до ума эту прошивку у человека так и не получилось. Там было такое адское нагромождение всего и вся, что добавление нужного функционала рушило бы все до основания. В общем разрушением всего до основания я и занялся, полностью переписав ту часть, которую создал этот человек (остальная часть по сути вся взята из примера от ST). Объем кода при этом сократился на полторы тысячи строк в двух ключевых файлах, при этом функционал остался и расширился.

Вообще, сложность работы USB звуковой карты оказалась для меня несколько неожиданной, хотя раньше я не задумывался над вопросом. Самая главная сложность в синхронизации. USB шлет пакеты данных на карту каждую 1мс, т.е. 1000 раз в секунду. Допустим у нас частота дискретизации потока - стандартные 48 кГц. Это означает, что в одном пакете USB должно приходить 48 самплов (тут я подразумеваю, что один сампл содержит все необходимые каналы, для простоты). Звуковая карта должна эти 48 самплов проиграть с помощью ЦАПа. И тут мы сталкиваемся сразу же с проблемой. Мир не идеален и в реальности USB может присылать нам самплы каждые 1.000001 мс, например. А наша звуковая крата тоже не идеальна и воспроизводит 48 самплов не за 1 мс, а за 0.9999999мс, допустим.

И получается так, что звуковая карта не успевает воспроизвести все самплы, которые приходят по USB. Либо наоборот, Она воспроизводит их быстрее, чем USB их присылает. Мы, конечно, можем сделать буфер данных, но так как ошибка постоянная и накапливающаяся - буфер рано или поздно либо переполнится либо закончится и тогда нам придется пропускать самплы, что будет слышно как очень неприятные щелчки.

Для того, чтобы это не происходило - нужна синхронизация между компьютером и звуковой картой. Стандарт USB ADUIO подразумевает несколько разных типов синхронизации. Самым совершенным считается вариант, когда частоту воспроизведения задает звуковая карта. При этом в стандарте USB AUDIO есть возможность реализовать обратную связь таким образом, что звуковая карта постоянно сообщает компьютеру о соотношении скорости приходящих данных и воспроизведения. Таким образом компьютер корректирует скорость выдачи самплов и может иногда выдать не 48, а например 47 или 49 самплов в одном пакете.
Что любопытно - воспроизведение видео на компьютере тоже должно быть синхронно со звуком. Поэтому когда вы смотрите фильм - скорость воспроизведения этого фильма по сути задает ваша звуковая карта :)

На этапе разработки прошивки использовался прототип собранный на макетных платах:

Разработка USB звуковой карты с цифровой передачей звука

Как только прошивка в общих чертах заработала на макете - были разработаны и заказаны уже нормальные печатные платы. По прибытию платы были запаяны и протестированы. В процессе отладки:

Разработка USB звуковой карты с цифровой передачей звука

Сама звуковая карта представляет из себя плату размером 100х75мм. Подключается к компьютеру по USB, от него же и питается.

Разработка USB звуковой карты с цифровой передачей звука

Для удобства тестирования и отладки на плате сделаны аналоговые выходы в дополнение к цифровым, однако в реальной работе использоваться они не будут.

Разработка USB звуковой карты с цифровой передачей звука

Главный контроллер на плате - STM32F407. На плате больше ста конденсаторов. И множество независимых систем питания. Работа со звуком требует очень аккуратного подхода к питанию и разводке. Малейшая ошибка и все огрехи сразу слышны - человеческое ухо очень чувствительное. Если плавное изменение яркости или цвета на 10% человек скорее всего даже не заметит, то изменение, например? звуковой частоты на 10% заметит любой и сразу.

Разработка USB звуковой карты с цифровой передачей звука

На плате есть 4 цифровых RS-485 порта. В каждый порт передается одна пара из восьми каналов. Для удобства, разъемы сделаны такие же, как для эзернет подключения, распиновка также позволяет использовать стандартные патчкорды. RS-485 реализован с гальванической изоляцией на индуктивной связи. Каждый порт изолирован от остальных и от USB.

Разработка USB звуковой карты с цифровой передачей звука

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

Разработка USB звуковой карты с цифровой передачей звука

Система протестирована и работает :)
В итоге получился 100% цифровой канал связи от управляющего софта, воспроизводящего звуки, до непосредственно точки установки усилителя, с которого сигнал идет уже на колонки.

Остается спроектировать и напечатать корпуса для плат.

Между тем, у меня уже есть идеи о следующем существенном витке эволюции, так что скорее всего это изделие не последнее.

P.S. хотел также написать общие впечатления от разработки электроники для звука, но, пост получился итак не маленький, так что видимо как-нибудь в другой раз. Опыт, однозначно интересный и любопытный.

Спасибо за прочтение.

Оставить комментарий



Предыдущие записи блогера :
Архив записей в блогах:
Внешнее кредитование России понемногу восстанавливается после валютной катастрофы ноября-декабря прошлого года, но эта ситуация будет сломана в текущем III квартале, на который приходится последний значимый пик внешних выплат. Компенсировать его приемлемыми внешними займами не удастс ...
Более чем 30 студий и дизайнеров во визуальным и звковым эффектам объединились чтобы создать это чудо. Цель эксперимента: изучение взаимосвязей между геометрией звука и рисунка. Смотреть только в HD на весь экран. Смотреть прямо сейчас! 65.7K ...
Мне очень понравились. От них как то прям аж идут запахи те и атмосфера. ...
  Мы строим правовое государство. Так заявлено. Президент и премьер-министр - профессиональные юристы. Все карты в руки. Так должно быть. На деле - безрадостно. Я могу говорить только о том, что  знаю лично. В мае меня так, или иначе, ...
...