ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
19 июля
15520 Топик полностью
VAI (12.10.2004 17:49, просмотров: 1) ответил VAI на Ответ: Сожрала половину
Ответ: когда нажать "Топик полностью" - видно весь текст. Еще одна проба... 





/* --- 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 );
}