Я ищу алгоритм сжатия звука или изображения, который может сжимать поток из 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 других кодека, в зависимости от уровня качества.