|
jpeg на at91sam9g20, скорость сжатия |
|
|
|
Aug 21 2010, 14:20
|
Частый гость
 
Группа: Участник
Сообщений: 111
Регистрация: 2-03-10
Пользователь №: 55 768

|
Делаю jpeg кодер для сжатия raw картинки с матрицы mt9d131. Картинка сжимается примерно за 3 секунды. Для такого контроллера это нормально? С помощью встроенного таймера пробовал измерять время на различных этапах сжатия. Около 400 милисекунд уходит на копирование буфера картинки. Как я понял очень много времени уходит на операции в памяти. Код for(i=0; i<614400; i++) { data[i] = Buffer[i]; } Картинка около 600 килобайт. Пробовал напрямую использовать буфер(Buffer), в который ISI интерфейс записывает картинку, но во время сжатия были искажения цветов, тоесть там что-то с обращением. Еще много времени уходит на квантование: CODE void fdct_and_quantization(SBYTE *data,float *fdtbl,SWORD *outdata) { int tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; int tmp10, tmp11, tmp12, tmp13; int z1, z2, z3, z4, z5, z11, z13; int *dataptr; int datafloat[64]; int temp; SBYTE ctr; BYTE i; for (i=0; i<64; i++) datafloat[i] = data[i];
dataptr=datafloat; for (ctr = 7; ctr >= 0; ctr--) { tmp0 = dataptr[0] + dataptr[7]; tmp7 = dataptr[0] - dataptr[7]; tmp1 = dataptr[1] + dataptr[6]; tmp6 = dataptr[1] - dataptr[6]; tmp2 = dataptr[2] + dataptr[5]; tmp5 = dataptr[2] - dataptr[5]; tmp3 = dataptr[3] + dataptr[4]; tmp4 = dataptr[3] - dataptr[4];
/* Even part */
tmp10 = tmp0 + tmp3; /* phase 2 */ tmp13 = tmp0 - tmp3; tmp11 = tmp1 + tmp2; tmp12 = tmp1 - tmp2;
dataptr[0] = tmp10 + tmp11; /* phase 3 */ dataptr[4] = tmp10 - tmp11;
z1 = (tmp12 + tmp13) * (0.707106781); /* c4 */ dataptr[2] = tmp13 + z1; /* phase 5 */ dataptr[6] = tmp13 - z1;
/* Odd part */
tmp10 = tmp4 + tmp5; /* phase 2 */ tmp11 = tmp5 + tmp6; tmp12 = tmp6 + tmp7;
/* The rotator is modified from fig 4-8 to avoid extra negations. */ z5 = (tmp10 - tmp12) * (0.382683433); /* c6 */ z2 = ( 0.541196100) * tmp10 + z5; /* c2-c6 */ z4 = ( 1.306562965) * tmp12 + z5; /* c2+c6 */ z3 = tmp11 * ( 0.707106781); /* c4 */
z11 = tmp7 + z3; /* phase 5 */ z13 = tmp7 - z3;
dataptr[5] = z13 + z2; /* phase 6 */ dataptr[3] = z13 - z2; dataptr[1] = z11 + z4; dataptr[7] = z11 - z4;
dataptr += 8; /* advance pointer to next row */ }
dataptr = datafloat; for (ctr = 7; ctr >= 0; ctr--) { tmp0 = dataptr[0] + dataptr[56]; tmp7 = dataptr[0] - dataptr[56]; tmp1 = dataptr[8] + dataptr[48]; tmp6 = dataptr[8] - dataptr[48]; tmp2 = dataptr[16] + dataptr[40]; tmp5 = dataptr[16] - dataptr[40]; tmp3 = dataptr[24] + dataptr[32]; tmp4 = dataptr[24] - dataptr[32];
/* Even part */
tmp10 = tmp0 + tmp3; /* phase 2 */ tmp13 = tmp0 - tmp3; tmp11 = tmp1 + tmp2; tmp12 = tmp1 - tmp2;
dataptr[0] = tmp10 + tmp11; /* phase 3 */ dataptr[32] = tmp10 - tmp11;
z1 = (tmp12 + tmp13) * ( 0.707106781); /* c4 */ dataptr[16] = tmp13 + z1; /* phase 5 */ dataptr[48] = tmp13 - z1;
/* Odd part */
tmp10 = tmp4 + tmp5; /* phase 2 */ tmp11 = tmp5 + tmp6; tmp12 = tmp6 + tmp7;
/* The rotator is modified from fig 4-8 to avoid extra negations. */ z5 = (tmp10 - tmp12) * ( 0.382683433); /* c6 */ z2 = ( 0.541196100) * tmp10 + z5; /* c2-c6 */ z4 = ( 1.306562965) * tmp12 + z5; /* c2+c6 */ z3 = tmp11 * ( 0.707106781); /* c4 */
z11 = tmp7 + z3; /* phase 5 */ z13 = tmp7 - z3;
dataptr[40] = z13 + z2; /* phase 6 */ dataptr[24] = z13 - z2; dataptr[8] = z11 + z4; dataptr[56] = z11 - z4;
dataptr++; /* advance pointer to next column */ }
for (i = 0; i < 64; i++) { /* Apply the quantization and scaling factor */ outdata[i] = datafloat[i] * fdtbl[i]; } }
После замены у всех переменных типа float на int скорость сжатия возросла в 3 раза. В общем вопросы по порядку: 1. Как быстро скопировать переменную в памяти( или использовать буфер isi интерфейса без порчи картинки) 2. Ускорить функцию квантования(Хотел бы разместить часть переменных в sram( она же быстрее sdram?))
Сообщение отредактировал aaarrr - Aug 21 2010, 16:33
Причина редактирования: Оформление цитаты исходника
|
|
|
|
|
 |
Ответов
|
Aug 21 2010, 20:27
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(AlexandrY @ Aug 22 2010, 00:14)  Ладно повторю яснее. И я попробую яснее. Если источник имеет одно выравнивание (скажем, младшие два бита адреса равны 1), а приемник другое (например, 3), то 32-битной пересылки пачками не получится в принципе. Максимум, что можно сделать (и делается в нормальных memcpy) - это 32-битное одинарное чтение, затем перепаковка и 32-битная запись. Иллюстрация: Код Word 0 1 2 3 4 0123 0123 0123 0123 0123 Source ABC DEFG HIJK LMNO Destination A BCDE FGHI JKLM NO
|
|
|
|
|
Aug 21 2010, 21:41
|

Ally
     
Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050

|
Цитата(aaarrr @ Aug 21 2010, 23:27)  И я попробую яснее. Если источник имеет одно выравнивание (скажем, младшие два бита адреса равны 1), а приемник другое (например, 3), то 32-битной пересылки пачками не получится в принципе. Максимум, что можно сделать (и делается в нормальных memcpy) - это 32-битное одинарное чтение, затем перепаковка и 32-битная запись. Иллюстрация: Код Word 0 1 2 3 4 0123 0123 0123 0123 0123 Source ABC DEFG HIJK LMNO Destination A BCDE FGHI JKLM NO Согласен. Что-то замкнуло у меня. Надо будет проверить влияние этого на производительность.
|
|
|
|
Сообщений в этой теме
wmakc jpeg на at91sam9g20 Aug 21 2010, 14:20 aaarrr Цитата(wmakc @ Aug 21 2010, 18:20) Картин... Aug 21 2010, 16:43     AlexandrY Ну вот протестировал. Результат здесь:
http://eewi... Aug 22 2010, 10:52 wmakc объясните как с помощью memcpy скопировать из char... Aug 22 2010, 05:16 aaarrr Цитата(wmakc @ Aug 22 2010, 09:16) объясн... Aug 22 2010, 05:45 wmakc Хотелось бы по подробнее узнать как создать Transl... Aug 22 2010, 07:04 aaarrr Цитата(wmakc @ Aug 22 2010, 11:04) Хотело... Aug 22 2010, 07:23 wmakc Тогда мне интересно узнать загрузчик at91bootstrap... Aug 22 2010, 07:32 aaarrr Нет, он только включает ICache. Aug 22 2010, 07:41 wmakc Как только добавил сссылку на sram в scatter файл ... Aug 22 2010, 07:59 aaarrr Значит переменных нет (как вариант, они могли быть... Aug 22 2010, 08:04 wmakc CODE
void InitMMU(unsigned int *pTranslationTable... Aug 22 2010, 09:01 aaarrr Цитата(wmakc @ Aug 22 2010, 13:01) В чем ... Aug 22 2010, 09:15 wmakc Пробовал в sdram, результата не дало Aug 22 2010, 10:34 wmakc Как использовать memcpy для копирования из массива... Aug 22 2010, 11:26 AlexandrY Цитата(wmakc @ Aug 22 2010, 14:26) Как ис... Aug 22 2010, 11:48 wmakc Да я вроде как новичек, так что если перенесут, то... Aug 22 2010, 15:13 aaarrr Цитата(wmakc @ Aug 22 2010, 14:34) Пробов... Aug 22 2010, 16:21 wmakc указал в качестве адреса pTranslationTable указать... Aug 22 2010, 16:57 aaarrr Перед инициализацией MMU следует запретить и инвал... Aug 22 2010, 17:42 etoja Цитата(wmakc @ Aug 21 2010, 18:20) Делаю ... Aug 23 2010, 07:39 aaarrr Цитата(etoja @ Aug 23 2010, 11:39) Нормал... Aug 23 2010, 13:16 wmakc картинка 640 на 480, цветная. Хотелось бы чтобы за... Aug 23 2010, 16:54 aaarrr Цитата(wmakc @ Aug 23 2010, 20:54) ...дум... Aug 23 2010, 17:08 andrewlekar Да и 3 секунды для такой картинки это много. У мен... Aug 24 2010, 04:40 etoja Камера mt9d131 может выдавать картинку сразу в фор... Aug 24 2010, 06:54 wmakc Цитата(etoja @ Aug 24 2010, 10:54) Камера... Aug 24 2010, 10:55 wmakc Если есть еще какие - то способы по улучшению быст... Aug 24 2010, 15:01
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|