Цитата(Stanislav @ May 24 2007, 19:09)

Не, медианный фильтр я бы всё-таки поостерёгся применять - он может сильно исказить сигнал, и "вытереть" существенные его изменения.
Не-а. Естесно, я не предлагаю использовать выход медианного фильтра в чистом виде. Примерно так:
Код
чуть выше два медианных фильтра обработали очередной отсчет с номером i и выдали заключение в виде SkipSample
if(SkipSample)
{
if(SkippedSamplesCnt < (Median1Width - Median2Width))
{
SkippedSamplesCnt++;
OutStream[i] = что-нибудь (предыдущий отсчет, апроксимация, ...)
}
else
{
OutStream[i - (Median1Width - Median2Width)] = InStream[i - (Median1Width - Median2Width)];
пересчитать апроксимацию для отсчетов [i - (Median1Width - Median2Width - 1) .. i]
}
}
else
{
if(SkippedSamplesCnt) SkippedSamplesCnt--;
OutStream[i] = InStream[i];
}
Данные в OutStream будут пригодны к употреблению с задержкой (Median1Width - Median2Width) + 1.
Это, естесно, эскиз идеи (которую я лет двадцать тому уже опробовал при обработке статистики по авиационным движкам - там тоже выбросов хватало).
Цитата
А как быть, если несколько импульсов помехи идут подряд?
Решается выбором ширины окон фильтров. Можно вообще подстраивать их ширину под динамику сигнала.
upd: Приношу извинения за легкое введение в заблуждение. В описанной выше процедуре для принятия решения SkipSample используется не выход медианных фильтров, а побочный результат сортировки для них в виде
Код
if(((index(MAX(InStream[i-Median1Width .. i]) == i) && (index(MAX(InStream[i-Median2Width .. i]) == i)) ||
((index(MIN(InStream[i-Median1Width .. i]) == i) && (index(MIN(InStream[i-Median2Width .. i]) == i)))
SkipSample = true;
else SkipSample = false;