Ксения (02.11.2009 16:30 - 19:00, просмотров: 176) ответил AlexandrY на Ну хоть и нелинейный, но АЧХ с него снять можно и тут открываются интересные вещи.
То, что я давала, это именно вычисление медианы, а сортировка из этого делается так: for( int i=0; i < length - gap; i++)
array[i] = median( &array[i], gap);
где:
array[] - массив данных, подвергаемый медианной фильтрации,
length - число элементов в нем,
gap - ширина окна фильтра.
Здесь используется один и тот же массив с той хитростью, что медиана сперва укладывается не на середину интервала, внутри которого она была найдена, а в первый элемент этого интервала. Это делается для того, чтобы исправленное (отфильтрованное) значение элемента массива не участвовало в расчете медианы соседней с ним точки. Когда же фильтрация полностью завершена, данные в массиве сдвигаются вправо (в сторону старших адресов) ровно на 1/2 gap, благодаря чему они окажутся на своих местах. Например, как-нибудь так:
memmove( &array[gap/2], array, gap/2*sizeof(*array));
А "хвостики" в 1/2 gap с каждой стороны заполняю размножением крайних отфильтрованных значений, т.к. точки на хвостах отфильтровать этим способом все равно нельзя.