Сверхбыстрый алгоритм сжатия аудио / изображений с потерями 2x? - PullRequest
0 голосов
/ 02 февраля 2019

Я ищу алгоритм сжатия звука или изображения, который может сжимать поток из 16-битных выборок

  • на довольно предсказуемую величину (2-3x)
  • приочень высокая скорость (скажем, не более 60 циклов на выборку:> 100 МБ / с)
  • с потерями, приемлемыми, но, конечно, нежелательными

Мои данные имеют характеристики изображений иаудио (двумерное, коррелированное в обоих измерениях и аудиоподобное в одном измерении), поэтому алгоритмы для аудио или изображений могут быть подходящими.

Очевидной вещью, которую можно попробовать, был бы этот одномерный алгоритм:

  • разбить данные на сегменты по 64 выборки
  • измерить диапазон значений среди этих выборок (например, выборки могут быть между 3101 и 9779 в одном сегменте, разница 6678)
  • использовать от 2 до 4 дополнительных байтов для кодирования диапазона
  • линейно понижающей дискретизации каждого 16-битного семпла до 8 битов в этом сегменте.

Например, я мог быSTOвведите 3101 в 16 битах и ​​сохраните коэффициент масштабирования ceil(6678/256) = 27 в 8 битах, затем преобразуйте каждый 16-битный образец в 8-битный как s8 = (s16 - base) / scale, где base = 3101 + 27>>1, scale = 27, с очевидным «алгоритмом» декомпрессии s16 = s8 * 27 + 3101.) Коэффициент сжатия: 128/67 = 1,91.

Я выдвинул некоторые идеи, чтобы избежать операции деления, но разве кто-то не изобрел сверхбыстрый алгоритм, который мог бы сохранить точность воспроизведения лучше, чем этот?

Примечание: на этой странице говорит, что FLAC сжимает со скоростью 22 миллиона выборок в секунду (44 МБ / с) со скоростью -q6, что чертовски хорошо (если предположить, что его реализациявсе еще однопоточный), если не достаточно для моего приложения. Другая страница говорит, что FLAC имеет аналогичную производительность (40 МБ / с на 3,4 ГГц i3-3240, -q5), как и 3 других кодека, в зависимости от уровня качества.

1 Ответ

0 голосов
/ 02 февраля 2019

Посмотрите на PNG фильтры , чтобы найти примеры того, как выявить ваши корреляции.Наиболее очевидным фильтром является «sub», который просто вычитает последовательные выборки.Различия должны быть более сгруппированы вокруг нуля.Затем вы можете запустить его через быстрый компрессор, такой как lz4 .Другие варианты фильтров могут привести к еще лучшей кластеризации около нуля, если они могут найти преимущество в корреляциях в другом измерении.

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

...