Ответ: когда нажать "Топик полностью" - видно весь текст. Еще одна проба...
/* --- mediana() ------------------------------------------------------------------------------------------ **
* Медианный фильтр
* med[MED_LEN] - массив отсчетов
* adc - отсчет АЦП.
* -------------------------------------------------------------------------------------------------------- */
// оптимизирована мной. VAI. При измерении времени все прерывания работают
// время выполнения при MED_LEN = 5 ~ 42 мкс
// время выполнения при MED_LEN = 7 ~ 73 мкс
// время выполнения при MED_LEN = 15 ~ 340 мкс
// время выполнения при MED_LEN = 25 ~ 1700 мкс
// время выполнения при MED_LEN = 31 ~ 4220 мкс
unsigned short mediana( unsigned short med[], unsigned short adc )
{
int a, b;
unsigned short c;
#if ( MED_LEN > 15 )
unsigned long med_pos, k; // размерность этих переменных (в битах) должна быть больше, чем MED_LEN
#else
unsigned int med_pos, k; // размерность этих переменных (в битах) должна быть больше, чем MED_LEN
#endif //
// Подготовка
for ( a = 0, b = 1; a < MED_LEN - 1; ) // сдвинем отсчеты
med[a++] = med[b++];
med[MED_LEN - 1] = adc;
med_pos = 0; // очистим бит-позиции
// Поиск медианы
for ( a = 0; a < ( MED_LEN >> 1 ); a++ ) // Сортировка массива
{ for ( b = 0, k = 1, c = 0x7fff; b < MED_LEN; b++, k <<= 1 ) // Поиск наименьшего для исключения из дальнейшей сортировки
{ if ( !( med_pos & k ) && c > med[b] )
c = med[b];
}
med_pos |= k;
}
return( c );
}