Страница 1 из 2

усреднение результатов измерения

Добавлено: Пт ноя 27, 2015 13:18:51
Mishany
есть делема: какой алгоритм применить для усреднения результатов измерения?
У меня возникла надобность в этом в связи с опросом датчика уровня топлива.
Арифметическое среднее - худший результат.
В голове родился метод, еще не нашел его научного аналога хотя он должен быть.
Смысл его такой:
1. заполняем массив значениями.
2. находим мин и макс и вычисляем виртуальное среднее(ВС) по этим двум значениям.
3. вычисляем количество элементов которые меньше ВС (min_s++) и количество которые больше ВС (max_s++)
4. если min_s>max_s ВС уменьшаем иначе увеличиваем, и повторяем с п.3 пока min_s не станет больше max_s и наоборот.
немного художества:
где красная линия это арифметическое среднее
желтые линии по методу медианы(их две в зависимости от четности длины массива)
и зеленая по моему методу.
СпойлерИзображение
но не все так хорошо как казалось по началу, я еще не до конца изучил его поведение...
также прилагаю код на си реализации с длиной массива 20 как испытуемого.
Спойлер

Код: Выделить всё

unsigned int min, max, min_s, max_s, sred;
unsigned int mass[20] = {400,1000,200,900,300,800,400,400,600,32000,1000,900,400,700,300,500,400,1000,400,1000};
void ras_sred(void)
{
	min=mass[0];	
	max=mass[0];
	for (uint8_t i=0;i<20;i++)
	{
		if (min>mass[i])
		{
			min = mass[i];
		}
		if (max<mass[i])
		{
			max = mass[i];
		}
	}
	sred=min+(max-min)/2;
	sum_element();
	correct_sred();
}	

void sum_element(void)
{
	min_s=0;
	max_s=0;
	for (uint8_t i=0;i<20;i++)
	{
		if (sred>mass[i])
		{
			min_s++;
		}
		if (sred<mass[i])
		{
			max_s++;
		}
	}
}

void correct_sred(void)
{
///грубая корректировка
	while (min_s>max_s)
	{
		ras_sred();
		sred-=200;
	}
	while (min_s<max_s)
	{
		ras_sred();
		sred+=200;
	}
///средняя корректировка
	while (min_s>max_s)
	{
		ras_sred();
		sred-=20;
	}
	while (min_s<max_s)
	{
		ras_sred();
		sred+=20;
	}
///точная корректировка
		while (min_s>max_s)
	{
		ras_sred();
		sred--;
	}
	while (min_s<max_s)
	{
		ras_sred();
		sred++;
	}
}

int main(void)
{
    while(1)
    {
		ras_sred();
		uint16_t temp=sred;
		
    }
}
может кто знает что то лучше?

Re: усреднение результатов измерения

Добавлено: Пт ноя 27, 2015 13:36:05
КРАМ
Ерунда какая то...
Если есть место в ОЗУ под скользящее окно, то нужно делать классический FIR LPF (КИХ ФНЧ).
Если места мало, то рекурсивный IIR LPF (БИХ ФНЧ).
КИХ вычисляет либо скользящее среднее (прямоугольная оконная функция), либо взвешенное по окну (оконная функция имеет непрямоугольный характер - не является константой).
При вычислении скользящего среднего нужно при КАЖДОМ НОВОМ ПОСТУПИВШЕМ значении пересчитывать среднее по буферу.
Преимущество взвешенного среднего в низких боковых лепестках АЧХ ФНЧ. Для указанного применения никакого смысла не имеет. Достаточно прямоугольного окна.

Re: усреднение результатов измерения

Добавлено: Пн ноя 30, 2015 21:01:58
Сэр Мурр
Да просто примите, что данные подчиняются нормальному Гауссову распределению, по правилу трёх сигм, и отбросьте всё, что выходит за эти пределы.

Re: усреднение результатов измерения

Добавлено: Пн ноя 30, 2015 21:06:17
КРАМ
Причем тут нормальное распределение? :facepalm:
Речь идет о датчике топлива. Там флюктуации совершенно неслучайны и имеют четкий линейчатый спектр.

Re: усреднение результатов измерения

Добавлено: Пн ноя 30, 2015 21:21:32
Сэр Мурр
Ну конечно, при просмотре рисунка совершенно чётко видно ГАРМОНИЧЕСКОЕ КОЛЕБАНИЕ измеренного значения :shock: :shock: С линейчатым спектром через каждые два замера..

Re: усреднение результатов измерения

Добавлено: Вт дек 01, 2015 00:44:15
Аlex
Mishany, вот всё ваше усреднение :

Код: Выделить всё

//***********************************************************************************************
unsigned int mass[20] = {400,1000,200,900,300,800,400,400,600,32000,1000,900,400,700,300,500,400,1000,400,1000};
#define     SIZE_ARR(n)     (sizeof(n)/sizeof(n[0]))


//***********************************************************************************************
void main(void){
unsigned int temp;


sort(mass, SIZE_ARR(mass));     // Сортируем массив
temp = (mass[SIZE_ARR(mass)/2] + mass[SIZE_ARR(mass)/2-1]) / 2;     // Берём 2 значения из середины и вычисляем их среднее

while(1){
}
}
//***********************************************************************************************
Выходное значение, при таких данных = 550. Как и в Вашем случае.
И выполнятся будет быстрее, и нет кучи каких-то ненужных рекурсий. К слову, Ваш код, на компиляторе MCC18 и контроллере PIC18F26K22, забивает стек наглухо.

Re: усреднение результатов измерения

Добавлено: Вт дек 01, 2015 10:45:10
Mishany
Метот медианы это я так понял?
он у меня по массиву 450 дает. может конечно я что не так сделал?
Спойлер

Код: Выделить всё

void sort(void)
{
	for(j=0;j<20;j++)
		{
			min=mass[j];
		for(i=j;i<20;i++)
			{
				if (min>mass[i])
				{
					mass[j]=mass[i];
					mass[i]=min;
					min=mass[j];
				}
			}
			
		}
}

int main(void)
{
    while(1)
    {
		sort();   // Сортируем массив по возрастанию
		temp = (mass[SIZE_ARR(mass)/2] + mass[SIZE_ARR(mass)/2-1]) / 2;     // Берём 2 значения из середины и вычисляем их среднее

		
    }
}

Re: усреднение результатов измерения

Добавлено: Вт дек 01, 2015 14:04:48
КРАМ
Сэр Мурр писал(а):Ну конечно, при просмотре рисунка совершенно чётко видно ГАРМОНИЧЕСКОЕ КОЛЕБАНИЕ измеренного значения :shock: :shock: С линейчатым спектром через каждые два замера..
Датчик уровня топлива отражает БОЛТАНКУ топлива в баке. Вы полагаете, что раскачивание жидкости имеет непрерывный спектр? :) :tea:
Фильтрация сигнала должна учитывать ПАРАМЕТРЫ сигнала. И выбор как метода фильтрации, так и частоты дискретизации , определяется именно параметрами сигнала. Иначе и фильтр будет, и метод хитроумный, а результата не будет... :tea:

Re: усреднение результатов измерения

Добавлено: Вт дек 01, 2015 17:40:58
Mishany
график я сам примерно нарисовал, факторов болтанки много: ускорение, торможение, неровность дороги, дискретность 1 ед. времени
думаю еще совместить с гистерезисом

Re: усреднение результатов измерения

Добавлено: Вт дек 01, 2015 21:19:51
Сэр Мурр
Вы полагаете, что раскачивание жидкости имеет непрерывный спектр?
Я полагаю, что Вы не поняли шутки
Да, конечно, фильтрация должна учитывать параметры сигнала, особенно- если она их ЗНАЕТ.
А поскольку эти параметры известны с точностью погоды на Марсе, то можно поступить следующим образом :1) поставить кучу датчиков в разных местах (вроде, такого не делают из-за усложнения конструкции); 2) задемпфировать датчик- поместить его, например, в трубу (примерно как для ёмкостных датчиков)3) измерять РЕАЛЬНЫЙ расход топлива, и на этой основе рассчитывать остаток в баке (самый точный способ), 4) забить болт на сверхточность и пользоваться показаниями обычного поплавкового датчика, что и делается на всех транспортных средствах. Хотя при изменении конструкции топливного бака, самым простым и надёжным способом будет измерение гидростатического давления столба топлива в баке.
Короче, мне не известно ни одной принятой в эксплуатацию системы непрерывного мониторинга уроня топлива в движущемся транспорте.

Re: усреднение результатов измерения

Добавлено: Ср дек 02, 2015 03:48:30
КРАМ
Сэр Мурр писал(а):
Вы полагаете, что раскачивание жидкости имеет непрерывный спектр?
Я полагаю, что Вы не поняли шутки
Да, конечно, фильтрация должна учитывать параметры сигнала, особенно- если она их ЗНАЕТ.
Шутку то я как раз понял. Но вот НАПРАВЛЕНИЕ этой шутки оказалось весьма ошибочным. У Вас.
Потому что дело в данном случае не в точных параметрах спектра, а в Вашем предположении нормального распределения и использование нелинейного метода, который и предполагает это распределение.
Бессмысленно использовать метод трех сигм для сигнала, который не является случайным в статистическом смысле. То, что нам неизвестно когда автомобиль тряхнет на очередном ухабе, не делает сигнал датчика случайным.
Подобные сигналы фильтруют ЛИНЕЙНЫМИ методами.

Re: усреднение результатов измерения

Добавлено: Ср дек 02, 2015 04:42:17
Albert_V
Mishany, надеюсь, вы учитываете что машина очень редко бывает на горизонтальной поверхности.
Так же, нижний край заборной трубки находится на некотором расстоянии от дна бака (с допуском "от земли до луны") и, как правило, эта точка забора топлива находится не в геометрическом центре бензобака.
Здесь уже говорили про несколько датчиков.
На вскидку, 3-4 датчика "по краям" должно быть достаточно.

Re: усреднение результатов измерения

Добавлено: Ср дек 02, 2015 05:31:23
Mishany
а причем заборная трубка?

Re: усреднение результатов измерения

Добавлено: Ср дек 02, 2015 05:34:54
Albert_V
При том, что если точка забора топлива, к примеру, находится ближе к "морде" и вы едете под углом вверх (в гору) - что вы увидите по датчику уровня топлива и в какой момент прекратится забор топлива из бака (начнёт воздух сосать)?
А если спускаетесь с горки?
Думайте....

Re: усреднение результатов измерения

Добавлено: Ср дек 02, 2015 07:06:33
Mishany
не надо все авто к жигулям приравнивать :))) у меня ниссан теана. да и речь не о заборе топлива, а о алгоритме. метод медианы считаю оптимальным решением в сочетании с гистерезисом.

Re: усреднение результатов измерения

Добавлено: Ср дек 02, 2015 07:25:28
Albert_V
Mishany писал(а):...речь не о заборе топлива, а о алгоритме...
Дык, КРАМ, во втором посте, очень грамотно и доходчиво сказал что нужно/можно сделать.
Я, просто, сказал вам в каких ситуациях могут быть ошибки в показаниях вашего будущего прибора.

Re: усреднение результатов измерения

Добавлено: Чт дек 03, 2015 21:14:22
YS
Так а чем не устраивает простой рекурсивный фильтр первого порядка с большой постоянной времени? Или я что-то проглядел в постановке задачи?

Re: усреднение результатов измерения

Добавлено: Пт дек 04, 2015 10:08:40
КРАМ
Всем он устраивает. Только автор желает пооригинальничать...

Re: усреднение результатов измерения

Добавлено: Пт дек 04, 2015 20:05:41
Halex
YS писал(а):Так а чем не устраивает простой рекурсивный фильтр первого порядка с большой постоянной времени?
Млин, чудно, что никогда никто не заправлял свою машину топливом??? Даже штатные указатели начинают нормально показывать, когда Вы уже "укатили" за километр или дальше от заправки, причём не только на отечественных "вёдрах с гайками", но и на бюджетных иномарках. Видимо ТС хочет сосчитать "четыреста две капли валерьянки" .
Изображение

Re: усреднение результатов измерения

Добавлено: Пт дек 04, 2015 22:13:02
Mishany
пытаюсь штатный бортовик повторить на андройде, с климатом уже все решено и прекрасно работает, а вот с расходом не очень устраивает плавающие показания.
За предложения по расчетам благодарю, с fir и iir по роду деятельности не сталкивался, и к сожалению еще не разобрался, мое художество в топку. Как будет результат, обязательно поделюсь.