А у нас новый сайт ----------------> www.ph-ph.ru!
Finar.ru
web.finar.ru
video.finar.ru
Темы для BootstrapNew!

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

Как работают mp3, ogg и т.д.? Как работает APE? Как сжать звук без потери качества? Ответы в этой статье.

Автор: Филипп Казаков | 2003-12-08 | просмотров 7882
Тэги

Публикация:
Компьютерра, линк 

Любители мультимедиа технологий, наверняка знают, что на сегодняшний день существует немало различных форматов сжатия звука. У каждого их них есть свои преимущества. RealAudio предназначен для потокового транслирования звука через Интернет, MAC неплохо сжимает без потери качества, ac3 отлично подходит для DVD-video, WMA известен благодаря своему владельцу и качеству на низких битрейтах, Vorbis привлекает своею бесплатностью. Даже внутри одного пресловутого mp3 существует разделение – алгоритмы Xing сжимают очень быстро, но плохо, официальный Fraunhoffer жмет хорошо на низких битрейтах, открытый для всех Lame – лидер на высоких. И при этом популярностью пользуются все три алгоритма.

Принципы психоакустической компрессии.

Все (Хотя про форматы wma и ac3 информация в Сети довольно скудная и противоречивая, она все же позволяет предположить схожесть с принципами mp3 и др.) самые распространенные потоковые форматы сжатия (mp3, ac3, wma, ogg) основаны на схожем принципе работы, состоящем из трех основных этапов сжатия:

  1. Быстрое Фурье преобразование (FFT) исходного сигнала (фрейма, так как форматы потоковые). Кратко FFT – это процесс, представляющий исходный сигнал в виде суммы синусоид: F(t)=A'_1_'sin(λ'_1_'t) + … + A'_n_'sin(λ'_n_'t) + … Теперь, вместо того чтобы хранить информацию о величине амплитуды волны в каждом сэмпле, остается запомнить только значения амплитуд (Ai) и длин волн (li). Обратное преобразование Фурье для реальных звуков без потери качества невозможно.
  2. психоакустическая обработка, призванная вычистить из звукового потока информацию, не воспринимаемую человеческим ухом.
  3. применение математических алгоритмов сжатия. Во время этой операции происходят исключительно численные преобразования, позволяющие представить информацию в более компактном виде. В mp3, например, используется чуть-чуть доработанный алгоритм Хаффмана (Подробнее о принципе работы этого алгоритма см. КТ #18(493) ).

Алгоритм FFT уже сравнительно давно известен, и на его модификации далеко не уедешь, поэтому разработчики совершенствуют методики сжатия за счет оптимизации математического и психоакустических алгоритмов кодирования. Если математический алгоритм в каждом формате свой собственный, то основные принципы действия психоакустического алгоритма сжатия схожи, и заимствуют общие идеи от небезызвестного формата MPEG 1 layer II, разработанного в 1992 году Экспертной группой кинематографии (MPEG - Moving Picture Experts Group)(Этот формат предназначался для формата mpeg1, использовавшегося в VCD 1.0 и позволял кодировать звук «без существенных искажений» при битрейте 192 kbps. Наряду с этим форматом также развивался MPEG 1 layer III, отличавшийся более высоким качеством (128 kbps Layer III сравнимо с 192 kbps Layer II) и требованиями к вычислительным ресурсам (486-е процессоры при декодировании испытывали затруднения). Именно этот алгоритм затем «вырос» во всем известный сегодня mp3.).

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

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

noteНиже абзац идет немного на зрелый взгляд несколько неточная информация, т.к. в случае кодирования CD "все уже отрезано до нас".%

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

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

Граница слышимости в тишине.
Граница слышимости в тишине.

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

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

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

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

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

Граница слышимости под воздействием тона частотой 1 кГц и интенсивностью 60 дБ.
Граница слышимости под воздействием тона частотой 1 кГц и интенсивностью 60 дБ.

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

Граница слышимости под воздействием сразу нескольких маскирующих тонов (частотой 0,25, 1, 4, 8 кГц).
Граница слышимости под воздействием сразу нескольких маскирующих тонов (частотой 0,25, 1, 4, 8 кГц).

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

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

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

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

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

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

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

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

Общая эффективность компрессии звука.
Общая эффективность компрессии звука.

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

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

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

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

Теория Monkey’s Audio lossless компрессии.

Алгоритмы lossy и lossless компрессии (с потерей и без потери качества соответственно) принципиально отличаются друг от друга. Если lossy алгоритмы после FFT работают с привычными для нас звуковыми волнами, то все lossless кодировщики понятия не имеют о том, что длинный набор чисел на входе может быть представлен в виде волны с амплитудой и периодом. Их задача – исключительно математическими методами упаковать информацию поплотнее так, чтобы она могла быть в точности восстановлена впоследствии. Во многом алгоритмы lossless сжатия схожи с алгоритмами обычных архиваторов. Но архиваторы ориентированы на сжатие любой информации, lossless кодеки же обладают некоторой спецификой, которая позволяет им лучше справляться со своей прямой задачей – компрессией звука. Кроме того, при декодировании (проигрывании) сжатого звукового файла требуется возможность быстрой перемотки. Закодированный файл должен быть разделен на сравнительно короткие промежутки, каждый из которых сжимается независимо от остальных. Архиваторы же могут позволить себе работу с непрерывными архивами, дающими лучшее сжатие.

В сети есть несколько разных форматов хранения звука без потери качества. Самым популярным их них является Monkey’s Audio Compression (О странном названии своего детища автор получал так много вопросов, что даже вынес их в FAQ: «Q: Why name a lossless compression technology "Monkey's Audio"? A: Well…who doesn't love monkeys?».). Он обеспечивает lossless сжатие аудиоинформации в среднем в 1.5-2 раза. Этот алгоритм состоит из трех основных этапов кодирования. Только один из них базируется на использовании природных свойств звука, позволяющих представлять закодированный сигнал в более удобной для компрессии форме. На двух оставшихся этапах используются методы сжатия, в принципе применимые для информации любой природы.

Этап 1: замена переменных

'-(Информация о методе сжатия базируется на

В исходной некомпрессированной записи информация об амплитуде волны левого и правого канала сохраняется с определенной частотой дискретизации и записывается просто подряд. Вот как выглядит секунда звука обыкновенного 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.

Один из эффектов этого преобразования очевиден. Если разница между левым и правым каналом незначительна или постоянна или ее нет вовсе, то после преобразования Y-ки будут, соответственно, или приближены к нулю, или все одинаковы, или просто равны 0(В качестве проверки этого факта я сжал два 10-секундных файла с шумом – первый моно, а второй стерео. Оба канала стереофайла были копией канала монофайла. В результате стерео файл получился всего лишь на 8 байт (!) больше, чем моно, и это при объеме 559 644 байт. После этого один из каналов стереофайла был сдвинут на 5 мс . На этот раз объем сжатого файла составил 1 107 836 байт.). В любом из этих случаев дальнейшее сжатие Y-ов пойдет веселей.

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

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

На этом этапе исключается избыточность информации. Именно реализацией этой части алгоритма и отличаются различные алгоритмы lossless сжатия.

Задача предсказателя – по возможности минимизировать значения X-ов и Y-ов. Проще всего описать работу предсказателя на упрощенном примере. Пусть дана последовательность значений 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 и рамок его изменений становится пренебрежимо малой.

Этап 3: финальное сжатие.

На заключительном этапе происходит обыкновенное сжатие данных, похожее на алгоритмы стандартных архиваторов. Предположим, что перед алгоритмом возникла задача сжать последовательно четыре числа: 10, 14, 15 и 46. Так как разрядность оцифрованного звука – 16 бит, в некомпрессированном двоичном виде эти числа будут записаны как 0000000000001010, 0000000000001110, 0000000000001111, 0000000000101110, и занимать, в сумме, 8 байт или 64 бита. Удалив лишние нули в начале каждого числа, запишем их подряд: 101011101111101110. В таком виде они занимают 18 бит. Именно так, к сожалению, получившиеся числа хранить нельзя, так как потеряна информация о том, где заканчивается одно число и начинается другое. Сохранить ее можно с небольшим увеличением объема.

Из имеющихся 4-х чисел минимальная двоичная длина числа составляет 4 бита (в числах 10, 14 и15). Запомним это число как переменную k. Она обозначает длину числа по умолчанию. С учетом сохраненного значения переменной k, первые три числа можно записать просто подряд: 101011101111. Теперь осталось закодировать только последнее число, 46 (в двоичном коде 101110). Отбросим справа k=4 бит. Оставшиеся два бита переполнения (10), в десятичной системе исчисления составляют 2. Теперь запишем число 46 в следующей форме: сначала нулями (то есть «одноично») коэффициент переполнения (в нашем случае 2): 00, затем 1, означающую окончание кодировки переполнения, и в конце те самые 4 бита, которые были отброшены в самом начале.

Итак, 46 в компрессированном виде записано так: 0011110.

Вся последовательность 10, 14, 15, 46 при k=4 записывается так: 1010111011110011110. Несложно проверить, что описанный алгоритм полностью обратим. Объем информации, занимаемый этой последовательностью, составляет 19 бит, плюс еще информация о величине k.

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

На этом этапе MAC заканчивает свою работу, а результаты записывает в файл .ape

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

Практика.

У Monkey’s Audio компрессии существует не только теоретическая сторона. Изложенный принцип сжатия уже нашел реализацию во вполне удобном приложении, называемом также - Monkey’s Audio.

При его инсталляции вам предложат добавить к 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 gHz (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:

  1. Низкая ресурсоемкость.
  2. Относительно высокий коэффициент сжатия.
  3. Бесплатность кодека.
  4. Простота применения.

Минусы Monkey’s Audio:

  1. Невозможность сжатия CDA напрямую. Для grab’a придется использовать отдельное приложение {лучше всего использовать EAC } .
  2. Отсутствие ACM кодека {ACM-кодек появился }.
  3. Низкая совместимость. Для проигрывания на других компьютерах придется все время таскать с собой dll-ку с декодером .ape для Winamp



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


Ваше имя:
->