...в написании для нового поколения. Самое интересное в настоящем времени: то, что нам кажется самым истинным и оптимальным сейчас, для следующих поколений будет являться чем-то "мезозойско"-консервативным и громоздким. Правы будут они, а мы будем лишь брюзжащими стариками, говоря "э-эх, ассемблер", ой... извините, "э-эх, Windows Vista". И, кстати, сейчас происходят некоторые интересные движения вокруг аудиокодеков ("кодек" - кодер-декодер), о чём и стоит поговорить. Поговорить имеет смысл и по другой причине, поскольку очень часто молодые читатели пишут письма с вопросами, не совсем понимая, как, собственно, аудиокодеки работают.
Конечно, предполагается, что нас сейчас читает не совсем подготовленный пользователь, поэтому и повествование будет строиться практически "на пальцах".
Для начала давайте рассмотрим, как это было в графике, причём берём её в качестве примера. Естественно, растровое изображение можно представить себе в виде BMP-файла, который всё выводит за счёт точек. Естественно, изначально думали о сжатии без потерь (lossless-компрессия), и основной вопрос упирался в... архиваторы, вернее, их алгоритмы. Изобретений в этой области было много, но в одно время наступил технологический предел. То есть, больше жать уже невозможно, но нужно! Соответственно, было решено применить аппроксимацию, то есть упрощение сложного, и всё-таки предусмотреть сжатие с потерями в данных, но... без ощутимых потерь для человеческого глаза (восприятия, а, соответственно, и результата). GIF пошёл, в основном, путем упрощения цветовой гаммы плюс архивирование с помощью LZW-алгоритма. А в рамках JPEG предусматривался более сложный, но совершенный механизм с разделением цветовой модели (так же, как это делалось в цветном телевидении), последующим разбиением на блоки, разреживанием по цветам и так далее. В результате JPEG стал самым популярным стандартом сжатия изображений. Мало того, он явился технологической предтечей, или, лучше сказать, базой для появления MPEG и современного цифрового вещания.
В принципе, если бы тогда занимались идеализированием и не подразумевали алгоритмические модели с потерями информации, то до современных реалий было бы практически невозможно добраться. Как говорится, будь проще, и к тебе потянутся люди, вернее, "сделай аппроксимацию, и задача типа решена":). Кстати, замена большого количества данных математическими алгоритмами - это наиболее оптимальное решение современных задач. Например, в одном из изданий ваш покорный слуга пишет серию материалов по ИИ и приводит очень наглядный пример. Вспомните, чем пользовались при своих вычислениях наши родители, когда не было портативных калькуляторов. Правильно, таблицами со значениями результатов вычисления корней, тригонометрических функций, степеней и даже... просто умножения. Всё это громадьё данных сейчас заменяется несколькими строками программного кода. Конечно, мы описали самый идеальный вариант упрощения, но в аудио и видео мы можем наблюдать нечто среднее.
В звуке столкнулись со схожей проблемой, что и в графике, ведь и BMP, и WAV - это практически табличное хранение данных. Причём в том же звуке также изначально думали о lossless-варианте, но он не послужил панацеей. Даже сейчас для современного пользователя ПК нет особой разницы: хранить и использовать обычные wav-файлы либо их lossless-аналоги. Ведь коэффициент сжатия получается достаточно небольшим, какой бы совершенный алгоритм не использовался. Поэтому и тут решили перейти на варианты lossy.
Изначально на самые простые, как говорится, "не проникая внутрь". Например, уменьшив значения частоты дискретизации и разрядности (практически то же самое, что и в GIF'aх для графики - уменьшение цветовой палитры), мы получаем выигрыш в виде уменьшения объёма данных, но потери в качестве ощутимы на слух. Также мы можем ужать частотный диапазон, например, до речевого спектра, но данный вариант в музыке не подходит. Кстати, вопрос на засыпку: а как ужать частотный диапазон до уровня речевого сигнала, не используя преобразований Фурье, т.е. не переходя в спектральную область? Правильно, "похимичить" с частотой дискретизации.
А одну из самых интересных идей в рамках современности можно увидеть в свежем проекте lossyWAV (wiki.hydrogenaudio.org/index.php?title=LossyWAV). Причем молодое поколение со своим достаточно интересным взглядом вообще позволило посмотреть на проблему с другой стороны. Дело в том, что они пошли по пути упрощения WAV-файла, обнуляя младшие биты, а сами варианты этих удалений рассчитываются исходя из наполнения каждого отдельно взятого сэмпла (цифрового отчета). Чтобы было более понятно, это как если бы в BMP некоторые точки упрощались. После этого идёт стандартная обработка lossless-компрессией и мы можем наблюдать уже более значительный коэффициент сжатия. И, опять же, проводя параллель с графикой, в данном случае мы можем говорить об интеллектуальном уменьшении цветовой палитры. На слух lossyWAV воспринимается практически идентично натуральному файлу, поэтому, очень часто говоря именно об этом алгоритме, может применяться и термин lossless.
На самом деле очевидное оно же всегда рядом. Например, большинство современных lossy-кодеков предусматривают уменьшение количества данных за счёт коррекции в частотной области (frequency domain, до этого мы говорили о временной - time domain). Если объяснять всё на простом уровне, используется обычное преобразование Фурье, где для построения спектра конкретного звукового фрагмента необходимо выбрать определённое количество отсчётов в амплитудно-временном представлении. То есть, сам файл получается как бы составлен из кадров-спектрограмм. Он их в себе и хранит. И в каждом из этих кадров можно делать определённые операции по обрезанию лишнего. То есть, само упрощение идёт именно на этом уровне. Например, если это фрагмент тишины, то и заполнить всё нулями, если есть участки спектра, которые слабо прослушиваемы, они также изымаются за ненадобностью, и так далее. Можно применять и психоакустические модели. Именно поэтому очень многое зависит от алгоритма и его качества, ведь у каждого из разработчиков реализован свой подход. Посему, говоря о lossy-кодеке, всегда нужно смотреть хотя бы на то, что он даёт в результате своего действия. Ведь многие, например, вообще не видят разницы между Ogg Vorbis и MP3, хотя их алгоритмы работают по-разному.
lossy-компрессия, основанная на упрощениях в рамках frequency domain, является самой удобной на сегодня, если смотреть с позиций качество/степень сжатия. И, скорее всего, такая картина сохранится и в будущем. Даже можно сказать, что данные технологии уже достигли некоего предела в своём развитии, хотя в каждом из конкретных случаев находятся некоторые ошибки или недостатки. Но... на самом деле, тема очень интересна для изучения, и поэтому новинки в этой области появляются достаточно часто. Причём, очень интересна ниша создания кодеков с открытыми лицензиями, за которые не нужно платить разработчикам, ведь на такое всегда есть спрос.
И, помимо самого качества звука и кодирования, сейчас насущен и другой важный вопрос, а именно - быстродействия того или иного алгоритма. Например, большинство современных кодеков работают с задержкой примерно в 25 мс и выше. Это достаточно критично для передачи аудио в реальном времени (телефонии и т.п.). Хотя последнее высказывание нельзя отнести к новинке конца прошлого-начала этого года - CELT ("Code-Excited Lapped Transform"). Там эта задержка уже равна от 3 до 9 мс. Причем сам алгоритм достаточно просто и понятно объяснён в рамках ресурсов jmspeex.livejournal.com и www.celt-codec.org.
Также для более подробных данных можете обратиться к документациям по MP3, Ogg Vorbis, Speex, а также старичков типа m-Law, ADPCM и так далее.
В завершение
То есть, на самом деле в рамках аудиокомпрессии всё вращается вокруг двух принципиальных схем, а именно:
- Работа во временной области, упрощение + сжатие.
- Переходы в частотную область, работа там, упрощение + сжатие.
Кристофер,
christopher@tut.by
Горячие темы