Перейти к содержанию
    

Преобразование данных

Господа. есть входной поток данным с макс размером скажем 1000, его нужно ужать в один байт те 255,

причем основная инфа в потоке содержится в первой половине размера, те <=500, при >500 инфа тоже интересна

но менее важна, в итоге самое простое это взять логарифм но он слишком долго считает даже по таблице, тк обработка идет на stm32 m0.

Может есть какие то еще быстрые функции для такого преобразования ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В смысле 1000х2 = 3кБ ? Долго искать будет.

Изменено пользователем whale

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 minutes ago, whale said:

В смысле 1000х2 = 3кБ ? тут столько памяти нет.

 

А сколько там памяти есть ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Допустим 3 000 байт найти можно попробовать но как отыскать быстро нужное значение ?

Разве номер в памяти как входное значение задать ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

18 minutes ago, whale said:

Разве номер в памяти как входное значение задать ?

Почему нет ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В принципе можно в пзу все сложить, надо только глянуть на скорость чтения и как туда таблицу из экселя запихать, 

действительно это наверно будет самый быстрый вариант.

Изменено пользователем whale

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, whale said:

В принципе можно в пзу все сложить, надо только глянуть на скорость чтения и как туда таблицу из экселя запихать, 

действительно это наверно будет самый быстрый вариант.

 

Вот, из книжки Hackers' Delight. Никогда сам не пользовался, но заколлекционировал.

ilog.c.txt

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Just now, Aleksandr Baranov said:

Вот, из книжки Hackers' Delight. Никогда сам не пользовался, но заколлекционировал.

ilog.c.txt 4.98 kB · 0 downloads

Спасибо, но тут дело уже на такты идет, пока попробую так 

#define   start_add_arr 0x0801F800 // последняя страница 

#pragma location = start_add_arr
__no_init  uint8_t my_arr[]={1,2,3,40,5};


uint32_t FLASH_Read(uint32_t address)
{
    return (*(__IO uint32_t*)(address+start_add_arr));
}

те входное значение будет указывать адрес в памяти, куда заранее зальем значение преобразования,

должно работать очень быстро если не ошибся в коде пока не пробовал )

Изменено пользователем whale

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

34 minutes ago, whale said:

должно работать очень быстро если не ошибся в коде пока не пробовал )

Вот зачем для чтения памяти понадобилась какая-то функция (с ошибкой в коде), которую компилятор еще должен догадаться заинлайнить?

out = my_arr[in]

my_arr может быть массивом с принудительным размещением, а может быть просто указателем на uint8_t.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 часа назад, whale сказал:

Допустим 3 000 байт найти можно попробовать но как отыскать быстро нужное значение ?

Так, а разве индексом таблицы не может быть ваше входное значение?

const auto outValue = lookupTable[ myInputValue ];

 

2 часа назад, whale сказал:

uint32_t FLASH_Read(uint32_t address)

Память читайте как обычную. Ничем флешка с точки зрения чтения не отличается от тоже ОЗУ. Никакие функции тут не нужны.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

Те это будет достаточно ? 

 

uint8_t my_arr[]={1,2,3,40,5};

out = my_arr[in];

 

Изменено пользователем whale

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 часов назад, whale сказал:

Короче сам себя заблудил в трех соснах, наследие авр )

uint8_t  compress(uint16_t in) {

  static const uint8_t out[1001] = {0,0,0,1,1, ...};

  if(in<=1000) {return out[in];}

  else { return 0;}

}

В локальном статическом константном массиве надо руками прописать каждый из 1001 его элементов. Их значения будут находиться в диапазоне от 0 до 255.

Входное значение in используется в качестве индекса массива. Массив здесь - ни что иное, как табличное представление вашей функции сжатия для целочисленных аргументов из диапазона от 0 до 1000 включительно (итого их 1001 - отсюда и количество элементов массива). Индекс массива in играет роль аргумента функции (в диапазоне от 0 до 1000), а элемент массива out[in] - значение функции от этого аргумента (в диапазоне от 0 до 255).

При ошибочном входном значении (большем 1000) будет возвращаться 0 - не лучшее решение. Но за пару минут ничего нормального не придумалось.

Изменено пользователем Darth Vader

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Just now, Darth Vader said:

 

 

Все давно заработало  :)

Просто в авр нельзя было читать память команд просто так в а stm все объединили 

Изменено пользователем whale

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...