ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
23 ноября
486299 Топик полностью
fk0, легенда (07.02.2014 20:08 - 20:13, просмотров: 203) ответил Гудвин на Кто то тут упоминал про упаковку GPS координаты (например, 5504.331598) в 32 бит целое без потери точности. Что то никак не соображу...
Вначале определись какая входная точность (или какая используется в программах). Google, например, в градусах считает и на 1e5 домножает: ~1.1 метр на бит. Но это  ceil(log2(360*1e5)+log2(180*1e5)) = 50 бит на пару широты/долготы. А тебе значит 32 нужно. Не знаю от чего там координаты, но это явно не НЛО и не мечется по всей земле как попало. А, скорей, что-то вроде трека: т.е. точки формируются периодически и расстояние между ними, в масштабах земли, мизерное. Во-первых дифференциальное кодирование: начальная точка кодируется как есть, а далее передаются только разности. Во-вторых сетка времени может быть не равномерной. Время аналогично может кодироваться. В-третих даже разностные значения обладают определённым частотным распределением: какие-то встречаются чаще, какие-то реже. Для некототых данных возможны длительные последовательности повторяющихся значений разности (или входных данных -- тогда повторяющиеся серии нулей). Дальше рассказываю как поступил я в такой ситуации. Есть русский народный range coder им. Субботина. Топик по ссылке. Во-первых вместо моделей сложных порядков модель нулевого порядка учитывающую только частоту символов, ничего больше. И стало возможным реализовать для МК. Во-вторых числа заранее усекаются до наименьшей разрядности (координата одна до 24 бит, с потерей точности разумеется). В-третьих избавился от знаковых чисел и это очень помогло (0->0, 1->1, -1 ->2, 2->3, -2->4... вот так) т.к. объединичивание старших разрядов в отрицательных числах очень портило частотоную характеристику _побайтового_ range coder (для побайтового нужно всего 512 байт на статистику, а если бы я статистику для 24-битных чисел собирал -- ОЗУ не напасёшься, МК же не ПК, тем более числа после дифф. кодирования все маленькие, в байт влезают). В итоге сделал как-то... Схема кодирования: транспонирование->дифф.кодирование->RLE->range coder. Транспонирование: значит в начале кодируем все долготы, потом все широты (ибо они похоже), а не вперемешку. PS: вдогонку. Я тут писал , что можно вместо использовать коды Элиаса или Голомба. Вместо range coder. Объём данных будет больше, но реализация проще. Идея этих кодов, что маленькие числа (после дифф. кодирования) кодируются меньшим числом бит. А частота появления маленьких чисел выше обычно...
[ZX]