Некорректное поведение текущего среднего? Для определения длины выборки написал несколько одинаковых фильтров разной длины.
//
// Фильтр с сайта EasyElectronics.ru
// Y(n) = (15*Y(n-1) + X(n)) >> 4
int average_filter(int NewSample, int order)
{
unsigned int result;
result = NewSample;
switch (order)
{
case 2: result = result_2 = ( 3*result_2 + NewSample) >> 2; break;
case 3: result = result_3 = ( 7*result_3 + NewSample) >> 3; break;
case 4: result = result_4 = (15*result_4 + NewSample) >> 4; break;
case 5: result = result_5 = (31*result_5 + NewSample) >> 5; break;
case 6: result = result_6 = (63*result_6 + NewSample) >> 6; break;
case 7: result = result_7 = (127*result_7 + NewSample) >> 7; break;
case 8: result = result_8 = (255*result_8 + NewSample) >> 8; break;
}
return result;
}
Принимаю данные на комп и отображаю на графике.
MainForm->RawData->Series[0]->AddXY(coorX, (int)data, "",clBlue);
MainForm->RawData->Series[1]->AddXY(coorX, average_filter(data,2), "",clGreen);
MainForm->RawData->Series[2]->AddXY(coorX, average_filter(data,3), "",clBlack);
MainForm->RawData->Series[3]->AddXY(coorX, average_filter(data,4), "",clRed);
MainForm->RawData->Series[4]->AddXY(coorX, average_filter(data,8), "",clPurple);
Рассчитывал что "мелкоразмерные" фильтры буду использовать для определения наличия полезого сигнала, на фоне "длинного".
"Мелкоразмерные" фильтры отслеживают сигнал, а вот усреднение, длиной 256 выборок явно "ползет в низ" от коротких провалов.
Предполагаю, что это из за отбрасывания младших разрядов и "не совсем честного" фильтра текущего среднего.
Или некорретно написан фильтр?