LINUX.ORG.RU

Хочу тоже поделиться своим поделием: аудио компрессор!

 , , ,


1

1

На волне метапрога, уверен, эта тема останется почти незамеченной, но! Представляю вашему вниманию лосслесс компрессор аудио, работающий на технологии вейвлет-сжатия, лол. Написан на необычном, так любимом всеми common lisp.

Вот ссылка:

https://github.com/shamazmazum/wavelet-audio

Там ещё можно сгенерировать документацию через codex, но codex, похоже, теперь сломан. Для работы нужна моя версия trivial-bit-streams (просто положите её в local-projects), всё лень послать ловсану патчи.

https://github.com/shamazmazum/trivial-bit-streams

Ещё нужен easy-audio, но эту штуку я вроде добавлял в quicklisp

Можно сжимать и расжимать несжатые wav файлы так:

(wavelet-audio:encode-wavelet-audio "~/file.wav" "~/file.wa")
(wavelet-audio:decode-wavelet-audio "~/file.wa" "~/file.wav")

Самое интересное, на мой взгляд, Принцип работы кодирования:

  1. Делим входные данные на блоки по wavelet-audio:*block-size* семплов (4096 по умолчанию).
  2. Проводим декорреляцию каналов (пока тестил только с 2 каналами), используя вейвлет Хаара.
  3. Для каждого канала проводим полное DWT с биортогональным (4,2) вейвлетом (использую тот, который при нужной нормализации дает целочисленные коэффициенты). ЕМНИП, это CDF-вейвлет.
  4. Каждый получившийся subband кодирую адаптивным кодом Райса, в котором параметр кода выбирается на основе бегущего среднего.
  5. Пишу на диск первое значение параметра кода, и получившиеся коды Райса.

Декодирование происходит в обратном порядке примерно за то же время (по факту чуть быстрее из-за реализации, видимо).

Жмёт примерно на 2-4% хуже flac (итого типично сжатие на 25-40%).

Вопрос для тех, кто шарит в вейвлетах

Я использую отражение сигнала от краёв, чтобы преобразовать сэмплы, лежащие на краях блока. Это дает непрерывный сигнал, но с разрывной первой производной. Соответственно, у краевых вейвлетов 1 исчезающий момент. Можно ли как-то сделать 4 исчезающих момента, как и у основных, «внутренних» вейвлетов? Смотрел абсолютно везде, но не нашел ответа. Читал статью про CDV вейвлеты, но это не из той оперы, оказалось

Жмёт примерно на 2-4% хуже flac (итого типично сжатие на 25-40%).

А какой тогда смысл? FLAC свободен, реализация стабильна. Чем этот лучше?

monk ★★★★★
()
Ответ на: комментарий от monk

Спердобейся

Этот можно указать в резюме.

Camel ★★★★★
()
Ответ на: комментарий от monk

Поиграться с вейвлетами на практике. Алсо алгоритм симметричен, может это кому-то и важно

deadplace
() автор топика

штука полезная, но ... почему в лупе не используются кейворды? ткнуть в двоеточие не сложно, а читаемость резко увеличивается. в файле wavelet-audio.lisp дублировал твой код и понытыкал двоеточий сравни

anonymous
()
Ответ на: комментарий от hobbit

Лучше, если бы это было написано на C ;) Работало бы быстрее.

Писал когда нативный flac декодер, вышел раза в 4 вроде тормознутее (на sbcl), чем референсная реализация на C. Как ни мучался, не смог его сделать быстрее.

как язык мне CL тоже уже разонравился — слишком многословный, нет фич того же ФП — ни композиции, ни частичного применения, ни list comprehension.

Приходится писать как раз императивно, типа (loop for i below 20 sum (* 2 i)) вместо, например, (1..4).collect (2*_).sum

deadplace
() автор топика
Ответ на: комментарий от anonymous

но ... почему в лупе не используются кейворды?

Да особо раньше так не встречал. Возможно, ты прав, так даже удобнее

deadplace
() автор топика
Ответ на: комментарий от deadplace

Писал когда нативный flac декодер, вышел раза в 4 вроде тормознутее (на sbcl), чем референсная реализация на C. Как ни мучался, не смог его сделать быстрее.

примерно во столько раз чтение бинарного файла в СБЦЛ было медленней чем в Си, то есть проблемы именно в вводе-выводе.тесты делал года 2-3 назад. ускорили ли сейчас не знаю

anonymous
()

сжимать и расжимать несжатые wav

А можно тэги добавлять в WAV для удобства? Album,Title, etc.

UNiTE ★★★★★
()
Ответ на: комментарий от UNiTE

Пока нет, но формат допускает добавление скольких угодно блоков метаданных. Можно придумать блок с тегами

deadplace
() автор топика
Ответ на: комментарий от deadplace

нет фич того же ФП — ни композиции, ни частичного применения, ни list comprehension.

ни композиции

Это этого что-ли?

(defun compose (a b)
  (lambda (&rest args)
    (funcall a (apply b args))))

Вот вам программистам, всегда чего-то не хватает, а я вот гуглю что у вас за фишки в моде и нахожу интересные, по крайней мере для себя, библиотеки, типа:

https://github.com/ruricolist/cl-lc

ados ★★★★★
()
Ответ на: комментарий от hobbit

Хотел написать что приятно читать такие сообщения, обновил страницу и тут твоё сообщение.

targitaj ★★★★★
()

Жмёт примерно на 2-4% хуже flac (итого типично сжатие на 25-40%).


уже неплохо. если это не тот же самый флак

darkenshvein ★★★★★
()

просто положите её в local-projects

Свои то уже на нервы действуют, так ещё и чужие проекты в local-projects кидать и окончательно в свалку превращать не хочется.

turtle_bazon ★★★★★
()
Ответ на: комментарий от deadplace

нет фич того же ФП — ни композиции, ни частичного применения, ни list comprehension

Композиция и частичное применение есть. Ты чем смотрел? А loop это не просто comprehension, а надcomprehension.

turtle_bazon ★★★★★
()
Ответ на: комментарий от turtle_bazon

Ну да, многословен, но я не о том я об общей эстетике когда кроме смайликов и слов ничего нет, чиста эстетика если не читать код, а отодвинутся от монитора метра на два =)

Deleted
()
Ответ на: комментарий от Deleted

Ну если просто смотреть, наверное, и мне понравится. Надо будет попробовать. :)

turtle_bazon ★★★★★
()
Ответ на: комментарий от turtle_bazon

Композиция и частичное применение есть. Ты чем смотрел?

Давай ссылку на CLHS, где написано про композицию и частичное применение

deadplace
() автор топика

lovesan, я заслал pull request в trivial-bit-streams, посмотри, пожалуйста

deadplace
() автор топика
Ответ на: комментарий от hobbit

не осилил лисп и вообще ФП

Лисп мультипарадигменный язык, и ФП не в первую очередь. Говорим ФП, подразумеваем Хаскель

Deleted
()
Ответ на: комментарий от hobbit

лисп

Это не лисп.

вообще ФП
`(loop for ,i fixnum from ,start below ,end by ,skip do

Это не ФП. Это просто перепаста процедурной лапши увиденной в интернете.

delightfish
()
Ответ на: комментарий от delightfish

Это просто перепаста процедурной лапши увиденной в интернете.

щито? Ссылку, откуда я это перепастил))

deadplace
() автор топика
Ответ на: комментарий от deadplace

щито? Ссылку, откуда я это перепастил))

Ну если ты lisp/fp и вся фигня, то ты не мыслишь императивщиной. Но код твой - императивщина. Почему так могло получиться? 1) ты просто пастил. 2) ты просто пастил подход. Ничего иного быть не может.

Моя формулировка подходит и под то и под то.

delightfish
()

deadplace, ты крутой.

ugoday ★★★★★
()
Ответ на: комментарий от delightfish

Лол, тут уже объяснили, что common lisp - это не ФП. У меня в этой штуке ООП больше, чем что либо ещё.

Раз уж утверждаешь, что кто-то что-то пастит, то давай ссылку на источник

deadplace
() автор топика
Ответ на: комментарий от deadplace

Лол, тут уже объяснили, что common lisp - это не ФП. У меня в этой штуке ООП больше, чем что либо ещё.

Я знаю что это не лисп и не фп. ФП несостоятельно и ты бы на нём ничего не написал. Но, цл так же отрицает императивную лапшу. Он предписывает себя к той идеологии, которая отрицает.

Раз уж утверждаешь, что кто-то что-то пастит, то давай ссылку на источник

Ещё раз. Если ты не пастил - ты бы не писал имеративную лапшу. Если бы ты думал императивно, то ты бы писал на том, что тебе близко. Что соответствует твоему мышлению.

Но ты пишешь на том, что не соответствует. И тут вариантов немного. Основной - спастил. Есть ещё варианты, типы ты мазохист и специально занимаешься страданиями, путём написания императивной лапши на цл. Но это менее вероятно.

delightfish
()

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

meliafaro ★★★★★
()
Ответ на: комментарий от meliafaro
Ответ на: комментарий от deadplace

То есть тебя смущает, что нет функций partial и compose в стандарте? Только это?

turtle_bazon ★★★★★
()
Ответ на: комментарий от deadplace

Не корми шизоида. Просто игнорь.

anonymous
()

Хорошо всё. Однако есть одно «но»: словосочетание «аудио компрессор» занято за другим понятием. Назовись ака «ещё один алгоритм сжатия аудио без потерь».

deep-purple ★★★★★
()
Ответ на: комментарий от deep-purple

словосочетание «аудио компрессор» занято за другим понятием

Да, увы я не знал

deadplace
() автор топика
Ответ на: комментарий от Deleted

Ух ты, здорово, что я не один такой))

Хотя увы я собрал прогу, но она не работает. Пишет «test.wav: not a wav file». В принципе не сложно разобраться, где баг, но лень.

Про SPIHT зато узнал)

А почему именно такой вейвлет выбрал? Я свой выбрал за целочисленные коэффициенты, 4 исчезающих момента и гладкость sclaing function при обратном преобразовании (на случай, если захочу сделать кодер с потерями).

Я так понял, ты лифтинги, которые выходят за границу блока данных, просто опускаешь, печаль

deadplace
() автор топика
Ответ на: комментарий от deadplace

А почему именно такой вейвлет выбрал?

Не я выбрал. Я лишь сохранил от забвения.

Я так понял, ты лифтинги, которые выходят за границу блока данных, просто опускаешь

Алгоритм с потерями, так что не принципиально.

Deleted
()

Считаю задачу не законченной.

Либа должна давать интерфейс для формирования потока воспроизведения.

Иначе вообще не нужно.

HIS
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.