Архивы: по дате | по разделам | по авторам

Мартышка и наушники

Архив
автор : Филипп (Finar) Казаков   23.12.2003

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

=+=+=+=

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

RealAudio предназначен для потокового транслирования звука через Интернет, MAC1 неплохо сжимает без потери качества, AC3 отлично подходит для DVD-video, WMA известен благодаря своему владельцу и высокому качеству на низких битрейтах, Vorbis OGG привлекает бесплатностью и, позволю предположить, молодой открытостью (вспомним DivX). Даже внутри MP3 существует разделение: алгоритмы Xing сжимают очень быстро, но плохо, официальный Fraunhoffer жмет хорошо на низких битрейтах, открытый для всех Lame — лидер на высоких. При этом популярностью пользуются все три алгоритма.

Все2 распространенные потоковые форматы сжатия (MP3, AC3, WMA, OGG) основаны на схожем принципе работы, состоящем из трех основных этапов:

- Быстрое преобразование Фурье (FFT) исходного сигнала (фрейма, так как форматы потоковые). Кратко FFT — это процесс, представляющий исходный сигнал в виде суммы синусоид:

F(t)=A1sin(l1t) + … + Ansin(lnt) + …

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

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

Алгоритм FFT известен сравнительно давно, и на его модификации далеко не уедешь, поэтому разработчики совершенствуют методики сжатия за счет оптимизации математического и психоакустических алгоритмов кодирования. Если математический алгоритм в каждом формате свой, то основные принципы действия психоакустического алгоритма сжатия схожи и заимствуют общие идеи у небезызвестного формата MPEG-1 Layer II, разработанного в 1992 году Moving Picture Experts Group4.

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

Диапазон слышимости

Человеческое ухо неидеально. Во младенчестве человек воспринимает звук в диапазоне от 15 Гц до 22 кГц; с возрастом рамки сужаются, и средний взрослый человек слышит звуки от 20 Гц до 18 кГц. Такая же ситуация и с восприятием амплитуды волны, то есть с громкостью. Динамический диапазон человеческого уха составляет 96 дБ. Проще и линейно говоря, самый громкий звук (выше которого находится болевой порог) более чем в 30 тысяч раз интенсивнее самого тихого, который ухо может различить. На этих свойствах слухового аппарата основана работа первого фильтра кодировщика. Он просто отрезает сигналы, выходящие за пределы указанных диапазонов частот и амплитуд. Однако уже эта операция уменьшает «живость» звука. Многие сверхнизкие и сверхвысокие звуки человек не может услышать, осознать, при этом все же ощущая их. Громкие сверхнизкие тона можно «услышать телом» по резонансу в костях и других частях тела. Тихие же вызывают бессознательное чувство беспокойства, напряженности. Безопасный инфразвук (10–15 кГц) применяется в кинотеатрах для пущего нагнетания атмосферы в фильмах ужасов.

Следующее важное свойство человеческого слуха — неравномерность распределения границы слышимости звука по частотам. Наилучшим образом мы слышим частоты в районе 2–4 кГц (не случайно речевой диапазон находится примерно в этой же области, в природе все взаимосвязано), к низким и высоким частотам чувствительность уха снижается.

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

Чувствительность уха

К изменению каждого их двух параметров волны — частоты и амплитуды — у уха есть некоторый нижний порог чувствительности. Если изменение меньше этого порога, алгоритм его игнорирует. Например, для сигнала с частотой 1 кГц порог чувствительности составляет примерно 30 Гц. Если в кодируемом сигнале частота изменяется с 1000 Гц на 1020 Гц, сохранять это изменение не имеет смысла, так как человек все равно его не заметит. Таким образом, достаточно просто увеличить временные рамки звучания тона 1 кГц, а не кодировать два разных сигнала.

Частотная маскировка

Любой слышимый тон изменяет восприятие остальной звуковой картины. При воспроизведении какого бы то ни было тона граница слышимости соседних с ним по частотам звуков изменяется. В этом случае воспроизводимый тон называется маскирующим, а граница слышимости окружающих его тонов поднимается тем выше, чем ближе их частота к частоте маскирующего сигнала. То есть, слушая низкий звук, значительно проще услышать высокий звук, нежели низкий другой частоты. Под воздействием тона частотой 1 кГц и интенсивностью 60 дБ измененная граница слышимости будет выглядеть примерно как на рис. 2.

Обратите внимание, что зачастую в музыке одновременно присутствуют самые разнотоновые компоненты. Бочка, например, и тарелки. Таким образом, маскирующих тонов может быть несколько. При использовании сразу нескольких маскирующих тонов (частотой 0,25, 1, 4, 8 кГц, см. рис. 3) граница слышимости остальных сигналов сильно поднимается.

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

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

Временная маскировка

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

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

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


1 (назад)Не путать с Мак’овским AIFF. — Прим. ред.
2 (назад) Хотя про форматы WMA и AC3 информация в Сети довольно скудная и противоречивая, она все же позволяет предположить схожесть с принципами MP3 и др.
3 (назад) Подробнее о принципе работы этого алгоритма см. «КТ» #493.
4 (назад) Он предназначался для формата MPEG-1, использовавшегося в VCD 1.0, и позволял кодировать звук «без существенных искажений» при битрейте 192 кбит/с. Наряду с этим форматом также развивался MPEG-1 Layer III, отличавшийся более высоким качеством (128 кбит/с Layer III сравнимо с 192 кбит/с Layer II) и требованиями к вычислительным ресурсам (486-е процессоры при декодировании испытывали затруднения). Именно этот алгоритм затем «вырос» во всем известный сегодня MP3.

В графиках частотной и временной маскировки одна из осей совпадает — и это не случайно. Совместив эти два графика, можно построить объемную диаграмму, иллюстрирующую общую эффективность компрессии звука, основанной на маскировке сигналов (рис. 5).


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

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

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

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

 

Теория

Алгоритмы lossy- и lossless-компрессии (с потерей и без потери качества соответственно) принципиально отличаются друг от друга. Если lossy-алгоритмы после FFT работают с привычными для нас звуковыми волнами, то все lossless-кодировщики понятия не имеют о том, что длинный набор чисел на входе может быть представлен в виде волны с амплитудой и периодом. Их задача — исключительно математическими методами упаковать информацию поплотнее так, чтобы она могла быть в точности восстановлена впоследствии. Во многом алгоритмы lossless-сжатия схожи с алгоритмами обычных архиваторов. Но архиваторы ориентированы на сжатие любой информации, lossless-кодеки же обладают некоторой спецификой, которая позволяет им лучше справляться со своей прямой задачей — компрессией звука. Кроме того, при декодировании (проигрывании) сжатого звукового файла требуется возможность быстрой перемотки. Закодированный файл должен быть разделен на сравнительно короткие промежутки, каждый из которых сжимается независимо от остальных. Архиваторы же могут позволить себе работу с непрерывными архивами, дающими лучшее сжатие.
В Сети есть несколько разных форматов хранения звука без потери качества. Самым популярным их них является Monkey’s Audio Compression1 (MAC, www.monkeysaudio.com). Он обеспечивает lossless-сжатие аудиоинформации в среднем в 1,5–2 раза. Этот алгоритм состоит из трех основных этапов кодирования. Только один из них базируется на использовании природных свойств звука, позволяющих представлять закодированный сигнал в более удобной для компрессии форме. На двух оставшихся этапах используются методы сжатия, в принципе применимые для информации любой природы.

Этап первый: замена переменных2

В исходной некомпрессированной записи информация об амплитуде волны левого и правого канала сохраняется с определенной частотой дискретизации и записывается подряд. Вот как выглядит секунда звука обыкновенного Audio CD: LR LR … LR LR (44100 сэмплов LR), где L и R — 16-битные числа, характеризующие амплитуду волны в левом и правом канале соответственно.
Часто в музыке сигналы левого и правого канала очень похожи. Этим грех не воспользоваться. На первом этапе алгоритм MAC преобразует исходную информацию (числа L и R в каждом сэмпле) по такому принципу: X = (L + R)/2 и Y = (L - R), где X и Y — новые переменные, с которыми алгоритм и будет работать в дальнейшем. Легко видеть, что исходные значения L и R легко восстановимы из X и Y преобразованием: R = X - Y/2 и L = X + Y/2.
Один из эффектов этого преобразования очевиден. Если разница между левым и правым каналом незначительна или постоянна или ее нет вовсе, то после преобразования «игреки» будут соответственно или приближены к нулю, или все одинаковы, или равны 03. В любом из этих случаев дальнейшее сжатие «игреков» пойдет веселей.
Информация о звуковом сигнале преобразована в удобный для компрессирования вид, и теперь алгоритм MAC работает с новыми переменными X и Y.

Этап второй: мультипроходный предсказатель

На этом этапе исключается избыточность информации. Именно реализацией этой части алгоритма и отличаются различные алгоритмы lossless-сжатия.
Задача предсказателя — по возможности минимизировать значения «иксов» и «игреков». Проще всего описать работу предсказателя на упрощенном примере. Пусть дана последовательность значений X (8, 24, 45) и некоторая формула, позволяющая рассчитать опорное значение PX по двум предыдущим значениям X: PX = (2 x X-1) - X-2, где X-2 и X-1 — два предыдущих значения Х.
Рассчитаем опорное значение РХ для последнего значения нашей последовательности: PX = (2 x 24) - 8 = 40.
Теперь вместо последнего значения, запишем в нашу последовательность разность между реальным и опорным значением: (8, 24, 45 – 40 = 5) Число 5 ввиду своей более низкой двоичной разрядности на заключительном этапе будет кодироваться лучше, чем 45.
Большая часть хороших кодировщиков адаптивна, то есть может приспосабливаться к кодированию конкретной информации. Для адаптации, естественно, требуется мультипроходное кодирование. При каждом следующем проходе кодек учитывает результаты предыдущего прохода и улучшает адаптацию. Результат компрессии тем выше, чем больше сделано проходов. Вот («на пальцах») как это реализовано в алгоритме MAC. Возьмем параметр m, варьирующийся от 1 до 1024 и по умолчанию равный 512. Он будет служить «адаптатором». Для расчета последнего значения Xf последовательности воспользуемся такой формулой: Xf = X0 - PX х m/1024 = 45 - 40 х 512/1024 = 25.
Результат не очень впечатляет — 25 всего лишь на один двоичный порядок меньше 45. При следующем проходе алгоритм увеличит значение m.
Финальная степень компрессии зависит от того, насколько удачно выбраны изначальные формулы для расчета PX, а также от количества совершенных при компрессии проходов.
Описанный пример ни в коей мере не иллюстрируют реальную работу алгоритма MAC, а лишь описывает принцип его действия. В приведенном тривиальном примере экономия объема от применения преобразований не очень заметна, однако в действительности устройство кодека более сложное и детальное, он оперирует со значительно бо,льшими объемами информации, по сравнению с которыми служебная информация вроде величины m и рамок его изменений становится пренебрежимо мала.

Этап третий: финальное сжатие

На заключительном этапе происходит обыкновенное сжатие данных, похожее на алгоритмы стандартных архиваторов. Предположим, что перед алгоритмом возникла задача сжать последовательно четыре числа: 10, 14, 15 и 46. Так как разрядность оцифрованного звука — 16 бит, в некомпрессированном двоичном виде эти числа будут записаны как 0000000000001010, 0000000000001110, 0000000000001111 и 0000000000101110 и в сумме займут 8 байт, или 64 бита. Удалив лишние нули в начала каждого числа, запишем их подряд: 101011101111101110. В таком виде они занимают 18 бит. Именно так, к сожалению, получившиеся числа хранить нельзя, поскольку потеряна информация о том, где заканчивается одно число и начинается другое. Сохранить ее можно с небольшим увеличением объема.
Из имеющихся четырех чисел минимальная двоичная длина числа составляет четыре бита (в числах 10, 14 и 15). Запомним это число как переменную k. Она обозначает длину числа по умолчанию. С учетом сохраненного значения переменной k первые три числа можно записать подряд: 101011101111. Теперь осталось закодировать только последнее число, 46 (в двоичном коде 101110). Отбросим справа k = 4 бит. Оставшиеся два бита переполнения (10) в десятичной системе исчисления составляют 2. Теперь запишем число 46 в следующей форме: сначала нулями (то есть «одноично») коэффициент переполнения (в нашем случае 2) — 00; затем 1, означающую окончание кодировки переполнения; и в конце те самые четыре бита, которые были отброшены.
Итак, 46 в компрессированном виде записано как 0011110.
Вся последовательность 10, 14, 15, 46 при k = 4 записывается так: 1010111011110011110. Нетрудно проверить, что описанный алгоритм полностью обратим. Объем информации, занимаемый этой последовательностью, составляет 19 бит плюс еще информация о величине k.
Описанный пример, как и в предыдущем случае, достаточно тривиален, при реальном применении алгоритма используются гораздо бо,льшие числа, при кодировании которых информация о величинах k становится пренебрежимо малой.
На этом этапе MAC заканчивает работу, а результаты записывает в файл с расширением .ape.

1 (назад) О странном названии своего детища автор получал так много вопросов, что даже вынес их в FAQ. Q: Why name a lossless compression technology «Monkey’s Audio»? A: Well… who doesn’t love monkeys?
2 (назад) Информация о методе сжатия базируется на авторском описании: www.monkeysaudio.com/theory.
3 (назад) Для проверки этого факта я сжал два 10-секундных файла с шумом — первый моно, а второй стерео. Оба канала стереофайла были копией канала монофайла. В результате стереофайл получился всего лишь на 8 байт (!) больше, чем моно, и это при объеме 559 644 байта. После этого один из каналов стереофайла был сдвинут на 5 мс. На этот раз объем сжатого файла составил 1 107 836 байт.

 

Практика

У Monkey’s Audio-компрессии существует не только теоретическая сторона. Изложенный во врезке принцип сжатия уже нашел реализацию во вполне удобном приложении, которое тоже называется Monkey’s Audio (www.monkeysaudio.com).
При его инсталляции вам предложат добавить к Winamp’у dll-библиотеку, которая позволит проигрывать ape-файлы. Эти самые файлики и будет создавать Monkey’s Audio при компрессии.

Больше всего Monkey’s Audio напоминает архиватор со всеми необходимыми атрибутами. Он умеет встраиваться в Проводник, сжимать wav-файлы, разжимать, тестировать, редактировать теги .ape, конвертировать из .ape в другие форматы. Интерфейс программы вызывает ассоциации с WinRAR, так что никаких трудностей в освоении возникнуть не должно. Неожиданно и приятно то, что автор включил в программу поддержку сторонних конкурирующих форматов. Так, Monkey’s Audio умеет конвертировать в три дополнительных lossless-формата — Rkau, Wavpack и Shorten, которые, надо отметить, иногда составляют достойную конкуренцию внутреннему формату MAC. Кроме того, поддерживаются четыре внешних lossy-кодировщика — два MP3 (MP3Enc и Lame), MP+ и OGG.

Конвертирование в основной формат ape может производиться с четырьмя разными уровнями компрессии. Чем выше уровень, тем больше времени займет сжатие. Кроме того, чем сильнее сжат файл, тем больше процессорного времени потребуется Winamp’у для его декодирования. В качестве иллюстрации ресурсоемкости алгоритма я провел несколько операций с известной инструментальной композицией Atom Heart Mother (Pink Floyd), длительностью 23 минуты 44 секунды (PCM, 44 kHz, 16 bit, Stereo). На компьютере с процессором Celeron 1,7 ГГц (DDR 2100) кодирование этого файла с максимальным сжатием заняло 2 минуты 19 секунд, декодирование в WAV — 2 минуты 32 секунды. В результате файл сжался до 49% от своего изначального размера. Очень неплохой результат, особенно учитывая разноплановость композиции. Во время воспроизведения закодированного файла в Winamp’e загрузка процессора не превышала 1%. Как видите, на современных компьютерах работа с этим форматом не вызовет ни малейшего дискомфорта.

По заверениям разработчика, Monkey’s Audio позволяет кодировать wav-файлы с любой частотой дискретизации, 8-, 16- или 24-битным динамическим диапазоном, моно или стерео. Насчет уж совсем любой частоты дискретизации возникают некоторые сомнения, однако все основные частоты (22,05, 32, 44,1, 48 кГц), а также битности и число каналов в разных комбинациях были мною проверены.

Подведем итог. Monkey’s Audio будет безусловно полезна людям, ценящим максимально качественный звук. Давая сжатие около 40–50%, ape-файлы вполне могут заменить mp3-архивы настоящих ценителей, благо удобство использования этого формата почти на уровне mp3. Наверняка он заинтересует и тех, кто имеет отношение к работе с цифровым звуком. Если же для вас идеальное качество звука не играет особой роли и сжатие производится только для последующего прослушивания, целесообразнее использовать какой-либо lossy-кодек — он даст самую большую экономию дискового пространства. С другой стороны, всегда приятно иметь пару любимых композиций в формате без потери качества — вдруг недалек тот день, когда большинство компьютеров станет оборудовано акустикой, достаточной для воспроизведения всех прелестей CDA.

Плюсы Monkey’s Audio:

- Низкая ресурсоемкость.
- Относительно высокий коэффициент сжатия.
- Бесплатность кодека.
- Простота применения.
Минусы Monkey’s Audio:
- Невозможность сжатия CDA напрямую. Для grab’a придется использовать отдельное приложение.
- Отсутствие ACM-кодека.
- Низкая совместимость. Для проигрывания на других компьютерах придется таскать с собой dll с декодером .ape для Winamp.

© ООО "Компьютерра-Онлайн", 1997-2024
При цитировании и использовании любых материалов ссылка на "Компьютерру" обязательна.