Научная статья на тему 'Сквозная передача звука в автомобильной телематике'

Сквозная передача звука в автомобильной телематике Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
141
107
i Надоели баннеры? Вы всегда можете отключить рекламу.

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Знамеровский Антон, Стоцкий Юрий, Фукс Вадим, Хайт Константин

Автомобиль давно уже не только не роскошь, но и не средство передвижения. Вернее, быть сред ством передвижения — уже едва ли не побочная его функция.

i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Текст научной работы на тему «Сквозная передача звука в автомобильной телематике»

Компоненты и технологии, № 2'2005

Сквозная передача звука

в автомобильной телематике

Антон Знамеровский,

anton.znamerovsky@motorola.com Юрий Стоцкий, y.stotski@motorola.com Вадим Фукс, vadim.fouks@motorola.com Константин Хайт konstantin.khait@motorola.com

Введение

Автомобиль давно уже не только не роскошь, но и не средство передвижения. Вернее, быть средством передвижения — уже едва ли не побочная его функция. За пару последних десятилетий он, в погоне за покупателем, так оброс всевозможной электроникой, что практически превратился в мультимедийную компьютерную систему на четырех колесах. Мощный мотор, надежная подвеска и крепкий кузов уже не гарантируют производителю рыночного успеха, если они не дополняются качественной аудиосистемой и разнообразными коммуникационными сервисами, от тривиальных голосовых звонков до доступа в Интернет и автоматического вызова спасательной бригады при аварии. Большинство же коммуникационных сервисов, объединяемых термином «автомобильная телематика», так или иначе связаны с передачей звука.

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

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

Поэтому, как только мощность встраиваемых микроконтроллеров возросла достаточно для того, чтобы сделать возможным использование его как для управления, так и для передачи звука, производители стали отказываться от дорогостоящих DSP и переходить на сложные в реализации, но более дешевые однопроцессорные решения.

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

Звуковые порты, каналы и полуканалы

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

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

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

Компоненты и технологии, № 2'2005

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

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

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

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

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

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

Аудиоподсистема — совокупность программных модулей, отвечающих за прием, передачу, обработку, запись и проигрывание звука, то есть

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

Взаимодействие с аппаратными портами

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

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

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

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

Если исключить вопросы, связанные с конфигурированием оборудования и непосредственным управлением его поведением и не относящиеся напрямую к проблемам организации звукового потока, можно выделить две типовые задачи

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

Рассмотрим сперва типовой случай получения данных от аппаратного порта-источника. Как уже отмечалось выше, этот процесс обычно инициируется возникновением прерывания при определенном уровне заполнения аппаратной очереди. Следует обратить внимание, что процесс программного считывания данных процедурой обслуживания прерывания, как правило, достаточно длителен, и за это время в аппаратной очереди источника скапливается несколько дополнительных отсчетов, отсутствовавших на момент генерации прерывания. Поэтому не рекомендуется выставлять уровень заполнения аппаратной очереди, при котором происходит генерация прерывания, на предельную длину очереди, чтобы избежать возможного ее переполнения.

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

Регулярность передачи пакетов в звуковой полуканал является основной задачей при программировании взаимодействия с входным аудиопортом. Многие алгоритмы обработки звука построены исходя из предположения, что пакеты поступают с определенным интервалом. Кроме того, нерегулярность кадров может негативно сказаться на производительности системы. Например, последовательная обработка нескольких пакетов высокоприоритетным процессом на длительное время прервет исполнение других задач и может вызвать нарушение сроков их завершения. Такая ситуация возникает в случае слишком длинной аппаратной очереди, когда один аппаратный кадр уклады------------------------------------ 147

Компоненты и технологии, № 2'2005

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

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

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

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

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

В этом случае аудиоподсистема вынуждена выдавать приемнику либо постоянный сигнал — «тишину», либо предварительно сгенерированный «комфортный» шум. Последнее позволяет сгладить акустический эффект недостатка данных, который в противном случае проявляется в виде хорошо слышимого щелчка.

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

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

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

Задержки при сквозной передаче звука

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

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

Использование для входного и выходного портов очередей буферов позволяет обеспечить независимость общей задержки от времени исполнения промежуточных алгоритмов аудиообработки. Чтобы убедиться в этом, рассмотрим состояние одного из каналов системы передачи звука в произвольный момент времени в стационарном режиме, когда отсутствуют эффекты переполнения входной аппаратной очереди и недостатка данных в выходной очереди.

Общая задержка распространения отдельного звукового отсчета складывается из трех величин:

• Т1 — времени с момента попадания отсчета во входную аппаратную очередь до момента срабатывания прерывания по заполнению (до заданного уровня) входной аппаратной очереди;

• Т2 — времени с момента срабатывания прерывания по опустошению очереди выходного порта до момента выхода отсчета наружу из аппаратной очереди, заполненной при обработке упомянутого прерывания;

• T3 — времени, прошедшего между моментами срабатывания указанных выше прерываний в применении к одному и тому же кадру аудиоданных.

Рассмотрим вариант с одинаковыми частотами дискретизации звука во входном и выходном портах. Для упрощения положим, что все программные буферы имеют одинаковую длину и вмещают ровно M отсчетов каждый, а уровень генерации прерываний (watermark) входной аппаратной очереди установлен равным той же величине M. Уровень генерации прерывания по опустошению очереди выходного порта примем равным K. При этом в аппаратной очереди входного порта в рассматриваемый момент времени находится ж отсчетов, а выходного — у отсчетов. Выходная очередь содержит N кадров, готовых к отправке, а входная — L принятых, но еще не обработанных. Кроме того, еще S кадров находится в обработке, то есть переданы из входной очереди в систему, но еще не возвращены в выходную очередь.

Начнем с анализа суммарной задержки в аппаратных очередях (Т1 и Т2). Рассмотрим отсчет, только что принятый во входную аппаратную очередь. Поскольку в данный момент в очереди до уровня watermark имеется M-x свободных ячеек, прерывание по заполнении аппаратной очереди возникнет через (M-x)/f секунд, где f— частота дискретизации отсчетов. При этом процедура обработки прерывания поместит рассматриваемый отсчет на позицию x программного кадра. Этот отсчет будет записан в очередь выходного порта на позицию x+K. Соответственно, его вывод осуществится через (x+K)/f секунд с момента вызова обработчика прерывания выходной очереди, а суммарное время задержки в двух аппаратных очередях составит:

T1 + T2 = (M -x)/f+ (x + K)/f=

= (M + K)/f (1)

Очевидно, что это время не зависит от позиции отсчета в буфере, то есть от того, в какой именно момент по отношению к входному порту рассматривается система.

Процедура перемещения буфера в аппаратную очередь может занимать длительное время и превышать 1/f— время выхода очередного отсчета из выходной очереди. Поэтому следует отметить, что позиция x+K рассчитана на момент возникновения прерывания выходной очереди, а не на момент физического помещения рассматриваемого отсчета в выходную очередь.

Рассчитаем теперь, какое время пройдет с момента прерывания на чтение рассматриваемого отсчета из входной очереди в буфер до момента прерывания на запись этого же отсчета из буфера в выходную очередь. Это время T3 складывается из времени, необходимого для вывода всех предыдущих буферов, то есть N буферов выходной очереди, S буферов, находящихся в обработке, и L буферов входной очереди, а также времени задержки прерывания выходной очереди относительно прерывания входной очереди. Время вывода предыдущих буферов равно

(Mx(N+S+L))/f www.finestreet.ru-------------

(2)

Компоненты и технологии, № 2'2005

Задержка между прерываниями входной и выходной очередей равна

(у-К)^ - (М-х)Я'

(3)

Складывая (1), (2) и (3), получаем искомую задержку в системе

Т = (Мх^+Б+Ц+у+х)# (4)

В стационарном режиме (отсутствие переполнений и недостатка данных в аппаратных очередях) величина Т не зависит от времени.

Переходные процессы

В обычной ситуации перед открытием канала величина 5 равна нулю, так как еще нет буферов для обработки. Также равна нулю величина Ь, поскольку предзаполнение входной очереди не имеет смысла, ведь она вводится для предотвращения переполнения, а N имеет предопределенное значение N0, равное количеству буферов выходной очереди, заполненных предопределенными данными для предотвращения ситуации недостатка данных в выходной очереди сразу после открытия выходного порта. В момент открытия входного канала ж принимает значение 0 и начинает монотонно увеличиваться с частотой £ В момент открытия выходного канала величина у принимает значение 0, после чего происходит чтение буфера выходной очереди в аппаратную очередь.

Если рассмотреть выражение (4) в указанный выше момент открытия выходного канала, то задержка звука в системе окажется равной (М^0+х)/£ Поскольку входной и выходной порты работают с одинаковой скоростью, эта задержка остается постоянной при нормальной работе канала вплоть до его закрытия. Величина ж лежит в пределах от 0 до М, значит общая задержка звука может варьироваться на величину от 0 до М/£, если моменты времени запуска входного и выходного порта не синхронизированы.

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

(МхЫ0ф+й

(5)

где й — запаздывание открытия выходного порта относительно открытия входного, то есть й=х/£в момент открытия выходного порта.

Далее мы будем исходить из предположения синхронного открытия портов, то есть случая, когда d=0.

Толерантность к задержкам

Из выражения (5) следует, что задержка передачи звука в анализируемой системе зависит исключительно от количества буферов, изначально помещенных в выходную очередь, то есть от искусственно заданной величины

смещения между моментами получения сигнала на входе и его подачи на выход.

Существует, однако, весьма существенное условие, необходимое для поддержания постоянной задержки в процессе работы канала. Поскольку наличие N0 предварительно подготовленных буферов обеспечивает запас проигрываемого звука на время MxN0/f, по истечении этого срока необходимо иметь хотя бы один вновь подготовленный буфер аудиоданных. Задержка промежуточной обработки на большую величину приводит к ситуации отсутствия данных на выходе системы, поэтому она недопустима.

Более подробный анализ показывает, что обеспечение максимального времени обработки звука MxN0/f недостаточно для предотвращения отсутствия выходных данных. В этом легко убедиться, рассмотрев ситуацию, когда первый же входной буфер задерживается в обработке на MxN0/fсекунд. Легко заметить, что после его помещения в выходную очередь в ней имеется всего один кадр, и задержка обработки следующего пакета более чем на М/£ повлечет ситуацию отсутствия данных для вывода.

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

Хочется особо отметить роль величины N0, то есть числа предустановленных буферов в выходной очереди. Очевидно, что если обработка входных кадров всегда укладывается в М/£секунд, аудиосистема функционирует стабильно даже при N0=1. Эта ситуация характерна в случае, если приложение спроектировано с соблюдением правил жесткого реального времени, гарантирующих своевременность реакции на все события. Однако для более полного использования процессорного ресурса часто допускается кратковременный выход времени обработки за пределы М/£ В этом случае величину N0необходимо увеличивать, повышая толерантность системы, но увеличивая общую задержку звука в ней.

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

Следует также обратить внимание на то, что наличие предустановленных кадров во входной очереди канала не влияет на толерантность системы к задержкам в модулях обработки звука. Это достаточно естественно, так как входная очередь служит для избежания потерь данных из-за превышения текущей скорости поступления над скоростью обработки, то есть предназначена для предотвращения переполнения, а не недостатка данных.

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

Аналогично нецелесообразно объявлять выходную очередь длиной более N0, поскольку по логике своего функционирования она может временно оказываться короче, чем в начальный момент времени (при задержках поступления данных от задач промежуточной обработки), но не может становиться длиннее.

Знание этих фактов позволяет установить, что длины входной и выходной очередей канала следует:

• устанавливать равными;

• выбирать максимально допустимыми, исходя из величины разрешенной системной задержки (М^0ф, то есть равными N0 буферов каждая;

• изначально обеспечивать предопределенную задержку между входными и выходными аудиоданными путем помещения N0 готовых кадров в выходную очередь канала.

Потери аудиоданных и борьба с их последствиями

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

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

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

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

Компоненты и технологии, № 2'2005

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

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

Это, в свою очередь, означает, что первый и последний отсчеты замещающего буфера должны иметь значения, близкие либо равные друг другу и последнему отсчету буфера, предшествующего задержанному в обработке. Если «псевдокадр» образуется из предыдущего, то для его последнего отсчета это условие выполняется автоматически (он, естественно, равен самому себе) и коррекция необходима лишь в начале пакета. Одна из простейших формул для такой модификации имеет вид:

у[1] = (х[1] х I + х[М -1-1] х х (М-1-1)) / (М-1), I = 0...М - 1 (6)

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

где х — последний известный кадр, у — замещающий кадр, I — номер отсчета, М — длина кадра.

Данная формула дает гладкий сигнал, основанный на текущих характеристиках звукового потока и обеспечивающий плавный стык как с предыдущим, так и с последующим кадром. При этом объем вычислений невелик.

Флуктуация задержки при потере аудиоданных

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

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

Поскольку длительная задержка доставки аудиопакетов возникает, как правило, при временной перегрузке программной системы высокоприоритетными процессами, весьма вероятно, что чрезмерно длительная обработка за-

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

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

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

Следует отметить, что выбрасывание реальных (а не искусственно сгенерированных внутри аудиоподсистемы) блоков аудиоинформации приводит к искажению выходного звукового потока. Однако практика показывает, что при передаче речи удаление кадра длительностью в несколько миллисекунд практически не заметно на слух, если не осуществляется на фоне других факторов, снижающих качество воспринимаемого звука.

Практика применения

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

1. Данные следует передавать пакетами фиксированной длины. Обработка единичных звуковых отсчетов приводит к существенному снижению производительности программной системы, зачастую неприемлемому с точки зрения предъявляемых к ней требований. Целесообразно оперировать кадрами равной длины как минимум в рамках одного канала. Это позволяет избежать нерегулярности доставки пакетов.

Однако если при передаче данных от входного к выходному порту канала производится изменение частоты дискретизации (то есть увеличивается или уменьшается суммарное чис-

ло отсчетов), длина или количество пакетов также по необходимости изменяются. В этом случае следует по возможности использовать выходные кадры, кратные по размеру входным, сохраняя общее число пакетов неизменным. В этом случае регулярность следования пакетов и изложенные выше положения, касающиеся задержек в системе, не нарушаются.

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

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

3. Канал должен содержать входную и выходную очереди буферов. Введение входной и выходной очередей звуковых кадров серьезно повышает толерантность системы к внутренним задержкам обработки звука. Длины обеих очередей разумно выбирать равными. Абсолютное значение длины очереди буферов однозначно вычисляется из максимальной допустимой общесистемной задержки звука. Использование более длинных очередей не приводит к повышению надежности системы.

4. Перед открытием аудиоканала следует заполнить выходную очередь буферов фиктивными кадрами для поддержания постоянного числа буферов в системе после открытия канала. Исходное состояние выходной очереди — заполненное на максимальную длину за вычетом одного кадра, а входной — пустое. В условиях отсутствия задержек промежуточных алгоритмов обработки звука состояние обеих очередей соответствует исходному с точностью до ±1 буфера.

5. При наличии входной и выходной очередей буферов кратковременные задержки при промежуточной обработке звука не влекут за собой искажение аудиопотока на выходе системы.

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

i Надоели баннеры? Вы всегда можете отключить рекламу.