Easyelectronics.ru

Электроника для всех
Текущее время: 26 май 2020, 00:08

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
 Заголовок сообщения: Сжатие данных для передачи по UART
СообщениеДобавлено: 21 фев 2016, 10:57 
Старожил

Зарегистрирован: 13 фев 2012, 23:48
Сообщения: 755
Откуда: Украина, Харьков
Добрый день! Контроллер передаёт по UARTу данные (числа разделённые знаком табуляции в формате ASCII) размером от 256 байт до 2 кБ. Я думаю что их можно эффективно сжать используя:
1. выводить в формате HEX.
2. сжать одним из алгоритмов LZ...
Есть ещё варианты и пути решения?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сжатие данных для передачи по UART
СообщениеДобавлено: 21 фев 2016, 11:59 
Старожил

Зарегистрирован: 04 окт 2012, 00:23
Сообщения: 2727
Откуда: Москва
Убрать 30 , сжать попарно, табуляцию убрать. 31,32=12 = маска 0x0F(&),swap, ori (|)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сжатие данных для передачи по UART
СообщениеДобавлено: 21 фев 2016, 12:41 
Старожил

Зарегистрирован: 27 мар 2015, 01:22
Сообщения: 1703
Если цель передавать именно в ascii, то можно просто сменить основание чисел с 10 на 64 - https://ru.wikipedia.org/wiki/Base64


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сжатие данных для передачи по UART
СообщениеДобавлено: 21 фев 2016, 12:44 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 6734
В один байт (8 бит) может уместится два числа по 4 бита. Эти 4 бита означают числа от 0 до 15.
Для компрессии надо преобразовать данные так, чтобы вся полезная информация кодировалась кодами 0-15, что позволила бы сжать поток вдвое.
Вариант исполнения:
Символы 0-9 можно перевести в код 0-9 (-"0")
Символ табуляции заменить на 10
Пробел - 11
....
Конец строки - 14
Конец блока (нет данных) - 15

Как сжать:
х2 - два числа в байте - в младших битах положить первое число, в старших второе число.
Собственно, ILYAUL это и предложил.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сжатие данных для передачи по UART
СообщениеДобавлено: 21 фев 2016, 13:11 
Старожил

Зарегистрирован: 13 фев 2012, 23:48
Сообщения: 755
Откуда: Украина, Харьков
Спасибо за советы!
Данные имеют представление типа "0.00\t", т.е. очень много данных во float. Думаю, что в таком случает hex будет не эффективен.
Представление данных (сжатие с 1 байта до 4х бит Символы 0-9 можно перевести в код 0-9 (-"0")) и заменой символов, например "\t"=0х0А, "."=0х0В сохранением знака "CR"=0х0D позволит в 2 раза сократить длину строки.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сжатие данных для передачи по UART
СообщениеДобавлено: 21 фев 2016, 13:44 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 6734
__bl__, если в потоке много каких-то одинаковых цифр (например 0.00), то под ВСЁ число можно отвести пол байта. Например, завести коды 0xC-D-E
Кстати, перевод в hex может быть и очень эффективен. Если у вас строго числа и строго вида xx.yy, то для передачи эти числа можно преобразовать в 2 слова, где старшее слово будет означать целую часть, а младшее слово дробную часть. При этом на каждое число будет тратится 4 байта. Если числа маленькие, то вместо "слов" можно кодировать "байтами". Либо, если дробная часть не большая, то можно передавать числа, с мнимой точкой. Например, в числе 1 разряд целый и 3 разряда дробной части. Тогда при передачи число *1000 и получается целое число.
Да, еще момент, если у вас float нормированный, т.е. всегда начинается с "0.", то не надо их передавать. Просто заведите два кода - 0xB = "-0." и 0xC = "0."; Эти же коды будут и признаком начала нового числа, табуляцию передавать не надо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сжатие данных для передачи по UART
СообщениеДобавлено: 21 фев 2016, 14:07 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2699
Откуда: Санкт-Петербург
А числа-то какие?
1. Диапазон (если floating point - то ещё сколько знаков после точки)
2. Распределение (ну там, с равной вероятностью любое число от 0 до 1000 или, напротив, с вероятностью 50% будет 0, 49% единица)
3. Взаимосвязи между числами (например, последовательные числа мало отличаются между собой или часто встречаются последовательности одинаковых чисел).

1 - ужимаем каждое число в минимум бит (нафиг текстовое представление)
2 - частые числа кодируем маленьким количеством бит, редкие большим (хаффман, арифметическое кодирование)
3 - куча всяких алгоритмов. RLE для последовательностей одинаковых чисел, дельта- кодирование (с последующим хаффманом/арифметическим) для медленно меняющихся чисел, вариации LZ, PPM и BWT для повторяющихся последовательностей, сжатие фурье и вейвлет образов...

Но скорей всего вам хватит пункта 1 :-D


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сжатие данных для передачи по UART
СообщениеДобавлено: 21 фев 2016, 15:05 
Старожил
Аватара пользователя

Зарегистрирован: 03 сен 2010, 22:46
Сообщения: 5997
Откуда: Москва
Все давно придумано: http://www.compression.ru/download/arti ... anscom.htm

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сжатие данных для передачи по UART
СообщениеДобавлено: 21 фев 2016, 16:59 
Старожил
Аватара пользователя

Зарегистрирован: 04 окт 2011, 10:19
Сообщения: 1997
http://www.cprogramming.com/tutorial/co ... ffman.html


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сжатие данных для передачи по UART
СообщениеДобавлено: 22 фев 2016, 00:43 
Старожил

Зарегистрирован: 13 фев 2012, 23:48
Сообщения: 755
Откуда: Украина, Харьков
Всем спасибо за советы и рекомендации.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB