40-ваттный всенаправленный звук в SberBoom — профессиональная гордость нашей команды. В прошлой статье мы рассказали, как придумали акустическую архитектуру. А тут рассказали, как устроено звуковоспроизведение в ядре Linux. В этот раз объясним из каких софтовых решений складывается звук SberBoom. Почему стандартные методы коррекции звука — не наш выбор? Как реальность расходится с вендорской документацией и зачем реверсинжинирить усилители? Читайте под катом.
Первоочередной задачей для нас было создать хороший пользовательский опыт. Как выяснилось, это вполне осуществимо за счет улучшения общего качества звучания колонки. Однако, надо понимать, что мы работаем с продуктом, который должен быть востребован на конкретном рынке, что делает подход «наденем все лучшее сразу» неприемлемым в реальных условиях. Ниже мы разберемся, с какими трудностями при таких вводных нам пришлось столкнуться и какие решения мы создали в техническом плане.
Железо
Для начала рассмотрим железо, с которым мы работаем:
![схема SberBoom — акустика, усилители, ЦПУ и шины схема SberBoom — акустика, усилители, ЦПУ и шины](https://habrastorage.org/getpro/habr/upload_files/cb8/6a7/f28/cb86a7f28d18dc1afe6f3a2c30f25e11.png)
Так выглядит тракт воспроизведения снизу вверх:
Имеем двухполосную акустическую систему с динамиком воспроизводящим низкие и средние частоты и высокочастотный динамик.
Акустическое оформление НЧ+СЧ звена — это закрытый объем с двумя пассивными резонаторами.
Оба динамика играют в свои конусообразные отражатели. Отражатель для НЧ+СЧ звена выполнен из металла и выполняет не только свою функцию отражения волн, но и является радиатором для основной платы.
Питание колонки организовано через USB Type-C с профилем 20В 2.25А для обеспечения достаточного бюджета по питанию для усилителей.
В качестве усилителей мы использовали цифровые усилители корейской компании Neofidelity NTP8835C для НЧ+СЧ и NTP8918 для ВЧ. Данные усилители на вход принимают цифровые аудиоданные по шине I2S, и имеют возможность конфигурации по I2C интерфейсу.
В качестве источника аудио данных выступает SoC Amlogic A113X. Цифровой тракт обсудим чуть ниже.
Оценка качества звука. Объективность такой оценки
Так сложилось, что во всем, что связано со звуковоспроизведением, очень много субъективного. Ведь все мы так или иначе слушаем музыку и можем сказать, нравится нам или нет. Но для разработки колонки такой подход губителен и не универсален. Очень уж легко получить звучание, которое будет себя показывать на какой-нибудь конкретной музыке.
К счастью, акустика — это состоявшаяся область, где есть как свои объективные характеристики, так и методы их измерения характеристик звуковоспроизводящего устройства. Рассмотрим наиболее интересные из них, без разбора стоящей за этим математики.
В первую очередь нас интересует Амплитудно Частотная Характеристика (АЧХ) устройства. Такие графики АЧХ показывают с какой амплитудой звукового давления устройство воспроизводит различные частоты сигнала. В качестве примера можно посмотреть на вид замера АЧХ в программе Room EQ Wizard без сглаживания.
![АЧХ Room EQ Wizard АЧХ Room EQ Wizard](https://habrastorage.org/getpro/habr/upload_files/470/971/99d/47097199d7a5001393d5a6fe9bec2015.png)
По такому графику можно посмотреть два очень важных параметра, усреднив график и построив линию среднего звукового давления:
Частотный диапазон —- считается по уровню -3 дБ от среднего и показывает, насколько полноценно устройство воспроизводит низкие и высокие частоты;
Неравномерность — разница между минимальным и максимальным уровнями АЧХ в пределах частотного диапазона.
В контексте повышения качества звучания нашего устройства эти характеристики и показывают, насколько мы близки к идеалу. А за идеал принято рассматривать абсолютно плоскую АЧХ, 0 дБ неравномерности, с частотным диапазоном от 0 Гц до бесконечности. Но это теоретический ориентир, который недостижим в реальных акустических системах.
![КГИ Room EQ Wizard КГИ Room EQ Wizard](https://habrastorage.org/getpro/habr/upload_files/93d/568/259/93d5682598bc8df35dc76f05f032a9de.png)
Еще одной важной характеристикой является Коэффициент Гармонических Искажений (КГИ). Когда мы воспроизводим синусоидальный сигнал одной частоты, КГИ показывает, насколько много, в воспроизводимом сигнале с устройства, гармоник — частот кратных воспроизводимой. Обычно удобно отображать уровень гармоник в виде процентов от уровня основного тона. Такие гармоники появляются в сигнале из-за того, что все тракты нелинейны, особенно при повышении громкости. В любом случае, заметность искажений на слух нужно минимизировать.
Для замера обычно используют звуковую карту, которая воспроизводит тестовый свип-тон на изучаемую колонку и параллельно записывает результат воспроизведения микрофоном. В нашем случае нет возможности подключить к колонке выход звуковой карты, приходится загружать тестовые файлы в память устройства и воспроизводить оттуда. Запись же, как обычно, на внешний измерительный микрофон и звуковую карту. Отдельно хочется отметить важность калибровки измерительного микрофона и остального измерительного оборудования, иначе можно намерить погоду на Марсе!
И, конечно же, не стоит забывать про замер громкости. Производим это обычно на белом шуме калиброванным шумомером. Такие измерения полезны для понимания уровня громкости устройства по сравнению с другими. А так же для того, чтобы привязать измерения АЧХ к конкретным значениям звукового давления.
Инструменты коррекции
Для коррекции АЧХ обычно используют аналоговые фильтры с конденсаторами, резисторами и большими катушками индуктивности. Мы же говорим о преимущественно цифровом тракте воспроизведения. И тут нам на выручку приходят Биквадратные фильтры, которые все равно работают на основе аналоговых прототипов, но более удобны и стабильны со временем. Тут уже конденсатор не высохнет).
Первой задачей при формировании звучания SberBoom является разработка кроссовера, который не отправлял бы на динамики те частоты, которые они не могут играть или делают это плохо. То есть на ВЧ пищалку нет смысла пускать даже средние частоты, она даже может сгореть от этого. А на НЧ+СЧ динамик не имеет смысла воспроизводить высокие частоты, пищалка с этим справится гораздо лучше.
Для реализации такого кроссовера у нас есть блоки цифровой обработки сигналов с реализованными биквадратными фильтрами в железе. В этом случае у нас получается распределенный кроссовер, так как срез низких и средних частот для «пищалки» делаем на усилителе ВЧ NTP8918, а срезаем ВЧ на усилителе NTP8835C. Опять же, мы не можем абсолютно резко срезать, например, высокие частоты, физика нам не позволит. Поэтому все равно остается диапазон частот посередине, который воспроизводят и «пищалки», и НЧ+СЧ динамик. Но для достижения более равномерного звучания не только в 360, но и по вертикали колонки, нужно минимизировать эту полосу частот совместного излучения. Биквадратные фильтры в усилителях позволяют нам делать срез только вторым порядком, 12дБ/октаву на графике АЧХ. В этом случае мы использовали два таких фильтра, что позволяет сделать срез 24дБ/октаву, что значительно уменьшает зону частот совместного излучения динамиков. Другой проблемой при настройке такого кроссовера является то, что биквадратные фильтры, как и их аналоговые прототипы, влияют на фазу сигнала. Конкретно в случае настройки кроссовера это доставляет проблем в виде влияния на АЧХ в зоне совместного излучения. Решается это обычно или простым переворотом фазы на усилителе, или специальным всё пропускающим фильтром, который не влияет на АЧХ, а только может помочь в исправлении фазы.
После того, как мы настроили кроссовер, можно подкорректировать неравномерность АЧХ каждого из динамиков. Но сильно увлекаться тут не стоит, при слишком глубокой коррекции начинают появляться искажения, поэтому только слегка придавливаем громкие частоты широкими мазками.
Цифровой тракт воспроизведения
Как обсудили ранее, наши усилители на входе требуют цифровой аудио поток. Предоставляет этот поток SoC Amlogic A113X, на котором работает ядро Linux. И тут очень важно контролировать на всех частях звуковоспроизведения качество сигнала. Поэтому остановимся подробнее на этой части тракта звуковоспроизведения.
Крупными мазками можно разделить тракт на такие части:
Приложение скачивает музыку в формате FLAC с HI-FI стримминга Звук, распаковывает, и воспроизводит с помощью API звуковой подсистемы ALSA. Тут используется сжатие без потерь, поэтому дальше по тракту нужно не испортить качество исходного сигнала.
В ALSA есть свои внутренние плагины, которые чаще всего необходимы для выполнения системных функций, таких как преобразование формата звукового потока, преобразование частоты дискретизации и так далее. Такой конвейер плагинов обработки описывается в конфигурационном файле asound.conf, название и путь могут быть иными на других сборках. Но для нас в этом месте есть удобная возможность в виде интерфейса ALSA External plugins. Собственная библиотека алгоритмов обработки цифрового звука — Salute Sound Processing (SSP), как раз была реализована в виде такого плагина.
Звуковая карта. Тут работает звуковая подсистема ALSA на уровне ядра Linux и драйвера звуковой карты в составе SoC A113X. Цифровой поток аудио попадает в звуковую карту, которая его отдает наружу по интерфейсу I2S напрямую в усилители. Никаких преобразований тут не происходит.
Цифровые усилители. С внешними усилителями NTP8835C/8918 работает часть драйвера в ядре Linux, которая обеспечивает конфигурацию усилителей в нужный режим по интерфейсу I2C. Сами усилители имеют блоки цифровой обработки сигналов, такие как конфигурируемые биквадратные фильтры, управление громкостью, фильтры с возможностью динамически изменять частотную характеристику в зависимости от громкости.
Дальше рассмотрим подробно, какие именно обработки были реализованы в этих частях цифрового тракта. Чтобы не тратить производительность SoC, имеет смысл максимально использовать возможности усилителей. Поэтому начнем с обработок на усилителях.
Как уже обсуждалось, на биквадратных фильтрах реализован кроссовер двухполосной системы. Таким образом биквадратные фильтры были использованы не только для кроссовера, но на них были реализованы коррекции общей АЧХ SberBoom. Такие коррекции необходимы ввиду того, что мы работаем в условиях конкретного рынка звуковоспроизводящих устройств. Тут, кроме требований к качеству звука, есть еще ограничения по цене устройства и ограничения на акустическое оформление со стороны дизайна устройства. Все это приводит к тому, что мы делаем наши колонки в достаточно компактном корпусе. И даже с учетом того, что было несколько итераций физического дизайна, описанного в прошлой статье, из коробки мы имеем не очень хорошую АЧХ. А применяя коррекции, можем добиться сильно более качественного звучания.
При этом, корректируя таким образом АЧХ на усилителях, мы не вносим дополнительных нелинейных искажений в слышимый динамический диапазон. Связано это с тем, как реализована цифровая фильтрация внутри самих усилителей. Для всех операций цифровой обработки внутри усилителей, цифровой поток звука преобразуется из формата с фиксированной точкой (fixed point) 16 или 24 бита в поток с плавающей точкой 32 бита. В общем случае использования операций над потоком данных с плавающей точкой по стандарту IEEE754, основываясь на моих экспериментах, достаточно для обеспечения должного качества воспроизведения. Наши усилители могут воспроизводить звук с динамическим диапазоном 100дБ, а погрешности вычислений оказываются сильно ниже этого уровня. Но тут производитель усилителей пошел еще дальше и реализовал операции цифровой обработки звука в собственном формате чисел с плавающей точкой. Деталями этого преобразования, конечно же, вендор отказался с нами делиться, но частично удалось отреверсить алгоритм преобразования для настройки алгоритма динамической эквализации в зависимости от громкости. Разница IEEE754 и используемого в усилителях преобразования в числа с плавающей точкой заключается в нелинейном расчете показателя экспоненты, что дает большую точность при работе с маленькими числами.
Громкость и коррекция тонального баланса
Регулировка громкости происходит тут же на усилителях. Ввиду работы с теми же операциями с плавающей точкой, она не вносит дополнительных слышимых искажений. Значение громкости попадает в усилители по интерфейсу управления I2C. Можно было бы закончить рассказ про громкость, но тут стоит еще учесть самое нелинейное, что есть в прослушивании звука — это человеческое ухо. Да, слух каждого человека индивидуален, но есть общие тенденции психофизиологии, которые были описаны в исследованиях Флетчера и Мэнсона в 20 веке, а в 21 веке переросли в индустриальный стандарт ISO226. Эти исследования показывают, что чем меньше интенсивность звука, тем меньше чувствительность человеческого восприятия к низким и высоким частотам.
![Кривые равных громкостей, Wiki Кривые равных громкостей, Wiki](https://habrastorage.org/getpro/habr/upload_files/6a0/67b/048/6a067b0486c7d1e57e81c9d69b4528e6.png)
Где, как не на колонке, нужно реализовывать такую коррекцию! Ведь у нас есть и звуковой поток, и регулировка громкости, и возможность однозначно привязать коррекцию к уровню звукового давления. Для этого в усилителях NTP есть специальные фильтры, которые могут реализовывать изменения АЧХ-сигнала в зависимости от громкости. В отличие от остальных функций усилителя, для которых вендор усилителя предоставляет программное обеспечение для настройки, этой функцией до нас никто не пользовался, и вендор не добавил эту функцию в свое ПО. Тут и пришлось частично отреверсить представление чисел с плавающей точкой в усилителях. Ведь коэффициенты этих фильтров задаются в этом же формате. А сама настройка происходила манипуляциями с регистрами усилителей. Для реализации коррекции я использовал по одному фильтру, зависящему от громкости, на каждую полосу. На НЧ-полосе, соответственно, чем ниже громкость, тем громче становятся низкие частоты, а на ВЧ-усилителе NTP8918 поднимаются высокие частоты, что логично. Форма АЧХ при коррекции двумя биквадратными фильтрами соответствует кривой АЧХ C-weighting для замера громкости, только результат такой фильтрации складываем с исходным сигналом для получения одинакового тонального баланса на всех громкостях.
Компрессия
Сама настройка усилителей сделана так, чтобы на максимально возможном диапазоне громкостей воспроизводить неискаженный сигнал. Но, тем не менее, встречается музыкальный материал, амплитуда которого выходит за безопасный уровень для наших колонок. Поэтому в конце тракта обработок стоит компрессор, который только немного ограничивает максимальную амплитуду до безопасных значений. Из-за этого возникает особенность, при которой на максимальной громкости появляется небольшое количество искажений. Так сделано еще для того, чтобы дать пользователям возможность «ВРУБИТЬ ПОГРОМЧЕ», если это нужно.
Плагин ALSA Salute Sound Processing
Осталось лишь обсудить те обработки, которых нет в фиксированных блоках усилителей, при этом их применение дает значительную разницу в звучании. Эти обработки можно делать в виде плагина ALSA уже на самом процессоре. Да, это нагружает процессор, поэтому пришлось еще сильно оптимизировать алгоритмы под наше железо, о чем расскажу в одной из следующих статей.
Одним из критериев качественного звучания, как мы уже обсудили, является частотный диапазон. И, если в нашем случае расширить его вверх обычно не составляет труда, то расширение частотного диапазона в сторону низких частот связано с физическими ограничениями используемого динамика в конкретном акустическом оформлении и мощностью усилителя, так как для воспроизведения низких частот требуется большая электрическая мощность. А для получения хорошего пользовательского опыта этот низкочастотный диапазон очень важен.
И тут тоже на помощь может прийти цифровая обработка сигналов. При замерах и тестах получившегося тандема усилитель -> динамик + акустическое оформление, стало понятно, что есть естественный спад частотной характеристики на низких частотах. Такого спада НЧ недостаточно с точки зрения пользовательского опыта, чтобы получить хороший глубокий бас. Чаще всего в таком случае настройщики просто используют те же биквадратные фильтры, чтобы искусственно увеличить количество баса, сделать спад НЧ ниже по частоте. При этом динамик, воспроизводя те частоты, которые из-за своей конструкции ему не очень получается воспроизводить, дает большое количество искажений, хрипов, треска. Что я и выяснил замерами при настройке. Мы проанализировали, какие алгоритмы увеличения баса существуют, и выбор пал на алгоритм VirtualBass. После чего я ушел на два месяца в исследование этого алгоритма. С помощью такого алгоритма я отрезаю диапазон низких частот, которые динамик не в состоянии чисто воспроизвести, прогоняю через нелинейную обработку, что дает гармоники 2-го порядка и выше, смешиваю только эти гармоники с сигналом без тех частот, которые дают большое количество искажений. Таким образом, получается, что динамик перестает играть те частоты, которые ему сложно, но мы не потеряли эту низкочастотную информацию, а двинули ее выше по спектру сигнала. Более подробный разбор этого и других алгоритмов библиотеки обработок SSP сделаю в следующих статьях.
![Оптимизация КГИ на низких частотах Оптимизация КГИ на низких частотах](https://habrastorage.org/getpro/habr/upload_files/941/8d6/aa7/9418d6aa755f4397cf5dc13d9d7fd222.png)
Да, результат работы алгоритма VirtualBass сам по себе представляется как нелинейные искажения, но с учетом того, что мы не играем ничего в области частот максимальных искажений динамика, а подмешиваем гармоники в рабочий частотный диапазон динамика, получается, что баса стало больше, он стал более честным, полновесным. И тут мы уходим от того, чтобы просто поднять басы фильтром, что часто дает гулкость, ее должно быть в меру —ровно столько, сколько было в исходном музыкальном материале!
Итог
В результате применения всех приемов получилась следующая АЧХ нашего SberBoom. Применение SSP и коррекций позволило расширить частотный диапазон как в области низких частот, так и на высоких частотах. Неравномерность АЧХ удалось снизить до значения около 10дБ при сглаживании 12дБ/октаву, которые обусловлены по большей части акустическим оформлением 360, а дальнейшая корректировка будет заметна на слух. А искажения не превосходят 2% на частотном диапазоне, где не работает алгоритм VirtualBass, за счет которого получилось «оптимизировать» КГИ на низких частотах.
![АЧХ SberBoom АЧХ SberBoom](https://habrastorage.org/getpro/habr/upload_files/a2a/165/705/a2a16570558d71a44766d39f64b696bf.png)
![КГИ SberBoom КГИ SberBoom](https://habrastorage.org/getpro/habr/upload_files/e97/8e4/eb4/e978e4eb44364cd637d96794e3d5589d.png)
С помощью программно-аппаратных средств и глубокого анализа железа путем измерений, удалось сделать полновесный, чистый звук для колонки, которая продается на реальном рынке. Как показывает практика, очень часто коробочные решения нужно допиливать не только напильником, чтобы в итоге получить классный результат в виде живого звука и точной передачи музыкальной задумки автора материала. А на SberBoom заметно, что разные треки все-таки звучат по-своему! А опыт и решения, описанные в статье, стали хорошим фундаментом для технологии Magnetic Sound, о которой мы расскажем в следующих статьях, где расскажем про акустический дизайн новой умной колонки SberBoom Home.
Uint32
Тема крайне интересная, тем более, что некоторый опыт в аудио dsp имеется.
Являюсь обладателем этого девайса. Честно говоря, к звучанию, точнее, к его сбалансированности есть вопросы. Кажется, что потенциал железа раскрыт не полностью.
Refridgerator
Судя по тексту, претензии к звучанию вполне понятны - автор весьма слабо разбирается в вопросе и по сути в статье не сказано вообще ничего. Ну в частности, "Virtual Bass" на самом деле называется "Missing fundamental". Про биквадратные фильтры автор слышал, а вот как ими аппроксимировать произвольную АЧХ для её коррекции - вероятно нет, потому что в статье об этом тоже ни слова. Выровнять АЧХ у автора тоже не получилось, перепады в 15 дБ на средних частотах - совсем не то, чем можно гордиться. Да и для подобных девайсов это и не важно, а важно разборчивость речи и громкое ненапряжное звучание. Для которого нужно не ровнять АЧХ, а давить определённые частоты.
Uint32
Ну да, особенно изыскания про IEEE754 ... и секретные алгоритмы по работе с экспонентой. Да и выбор NTP - весьма спорный. Касательно подавления некоторых частот - субъективное ощущение, что в середине несколько режекторов, вероятно, для улучшения распознавания голоса во время воспроизведения музыки. Но ребята пытаются. Не будем их расстраивать!
morsview Автор
Мы постоянно работаем над улучшением звучания. В статье описано текущее состояние звука в прошивке устройства, если есть комментарии по балансам, рад буду выслушать, чтобы потом учесть в подготовке нового апдейта, по возможности.
Усилители выбираются по состоянию рынка компонентов на момент разработки, чтобы попасть в таргет на нашем рынке устройств. В таких условиях не всегда возможно использовать другие усилители с более гибким DSP и лучшим звуком. Но команда работает над тем, чтобы обеспечить максимально хороший пользовательский опыт в данной нише, с учётом ограничений рынка.
А путешествие в плавучку NTP было достаточно забористым)
Если есть, какие нибудь ещё вопросы, всегда рад обсудить.
Uint32
Касательно плавающей точки в звуке - мои изыскания привели меня к выводу, что для любой реализации IIR или FIR, как и для большинства аудио алгоритмов, хоть как-то претендующих на хороший звук, это совершенно не нужно и кроме того, часто просто вредно. Здоровый dither и если нужно (что редко бывает без изменения fs) noise shaping, полностью решают главную проблему - корреляцию ошибки с сигналом. NTP скорее всего про использование плавучки немножко приукрашивают - в силиконе это занимает больше места, чем fixed point. То с чем ваша команда столкнулась - это скорее всего особенности преобразования коэффициентов к fixed point внутри NTP. Вообще, имея в кармане аж 4 ядра A53 вполне можно на одном обсчитать весь звуковой вывод и сделать конфетку без непонятно как реализованных алгоритмов в DSP явно бюджетных усилителей.
А вопрос один - как получить ssh без коннекта по usb, чтобы поправить звучание.
morsview Автор
Собственно Virtual bass и является одной из реализаций "Missing fundamental". По такому названию проще найти детали конкретного алгоритма. Но спасибо за ссылку на более подробную информацию по теме, будет полезно для тех, кому захочется разобраться подробнее.
Как вы и описали, для такого устройства не сильно важно выровнять АЧХ в струну, а часто даже вредно. Большая неравномерность тут обусловлена как раз акустическим оформлением, имеем работу излучателей на отражатели, а при попытке выровнять мы получали плохой пользовательский опыт по прослушиваниям. Если у вас есть взгляд, как можно реализовать такую коррекцию без ущерба для пользовательского опыта, пишите, буду рад обсудить и протестировать.
Refridgerator
Проблема Room EQ Wizard и подобных в отсутствии у них хорошо проработанного мат.аппарата для коррекции АЧХ. Недостаточно просто взять и сделать 1/x над амплитудами, интерференционные провалы таким образом не компенсируются. Адекватного сглаживания АЧХ/ФЧХ я тоже нигде не встречал, везде какие-то мутные алгоритмы и сомнительные результаты. Корректное сглаживание достигается аппроксимацией методом наименьших квадратов, ФЧХ лучше вообще не корректировать, а посчитать как минимально-фазовую от АЧХ (через кепстр). Применительно к IIR-фильтрам эти вопросы хорошо рассмотрены в работах Balázs Bank-а.
Ещё одно хитрое решение существует - это использовать 2 излучателя, играющих с задержкой пропорционально расстоянию между ними. В более сложном случае можно рассчитать сдвиг фаз на каждой частоте таким образом, чтобы заодно ещё и АЧХ корректировать.