вообще говоря, mp3 - это спецификация декодера. как кодировать сигнал, особо не рассказывали, и поэтому существуют различные варианты енкодеров. если прогнать через них один и тот же файл - они будут звучать по-разному, у них разные форматы тегов, но главное - все полученные mp3 можно будет включить на любом проигрывателе. в аблике (да и примерно везде) используется енкодер LAME. из мемов - название расшифровывается как “LAME это не енкодер”, по причине проблем с патентами.
основная идея тут в том, чтобы кодировать не каждый семпл отдельной точкой, а вычленить из всего спектра наиболее важные для слуха гармоники - а остальное повыбрасывать как балласт или максимально упростить.
представьте, что вы - аппарат ЭКГ, но вместо постоянного рисования кардиограммы вы каждую секунду запоминаете пульс. точные ли эти показания? вообще нет. приемлемы ли они для большинства ситуаций? для фитнес-трекера сгодится. насколько меньше данных нужно хранить? охуеть насколько меньше, на порядки.
втупую с аудиосигналом так, конечно, не получится - в треках очень много гармоник, и они постоянно меняются, поэтому тут бьют слона на части вдоль и поперек:
- исходный файл режется на фреймы, куски длиной 1152 семпла (это примерно 0,026 секунд). далее, мы работаем только с одним фреймом (позже разберём, как они склеиваются).
- каждый фрейм прогоняетчя через т.н. polyphase filter (многофазный фильтр? хз не нашел русского определения) из 32 полос равной ширины. если упростить, то это как гнать сигнал через вокодер, только здесь нет внешнего сигнала модулятора. за страшным словом polyphase кроется способность фильтра разбивать фрейм на полосы за один проход.
теперь у нас есть 32 полосы, каждая закодирована 1152 семплами, но мы можем понизить частоту семплов для каждой полосы. как гласит
теорема Котельникова, если у нас семплрейт сигнала N, то мы не можем таким сигналом описать сигнал частоты большей, чем N/2.
изначальная частота сигнала у нас 44100 Гц, мы разбили его на 32 равные полосы по 44100/2/32=689 Гц. соответственно, имеем первую полосу 0-689 Гц, вторую 689-1378 Гц, третью 1.4-2.1 кГц, и так далее вплоть до верхнего порога слышимости в 20 кГц.
каждую полосу мы сдвигаем в низкочастотный диапазон frequency shift’ером, и снижаем семплрейт каждой полосы (по все той же теореме Котельникова). теперь, чтобы описать каждую такую полосу, достаточно использовать 18 семплов (1152/2/32=18)
почему я тут делю на два? а вот клиффхенгер