Easyelectronics.ru

Электроника для всех
Текущее время: 19 окт 2019, 23:27

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



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

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

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


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

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


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

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

_________________
less is more


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

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 6220
В один байт (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
Сообщения: 754
Откуда: Украина, Харьков
Спасибо за советы!
Данные имеют представление типа "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
Сообщения: 6220
__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
Сообщения: 2622
Откуда: Санкт-Петербург
А числа-то какие?
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
Сообщения: 5423
Откуда: Москва
Все давно придумано: http://www.compression.ru/download/arti ... anscom.htm

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


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

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


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

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


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

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


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

Сейчас этот форум просматривают: ИгорР


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

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

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