xk21
136 subscribers
156 photos
87 videos
1 file
85 links
Download Telegram
*бьет указкой по столу* ХУЛИ СПИМ
🗿6😁3
итак, мы получили спектральное представление каждой полосы фрейма, и это занимает у нас столько же памяти, сколько и изначальный PCM-сигнал. как мы можем урезать его в несколько раз?

здесь приходит на помощь психоакустическая модель, определяющая наиболее важные части спектра. что за зверь? это алгоритм, выкидывающий все, что человек не услышит:
- маскирует соседние частоты. например, есть громкая часть спектра на 300 Гц - значит, можно скипнуть части спектра в районе 280 и 320 Гц. бытовой пример - если влететь в отбойник передом машины, то вы не заметите, что на капот насрала птица
- уделяет больше внимания средним частотам - у человеческого уха больше динамический диапазон здесь
- определяет порог, выше которого частоты спектра нужно описать точнее, а ниже которого в целом похуй.

психоакустическая модель - это часть енкодера, и mp3-плееру (декодеру) все равно, какие части спектра были похерены - он просто восстанавливает исходный сигнал. чуваки сравнивают разные енкодеры, но сходятся в том что на высоких битрейтах (192..320 кбит/с) сильно большой разницы между реализациями нет, и считают LAME лучшим.
2
следующий этап - квантирование значений. квантирование - это округление значений, и более значимые части спектра мы стараемся описать более точно, менее значимые - примерно, или выбрасываем совсем. рулит этим процессом т.н. distortion-rate loop - енкодер бежит по исходному файлу, кодирует его часть, проверяет - уложились ли мы в битрейт? достаточно ли точно кодирован сигнал? если да - идем дальше, если нет - пробуем заново.

здесь есть еще оптимизации - коэффициенты, полученные после MDCT, кодируются не абсолютными значениями, а дельтами; кодек умеет находить транзиенты и для них использовать более короткое окно, енкодер использует буфер для возможности выделения большего количества байт для тяжеловесных кусков - я не буду углубляться тут
1🤓1🗿1
живой пример, смотрите на картинки. я взял кусок аудиофайла длиной в один фрейм (0.026 секунд), оставил от него одну полосу частот и закинул в серум, где есть редактор волноформ. в нем нижний график - это форма волны, а самый верхний - это амплитуды гармоник, формирующих сигнал (рис 1). чтобы представить, как происходит кодирование, я оставил первые 18 гармоник, как это делает MDCT (рис 2), и затем каждую гармонику квартировал одним из четырех значений (рис 3)

в изначальном варианте, чтобы закодировать спектр, нам нужно 18*256=4608 бит, в конечном - 18*4=72 бита. охуенный выигрыш на два порядка!

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

последний момент - как кодировать стерео-сигнал? авторами формата было решено, что сайд не так сильно нужен, чтобы воссоздать ощущение стерео - и они предложили кодировать отдельно мид (сумму двух каналов) и сайд (их разницу), а потом сайд сжимать более агрессивно. это все называется joint stereo, и вообще необязательно в mp3, и сейчас не особо в ходу, но раньше, когда в ходу были mp3 с битрейтом 128 кбит/с и ниже - это помогало улучшить качество кодирования моно-составляющей сигнала, да и панорама в те годы будто бы в среднем была поуже
21🗿1
когда мы декодируем mp3, мы инвертируем все то, что наделали при кодировании:

- bitstream был закодирован кодом Хаффмана? раскодируем
- спектр полос фрейма был квантирован? восстанавливаем коэффициенты спектра и зануляем те, что не были заданы
- аудио описано спектром в базисе косинусных функций? применяем инвертированное модифицированное дискретное косинусное преобразование (IMDCT) и получаем аудио для каждой из 32 полос аудио
- полосы аудио в низком частотном диапазоне? шифтим их туда, где они должны быть
- у нас 32 полосы, а мы хотим получить одну? суммируем полосы
- фреймы теперь пересекаются по времени? используем OLA, чтобы бесшовно склеить переходы между фреймами

забавно, что декодировать в реальном времени научились не сразу - например, топовый в 1989 году 486 процессор задыхался от вычислительной сложности. сейчас, впрочем, декодировать можно чуть ли не на ардуинах, есть и аппаратные реализации на FPGA
3🤓3
ну че, мы молодцы? давайте к изначальному вопросу - почему mp3 громче нуля играет?

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

mp3 - это не архив и не та же вавка только в хуевом качестве. mp3 - это по сути партитура для аддитивного синтезатора из 576 синусоид.

на этой поэтичной ноте завершаю рассказ, всем спасибо кто осилил или хотя бы попытался ❤️‍🩹
7🤓1
и напоследок - попробуйте угадать, где mp3, а где wav
🤓32
где mp3
Anonymous Quiz
55%
🟡
45%
🟣
31
я вижу тема с лекциями не заходит, теперь посты будут следующего содержания:

- всем доброе утро я посрал!

- кружочек где крутится обложка трека

- стикер из нижнего телеграма

- ЗАПИШИСЬ НА МОЙ КУРС СЕГОДНЯ
14😁6🤓3
на самом деле вы уже на моем advanced курсе 😎
8
xk21 pinned «вас становится много! я обещал на сотню выложить трек фрихой - предложение все еще актуально 😎»