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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Электрический кот
Аватара пользователя
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Сообщение 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;
		
    }
}
может кто знает что то лучше?
Реклама
Друг Кота
Аватара пользователя
Сообщения: 25846
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

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

Сообщение Сэр Мурр »

Да просто примите, что данные подчиняются нормальному Гауссову распределению, по правилу трёх сигм, и отбросьте всё, что выходит за эти пределы.
Друг Кота
Аватара пользователя
Сообщения: 25846
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

Причем тут нормальное распределение? :facepalm:
Речь идет о датчике топлива. Там флюктуации совершенно неслучайны и имеют четкий линейчатый спектр.
Реклама
Эиком - электронные компоненты и радиодетали
Модератор
Аватара пользователя
Сообщения: 11169
Зарегистрирован: Чт окт 27, 2005 18:50:07
Откуда: из мест не столь отдалённых

Сообщение Сэр Мурр »

Ну конечно, при просмотре рисунка совершенно чётко видно ГАРМОНИЧЕСКОЕ КОЛЕБАНИЕ измеренного значения :shock: :shock: С линейчатым спектром через каждые два замера..
Реклама
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение А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, забивает стек наглухо.
Реклама
Электрический кот
Аватара пользователя
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Сообщение 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 значения из середины и вычисляем их среднее

		
    }
}
Друг Кота
Аватара пользователя
Сообщения: 25846
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

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

Сообщение Mishany »

график я сам примерно нарисовал, факторов болтанки много: ускорение, торможение, неровность дороги, дискретность 1 ед. времени
думаю еще совместить с гистерезисом
Модератор
Аватара пользователя
Сообщения: 11169
Зарегистрирован: Чт окт 27, 2005 18:50:07
Откуда: из мест не столь отдалённых

Сообщение Сэр Мурр »

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

Сообщение КРАМ »

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

Сообщение Albert_V »

Mishany, надеюсь, вы учитываете что машина очень редко бывает на горизонтальной поверхности.
Так же, нижний край заборной трубки находится на некотором расстоянии от дна бака (с допуском "от земли до луны") и, как правило, эта точка забора топлива находится не в геометрическом центре бензобака.
Здесь уже говорили про несколько датчиков.
На вскидку, 3-4 датчика "по краям" должно быть достаточно.
Электрический кот
Аватара пользователя
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Сообщение Mishany »

а причем заборная трубка?
Друг Кота
Аватара пользователя
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Сообщение Albert_V »

При том, что если точка забора топлива, к примеру, находится ближе к "морде" и вы едете под углом вверх (в гору) - что вы увидите по датчику уровня топлива и в какой момент прекратится забор топлива из бака (начнёт воздух сосать)?
А если спускаетесь с горки?
Думайте....
Электрический кот
Аватара пользователя
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Сообщение Mishany »

не надо все авто к жигулям приравнивать :))) у меня ниссан теана. да и речь не о заборе топлива, а о алгоритме. метод медианы считаю оптимальным решением в сочетании с гистерезисом.
Друг Кота
Аватара пользователя
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Сообщение Albert_V »

Mishany писал(а):...речь не о заборе топлива, а о алгоритме...
Дык, КРАМ, во втором посте, очень грамотно и доходчиво сказал что нужно/можно сделать.
Я, просто, сказал вам в каких ситуациях могут быть ошибки в показаниях вашего будущего прибора.
YS
Друг Кота
Аватара пользователя
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05

Сообщение YS »

Так а чем не устраивает простой рекурсивный фильтр первого порядка с большой постоянной времени? Или я что-то проглядел в постановке задачи?
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 25846
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

Всем он устраивает. Только автор желает пооригинальничать...
Грызет канифоль
Аватара пользователя
Сообщения: 281
Зарегистрирован: Пт ноя 15, 2013 20:58:23

Сообщение Halex »

YS писал(а):Так а чем не устраивает простой рекурсивный фильтр первого порядка с большой постоянной времени?
Млин, чудно, что никогда никто не заправлял свою машину топливом??? Даже штатные указатели начинают нормально показывать, когда Вы уже "укатили" за километр или дальше от заправки, причём не только на отечественных "вёдрах с гайками", но и на бюджетных иномарках. Видимо ТС хочет сосчитать "четыреста две капли валерьянки" .
Изображение
Электрический кот
Аватара пользователя
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Сообщение Mishany »

пытаюсь штатный бортовик повторить на андройде, с климатом уже все решено и прекрасно работает, а вот с расходом не очень устраивает плавающие показания.
За предложения по расчетам благодарю, с fir и iir по роду деятельности не сталкивался, и к сожалению еще не разобрался, мое художество в топку. Как будет результат, обязательно поделюсь.
Ответить

Вернуться в «Разные вопросы по МК»