|
Угу - циклический буфер указателей, завязанных друг на друга.
Короче - вот так примерно. Вырезал в попыхах, мог наглючить. Все "]" заменить на ">", а "[" на "<". Кроме индекса массива естессно :)
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