ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
19 апреля
552225 Топик полностью
fk0123 (10.10.2014 07:46, просмотров: 1) ответил rod-i-on на Сжатие строки в микроконтроллере. Коллеги, мне нужно ужать строчку для передачи вида
Каждый символ заменяется на порядковый номер из списка символов. Списков символов несколько и они контекстно-зависимы, контекстом является тип предыдущего символа, например (буквы, цифры или знаки). В одном списке в начале буквы, потом остальное, во втором вначале цифры, потом знаки, потом буквы и всё остальное. Таким образом, коды символов получаются, типично, небольшими величинами после кодирования(на кодирование числа нужно, типично, 4 бита на цифру). А из-за наличия контекста после первой цифры остальные кодируются опять же относительно небольшими величинами (типично, но не обязательно). Такие коды могут эффективно быть закодированы каким-либо энтропийным кодером. Чем-то вроде кода Голомба (https://ru.wikiped …%B9_%D0%BA%D0%BE%D0%B4), алгоритмом Хаффмана или арифметическим кодером (например, Range Coder им. Д. Субботина). Практически что-то наподобии кода Голомба будет, наверное, наиболее энергетически эффективно. Идея в том, что разные коды в выходном потоке занимают разное число бит, меньшие числа занимают меньше бит. А ввиду использования контекста числа получаются, повторюсь, типично маленькие. Списки должны быть отсортированы по частоте использования символов, наиболее часто используемые -- с меньшими порядковыми номерами. ASCII использовать не нужно т.к. там первые 32 кода фактически не используются, что не эффективно. Можно попробоать перед кодом Голомба можно использовать дифференциальное кодирование (в расчёте на повторяющиеся серии символов вырождающиеся в ноль). На процессоре с аппаратным делением, наличием пары кБайт лишнего ОЗУ и на более длинных строках (или при кодировании разом группы строк) возможно более эффективен будет range coder вместо кода Голомба -- во-первых он может более эффективно кодировать вообще, во-вторых может динамически подстраивать частоту появления символов и код. В качестве полумеры для медленных CPU можно переупорядочивать данные в списках по мере поступления данных -- при кодировании очередного символа он попадает в начало таблицы выкусываясь откуда-то из середины (Move To Front, MFT метод) и в следующий раз закодируется как 0 (тогда дифференциальное кодирование можно исключить). Можно пойти дальше, кодируя числа не отдельными символами, а как числа. Но тут много вопросов возникает о разрядности, форме представления и т.п. PS: За использование php, считаю, сжигать нужно...