> Файлы формата WAVE

Если вы имели в виду файлы WAV, то вы спутали формат и контейнер. В WAV можно запихать много чего, кроме несжатого звука.
PCM упаковывается в wav или, что вы имели в виду под несжатым звуком?
PCM упаковывается не только в WAV.
В WAV упаковывается не только PCM.
Да, я в этом постоянно путаюсь. Да, я имел в виду обычный WAV, без всякого сжатия и нюансов вроде ADPCM. Могу поправить статью, спасибо.
Ох, опять эта копипаста про «второй MDCT» (( Попробую расписать кратко.
В неком приближении, кодеки можно разделить на Subband, Transform, Hybrid
Subband — в них исходных PCM сигнал разбивается по частотам на набор PCM сигналов. При этом так же происходит децимация — поэтому возможен алиасинг. Как правило используется PQMF filterbank. Еще раз, важно, после разбиения мы так и остаемся во временной области, просто имея несколько PCM сигналов. Дальше каждый такой сигнал можно квантовать с разной точностью, так чтоб шумы квантования были ниже порога маскировки, определяемого психоакустикой. Можно дополнительно применить ADPCM сжатие к тем диапазонам где это эффективно (так DTS делает), и т.д. К subband кодекам относятся MPEG1 Layer1, Layer2, Musepack, DTS, apt-x.
Transform — Тут, как и написано, в основе MDCT преобразование, которое преобразует сигнал в частотную область. Почему MDCT, а не скажем FFT? Основная причина — MDCT позволяет эффективно бороться с согласованием на границе блоков. Плюс, не надо отдельно что то делать с комплексной частью (в результате MDCT для N входных чисел получается N/2 выходных). Далее полученные после mdct, коэффициенты можно квантовать (в самом простом случае) или попробовать дополнительно обработать. Важно — основная работа тут происходит в частотной области. К таким кодекам относятся AC3, Vorbis, AAC (большенство профилей), CELT.
Hybrid (не тот который в opus) — гибрид этих подходов — вначале разбиваем на поддиапазоны (PQMF или QMF), а затем каждый отдельно преобразуем в частотное представление (MDCT). В принципе, это позволяет иметь лучшую локализацию частоты в результирующем спектре, так же это могдо бы позволить иметь разные размеры окна MDCT преобразования в разных поддиапазонах (ATRAC так делает), ну и т.д. Но в моем понимании, проблемы с из за алиасинга превосходят возможный профит, cейчас такой подход считается не удачным. К таким кодекам относятся Mpeg1 Layer3, ATRAC, AAC-SSR профиль.

Как видим, нет «Второго MDCT».
Я не разобрался в подобных тонкостях и рад, что Вы указали на это. Я помню, что вещи, которые происходят в таких кодеках как MPEG Layer I/II и Musepack, происходят также и в SBC, используемый по умолчанию в Bluetooth-профиле A2DP, верно? Также я понял, что MDCT в большинстве случаев используется только потому, что с результатами преобразования данным подходом проще работать с точки зрения реализации алгоритмов.
Я поправлю в статье нюанс со вторым MDCT, чтобы не вводить читателей в заблуждение.
Спасибо, очень подробно и доходчиво описано.
SBC детально не смотрел, судя по описанию в википедии да. А вот Apt-x на днях в ffmpeg залили — можно поизучать код.
Работать с MDCT не то что проще (кстати часто наоборот, например MDCT спектр синусоиды зависит от фазы, собственно часто психоакустика работает с FFT спектром), MDCT решает проблему артефактов на границе блоков. Про MDCT есть приличное видео с примерами www.youtube.com/watch?v=xLzkLc33S_U.
Посмотрел видео. Спасибо, очень интересный материал. И в публикацию, кстати, внёс поправки.
У меня есть вопросы к Вам (да и ко всем, кто ознакомился с материалом).
Публикация затрагивает только кодирование голоса. При кодировании музыки я получил не менее интересные результаты. Стоит ли расширить публикацию нюансами кодирования музыки? Стоит ли дополнить её семплами, закодированными при помощи, к примеру, того же neroAacEnc, а может даже дополнить её спектрограммами? Стоит ли добавить картинку и кратко дополнить применение MDCT, чтобы у читателя имелось представление, для чего это необходимо (переход из амплитудной плоскости в частотную)?
Впрочем, есть подозрение, что эти дополнения будут уже не так интересны читателям.
Голосовалку решил не ставить.
Зависит от задачи которую вы преследуете. Если по мне, то не стоит смешивать теоретические основы и примеры кодирования продвинутыми (а opus действительно крут) кодеками в одной статье. Может сложится ложное представление, что MDCT решает все проблемы. Если Вы пишите про основы (а MDCT, QMF, психоакустика на уровне определения порога маскировки — это только основы), то уместнее приводить работу более простых кодеков, например, можно обратить внимание на артефакты вызванные теми или иными преобразованиями (например послушать результат работы mdct кодека при занулении части коэффициентов). Opus и AAC достаточно много всего делают помимо MDCT чтоб достичь своих результатов. Но это все IMHO.
На самом деле дельный совет.
Конкретную задачу, честно говоря, я не преследовал, только экспериментирование и сравнение кодеков. Судя по всему, в текущем виде публикация готова и стоит подумать, о чём ещё интересном стоит написать. В любом случае, пока писал и пока читал комментарии — узнал много нового; оно того стоило. :)
И снова спасибо.
Спасибо за видео. Очень толковое
Яростно плюсую, ибо эта «копипаста» уже, блин традиция!
PS. Однако замечу, что первый ATRAC был очень даже subband причём весьма остроумный и хитроделанный, у него была очень простая и красивая аппаратная реализация, и никакого альясинга, дьявол в деталях…
Спасибо.
Декодер ATRAC реализован в ffmpeg, на гитхабе есть экспериментальная реализация кодера (atracdenc), так что там все более менее понятно. В первом ATRAC стекирование из 2х QMF, вначале разбиваем на HF и LF, затем еще раз LF. В HF компенсируем задержку. Получаем 3 бенда. Потом каждый бенд подаем на MDCT, в каждом бенде можно независимо переключаться между коротким и длинным окном. Тонкость — длинное окно там с меньшим чем 50% перекрытием. Полученные после MDCT коэффициенты группируются, квантуются. Хафмана или какого либо иного VLC кодирования нет. Так что, вполне себе гибрид.
Большая работа проделана, спасибо за хорошую статью. Раньше заморачивался с кодеками, в итоге пришел к лосслесс. Кодирую флак/ape/alac в wma lossless, чтобы слушать из облака через Groove. Хоть и место жрет, но на больших колонках отчетливо слышно разницу между мп3-320 и лосслесс. И чем больше колонки, тем сильнее слышно.
Кстати, может кто знает — чем еще можно слушать напрямую из облака (в частности OneDrive)? Для aimp попробовал плагин, но что-то он нестабильный и перематывать нельзя.
Ну если самодельное облако, то Plex. Есть еще emusic.com но lossless там нет
Хоть и место жрет, но на больших колонках отчетливо слышно разницу между мп3-320 и лосслесс. И чем больше колонки, тем сильнее слышно.
Исключая наличие у вас экстрасенсорных способностей, напрашивается предположение, что вы неправильно провели тест. MP3 320kbps (при верном кодировании) должно быть прозрачным, то есть неотличимым от оригинала на слух. Тест должен проводиться «в слепую», то есть вы не должны знать, в каком именно формате записано то, что вы слышите. При этом MP3 320kbps должен быть получен (при помощи LAME) из того же исходного файла, с которым потом будет производиться сравнение, чтобы гарантировать что используется одна и та же аранжировка, и что этот MP3 320kbps получен не из какого-нибудь MP3 128kbps, что встречается повсеместно в сети.
Мне не нужны экстрасенсорные способности, чтобы слышать разницу. Вы слушали мп3 на больших колонках? Под большими я имею в виду какие-нибудь клубные Turbosound. Слушали и не услышали разницу? Поздравляю. А я слышу. Звук тупо глухой.
Это может быть связано с ошибками при кодировании mp3 или же при его декодировании на устройстве воспроизведения. Если все будет работать корректно, то разницу в слепом прослушивании вы не услышите ни на каком оборудовании.
Сама логика «слепых тестов» ущербна. Музыка — не поток информации, сообщаемой вам. Сравнивать нужно по воздействию на человека, а не путём слухового анализа каких-то составляющих звука. Послушайте пару недель только mp3 а потом только lossless. Вот тут то и будет разница.
Отличная статья, написана очень хорошим языком, понятным и не занудным. Спасибо автору!
А существет ли подобный и подробный анализ codec2?
Не уверен, если честно. Я находил статьи на Хабре на эту тему, но конкретные эксперименты мне на глаза не попадались. Я бы с радостью это провёл, но с описанием физики процесса кодирования сигнала codec2 у меня будут большие проблемы — я не математик.
Только полноправные пользователи могут оставлять комментарии.
Войдите, пожалуйста.