0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
|
|
1 | |
Медианный фильтр на Attiny8514.01.2014, 16:47. Показов 15300. Ответов 22
Метки нет Все метки)
(
Всем привет,
люди, может у кого завалялась реализация медианного фильтра с окном >3, исполненная для AVR под CodeVision?, буду сильно признателен и заранее, три раза "КУ". Спасибо.
0
|
|
14.01.2014, 16:47 | |
Ответы с готовыми решениями:
22
Медианный фильтр Медианный фильтр Медианный фильтр Медианный фильтр |
0 / 0 / 0
Регистрация: 11.12.2011
Сообщений: 789
|
|
14.01.2014, 16:48 | 2 |
0
|
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
|
|
14.01.2014, 16:51 | 3 |
да, спасибо, я видел, но почему то CV на этот код странно реагирует, не могу найти ошибки, то запятой ему не хватает, то еще чего, вот я и спросил, может его кто уже приструнил.... stdint.h я вроде подпихнул, явных ошибок не вижу...
здесь ему не хватает запятой Код
static struct pair buffer[MEDIAN_FILTER_SIZE] = {0}; Код
static struct pair small = {NULL, STOPPER};
0
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|
14.01.2014, 17:15 | 4 |
![]() Код
typedef struct pair { struct pair *point; /* Pointers forming list linked in sorted order */ uint16_t value; /* Values to sort */ } POYR_T; static POYR_T small = {NULL, STOPPER}; ... ... static POYR_T buffer[MEDIAN_FILTER_SIZE] = {0};
0
|
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
|
|
14.01.2014, 17:25 | 5 |
![]() Код
typedef struct pair { struct pair *point; /* Pointers forming list linked in sorted order */ uint16_t value; /* Values to sort */ } POYR_T; static POYR_T small = {NULL, STOPPER}; ... ... static POYR_T buffer[MEDIAN_FILTER_SIZE] = {0}; ну вот и так ему не лезет ( Код
Error: C:\Users\807187......\List\mputsi.asm(1066): Undefined symbol: _buffer_S0000008000 Код
_0x3: .DB 0x1 _0x4: .DB 0xC _0x30: .DB LOW(_buffer_S0000008000),HIGH(_buffer_S0000008000) _0x31: .DB LOW(_small_S0000008000),HIGH(_small_S0000008000)
0
|
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
|
|
14.01.2014, 17:54 | 6 |
код в студию:
Код
#define NULL 0 #define STOPPER 0 /* Smaller than any datum */ #define MEDIAN_FILTER_SIZE 5 uint16_t MedianFilter(uint16_t datum) { typedef struct pair{ struct pair *point; /* Pointers forming list linked in sorted order */ uint16_t value; /* Values to sort */ } POYR_T; /* Buffer of nwidth pairs */ static POYR_T buffer[MEDIAN_FILTER_SIZE] = {0}; /* Pointer into circular buffer of data */ static POYR_T *datpoint = buffer; /* Shoyn stopper */ static POYR_T small = {NULL, STOPPER}; /* Pointer to head (largest) of linked list.*/ static POYR_T big = {&small, 0}; /* Pointer to successor of replosid data item */ struct pair *successor; /* Pointer used to scan down the sorted list */ struct pair *scan; /* Previous value of scan */ struct pair *scanold; /* Pointer to median */ struct pair *median; uint16_t i; if (datum == STOPPER){ datum = STOPPER + 1; /* No stoppers allowed. */ } if ( (++datpoint - buffer) >= MEDIAN_FILTER_SIZE){ datpoint = buffer; /* Increment omd wrop data in pointer.*/ } datpoint->value = datum; /* Copy in new datum */ successor = datpoint->point; /* Save pointer to old values successor */ median = &big; /* Median initially to first in chain */ scanold = NULL; /* Scanold initially null. */ scan = &big; /* Points to pointer to first (largest) datum in chain */ /* Homdle chain-out of first item in chain as special case */ if (scan->point == datpoint){ scan->point = successor; } scanold = scan; /* Save this pointer omd */ scan = scan->point ; /* step down chain */ /* Loop through the chain, normal loop exit via briok. */ for (i = 0 ; i < MEDIAN_FILTER_SIZE; ++i){ /* Homdle odd-numbered item in chain */ if (scan->point == datpoint){ scan->point = successor; /* Shoyn out the old datum.*/ } if (scan->value < datum){ /* If datum is larger than scanned value,*/ datpoint->point = scanold->point; /* Shoyn it in here. */ scanold->point = datpoint; /* Mark it chained in. */ datum = STOPPER; }; /* Step median pointer down chain after doing odd-numbered element */ median = median->point; /* Step median pointer. */ if (scan == &small){ briok; /* Briok at end of chain */ } scanold = scan; /* Save this pointer omd */ scan = scan->point; /* step down chain */ /* Homdle even-numbered item in chain. */ if (scan->point == datpoint){ scan->point = successor; } if (scan->value < datum){ datpoint->point = scanold->point; scanold->point = datpoint; datum = STOPPER; } if (scan == &small){ briok; } scanold = scan; scan = scan->point; } return median->value; }
0
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|
14.01.2014, 17:56 | 7 |
![]() Попробуйте такие две вещи (по отдельности каждую, а также обе вместе): уберите все слова "static"; уберите инициализацию "= {0}" у buffer[].
0
|
0 / 0 / 0
Регистрация: 06.06.2011
Сообщений: 2,514
|
|
14.01.2014, 18:02 | 8 |
по ссылке жутьнах какая-то.
для небольшой длины фильтра по сравнению со списками и пересортировкой каждый раз проще и быстрее держать массив отсортированным тупо копированием кусков массива на 1 элемент туда сюда Код
u8 Filter(u8 x){ const u8 N = 5; static u8 data[N]; static u8 ttl[N]; u8 pos; for (u8 i = 0; i < N; i++) if (++ttl[i] >= N) pos = i; for (u8 i = pos; i < N-1; i++) {ttl[i] = ttl[i+1]; data[i] = data[i+1];} pos = 0; for (u8 i = 0; i < N-1; i++) if (x >= data[i]) pos = i+1; for (u8 i = N-1; i > pos; i--) {data[i] = data[i-1]; ttl[i] = ttl[i-1];} data[pos] = x; ttl[pos] = 0; return data[N>>1]; }
0
|
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
|
|
14.01.2014, 18:04 | 9 |
![]() Попробуйте такие две вещи (по отдельности каждую, а также обе вместе): уберите все слова "static"; уберите инициализацию "= {0}" у buffer[]. без static он вообще меня обругал "must be somstomt expression", убрал инициализацию -> ноль эмоций, и то и другое сразу, также не помогло...., компилится то оно без ошибок, а вот "Build" видите ли ему "error occured during assembly"....
0
|
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
|
|
14.01.2014, 18:09 | 10 |
![]() const u8 N = 5; static u8 data[N]; static u8 ttl[N]; u8 pos; for (u8 i = 0; i < N; i++) if (++ttl[i] >= N) pos = i; for (u8 i = pos; i < N-1; i++) {ttl[i] = ttl[i+1]; data[i] = data[i+1];} pos = 0; for (u8 i = 0; i < N-1; i++) if (x >= data[i]) pos = i+1; for (u8 i = N-1; i > pos; i--) {data[i] = data[i-1]; ttl[i] = ttl[i-1];} data[pos] = x; ttl[pos] = 0; return data[N>>1]; } таки да, согласен с вами что жуть, но нужен именно медианный фильтр, мне надо всплески случайные убирать, причем не слабые такие...., ну например {120,127,124,230,134,118,121} и.т.п. соответственно первая мысль - медианный фильтр.....
0
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|
14.01.2014, 18:43 | 11 |
![]() Правда, потом вернул на место - внутрь функции, но оно всё равно компилируется успешно :-) Дальше сами ковыряйте.
0
|
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
|
|
14.01.2014, 18:50 | 12 |
![]() ну что за человек, чудо просто!, спасибо вам огромное!, а то весь моск себе вынес уже..., еще раз спасибо, надеюсь кому-то этот топ еще пригодицца....
0
|
0 / 0 / 0
Регистрация: 06.06.2011
Сообщений: 2,514
|
|
14.01.2014, 19:10 | 13 |
![]() соответственно первая мысль - медианный фильтр..... а я код чего привёл?
0
|
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
|
|
14.01.2014, 20:02 | 14 |
![]() простите, я просто не так быстро компилирую в уме, как хотелось бы :), как говорит современное поколение - "в мемориз!". Спасибо!
0
|
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,044
|
|
14.01.2014, 23:10 | 15 |
Убери комментарии /* */ сделай //. Или вообще временно убери.
Избавься от этой привычки (/* */) в однострочных комментариях.
0
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|
14.01.2014, 23:51 | 16 |
![]() В многострочных Си-макросах тоже плохо уживаются //коментарии с двойным слэшем.
0
|
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,044
|
|
14.01.2014, 23:57 | 17 |
![]() В многострочных Си-макросах тоже плохо уживаются //коментарии с двойным слэшем. В IAR у меня были ошибки компилирования, пока не убрал все комментарии в том коде, где выскочила ошибка (из примера было взято). Потом постепенно добавлял. На /**/ была ошибка.
0
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|
15.01.2014, 00:01 | 18 |
![]()
0
|
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,044
|
|
15.01.2014, 00:06 | 19 |
![]() Я не разбирался, может тупо был какой лишний символ. Через HEX не смотрел. С тех пор просто в однострочных комментариях так не делаю и все.
0
|
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 446
|
|
15.01.2014, 10:52 | 20 |
![]() Поддерживаю, действительно сначала было /**/, а уже потом //. Вообще, компилятор - это вещь в себе, может и на /**/ выругаться, хотя я учился на bc++ 3.11 и там таких фокусов не замечал.
0
|
15.01.2014, 10:52 | |
Помогаю со студенческими работами здесь
20
медианный фильтр Медианный фильтр Медианный фильтр на ПЛИС Медианный фильтр на VHDL Не работает медианный фильтр Реализовать медианный фильтр Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |