Посмотрел кстати (+)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено SM 27 июня 2003 г. 17:57
В ответ на: спасибо, идея интересная, мне только циклический буфер в голову приходил... про 2 буфера не подумал... отправлено SOIC 27 июня 2003 г. 17:47

Угу - циклический буфер указателей, завязанных друг на друга.

Короче - вот так примерно. Вырезал в попыхах, мог наглючить. Все "]" заменить на ">", а "[" на "<". Кроме индекса массива естессно :)

typedef struct _max_list *LPMAXLIST;

typedef struct _max_list {
LPMAXLIST *prev, *next;
int sample;
} MAXLIST;

MAXLIST DelayLine[256]
int DlyPtr;
LPMAXLIST FirstInMaxList;

int ProcessSample(int sample)
{
LPMAXLIST pmxl, pmxl_temp;

// Pointer to last element (circular addressing)
pmxl = DelayLine[DlyPtr++]; DlyPtr &= 255;

// Remove last element from link in max_list
if (pmxl-]prev) pmxl-]prev-]next = pmxl-]next;
if (pmxl-]next) pmxl-]next-]prev = pmxl-]prev;

// Fill pmxl
pmxl-]sample = sample

// Find new position
pmxl_temp = FirstInMaxList;
while (pmxl_temp-]next && (pmxl_temp-]sample[=sample)) pmxl_temp=pmxl_temp-]next;

// Insert element as prev
if (!pmxl_temp-]prev) { // first element
FirstInMaxList = pmxl;
pmxl-]prev = NULL;
pmxl-]next = pmxl_temp;
} else {
pmxl-]next = pmxl_temp;
pmxl-]prev = pmxl_temp-]prev;
pmxl_temp-]prev = pmxl;
pmxl-]prev-]next = pmxl;
}

// Get median value and return it
pmxl = FirstInMaxList;
for (i=0; i<127; i++) pmxl=pmxl-]next;
return pmxl-]sample;

}



Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru