ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
6 июля
170626 Топик полностью
VAI (29.10.2009 12:05, просмотров: 191) ответил Ксения на Вот этот код вычисляет у меня медиану:
А я так: Для хранения обрабатываемого массива использую свой кольцевой буфер... #define MED_LEN 7 // 3..31 static unsigned long mediana( unsigned long adc ) { #define MAX_adc 0xffffffffUL int a, b; unsigned long c; #if ( MED_LEN > 15 ) unsigned long med_pos, k, k1; #else // MED_LEN <= 15 unsigned int med_pos, k, k1; #endif // MED_LEN // + Подготовка - поместим новое значение в кольцевой буфер *cbuf_mediana.tail = adc; if ( ++cbuf_mediana.tail == &cbuf_mediana.buf[MED_LEN] ) cbuf_mediana.tail = &cbuf_mediana.buf[0]; // - Подготовка - поместим новое значение в кольцевой буфер // + Поиск медианы for ( med_pos = 0, a = 0; a < 1 + ( MED_LEN >> 1 ); a++ ) // достаточно просмотреть половину... { for ( b = 0, k = 1, c = MAX_adc; b < MED_LEN; b++, k <<= 1 ) { if ( !( med_pos & k ) && c > cbuf_mediana.buf[b] ) { c = cbuf_mediana.buf[b]; k1 = k; // Запомним позицию, чтобы повторно не проверять } } med_pos |= k1; } // - Поиск медианы return( c ); #undef MAX_adc }