реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Фильтр второго порядка
Yevdokimenko
сообщение Jan 8 2013, 19:50
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 23-05-12
Пользователь №: 71 972



Добрый день.
Я не знаю в этом ли разделе должна быть эта тема, но всё же...
В ходе разработки устройства, одной из функций которого является определение ускорения, столкнулся с проблемой вычисления оного.
Итак, на автомобиле (на ступице колеса) установлен зубчатый венец, который вращается "вместе" с колесом.
Этот венец своими зубьям создает "наводки" на датчик, который "генерирует" сигнал с частотой, пропорциональной частоте вращения колеса (скорости движения).
Если венец и возможно изготовить в промышленных масштабах с хорошей точностью (но все же неидеально), то колесо как таковое не является абсолютно упругим телом, и имеет переменный радиус обката, что приводит к переменной частоте сигнала даже при условии равномерного движения (с постоянной скоростью).
Судя по проведенным тестам разброс частоты относительно некой средней подчиняется нормальному закону распределения случайной величины.
В случае же неравномерного (и даже не равноускоренного) движения разброс частоты становится еще большим.
Если для вычисления скорости (первой производной) такая ситуация вполне допустима, то при вычислении ускорения (второй производной) расчетный параметр ОЧЕНЬ зашумлен.
Посоветуйте, пожалуйста, с какой стороны подойти к решению данной задачи?
Пока что в голову пришла лишь мысль об аппроксимации МНК (методом наименьших квадратов) для нахождения линейной функции по последним N наблюдениям... Наклон данной функции и будет искомым ускорением.
Достаточно ли функции линейного вида, либо нужны функции больших порядков (квадратичные и т.п.)?
Go to the top of the page
 
+Quote Post
diwil
сообщение Jan 9 2013, 07:01
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 366
Регистрация: 5-09-06
Из: Санкт-Петербург
Пользователь №: 20 107



Цитата(Yevdokimenko @ Jan 8 2013, 23:50) *
...
В случае же неравномерного (и даже не равноускоренного) движения разброс частоты становится еще большим.
Если для вычисления скорости (первой производной) такая ситуация вполне допустима, то при вычислении ускорения (второй производной) расчетный параметр ОЧЕНЬ зашумлен.
Посоветуйте, пожалуйста, с какой стороны подойти к решению данной задачи?
Пока что в голову пришла лишь мысль об аппроксимации МНК (методом наименьших квадратов) для нахождения линейной функции по последним N наблюдениям... Наклон данной функции и будет искомым ускорением.
Достаточно ли функции линейного вида, либо нужны функции больших порядков (квадратичные и т.п.)?


Аналогичная задача была несколько лет назад. Только был датчик положения (расстояния).
В принципе, если задержка не важна, то приемлемые результаты дает фильтр кальмана.
Мы же остановились на smoothing spline. Но тут сложно подобрать параметры сглаживания.

И то и другое есть разновидность МНК.
И то и другое крайне неудобно реализовывать в дробной (целочисленной) арифметике.
Go to the top of the page
 
+Quote Post
Yevdokimenko
сообщение Jan 9 2013, 07:37
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 23-05-12
Пользователь №: 71 972



Цитата(diwil @ Jan 9 2013, 10:01) *
И то и другое есть разновидность МНК.
И то и другое крайне неудобно реализовывать в дробной (целочисленной) арифметике.
Линейная аппроксимация некоторого набора данных - довольно просто реализуется.
Каждый раз суммировать заданное кол-во данных по точкам наблюдения необязательно, что сводит определение каждой суммы формулы расчета параметра a к простым матоперациям, где самое тяжелое - одно деление.
Если я где-то неправ - поправьте меня. laughing.gif
Go to the top of the page
 
+Quote Post
Xenia
сообщение Jan 9 2013, 13:04
Сообщение #4


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(Yevdokimenko @ Jan 8 2013, 23:50) *
Достаточно ли функции линейного вида, либо нужны функции больших порядков (квадратичные и т.п.)?


Если вам нужна только 1-ая производная, но простейшей функцией для сглаживания/усреднения будет линейный полином. Однако он не годится, если требуется оценка 2-ой производной, т.к. прямая линия повсюду имеет 2-ую производную равную нулю. Поэтому во втором случае требуется полином не ниже квадратичного (параболы).

Добавлю, что грузить на микроконтроллер все эти жуткие вычиления не надо - достаточно провести предварительные вычисления необходимых весовых коэффициентов, которые и зашить в программу МК в готовом виде.

Все коэффициенты полинома, вычисляемого с помощью МНК, можно свести к виду скалярного произведения вектора/массива коэффициентов (это другие коэффициенты - не полиномиальные, а весовые на каждую точку данных) на массив сырых данных в окрестности той точки, для которой вычисляется производная. Например, если среднее значение производной вам нужно вычислить в точке i, по 7-ми точкам (слева и справа по 3 точки), то это будут два массива по 7 элементов в каждом. В первом - предварительно вычисленные коэффициенты, а вот втором - сырые измерения от точки с индексом i-3, до точки с индксом i+3.

Вычисления 1-ой, 2-ой и старших производных отличаются ТОЛЬКО заменой весовых коффициентов! Причем их всегда можно посчитать заранее на персональном компьютере с помошью мат-пакетов. Перекладывать эту работу на МК не стоит. Нужно только определиться с тем, какую выбрать длину усредняемой области и степень полинома. Если у вас колесо крутится, и хочется усреднить до целого оборота, то длину отрезка вероятно лучше брать равной числу оцифрованных точек за полный оборот колеса. Но от этого вектора станут длиннее, и МК придется дольше считать сумму произведений.
Go to the top of the page
 
+Quote Post
Xenia
сообщение Jan 9 2013, 15:37
Сообщение #5


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Предположим, что мы пока остановились на N=7 (± 3 точки от центральной) и сглаживающем полиноме 2-ой степени (параболе). Тогда искомое уравнение для МНК в матричном виде будет иметь вид:
Y = X * C
где:
Y - семь сырых отсчетов в окрестности точки, в которой ищется производная (Y[i-3],Y[i-2],Y[i-1],Y[i],Y[i+1],Y[i+2],Y[i+3]).
С - коэффициенты квадратичного полинома y = с2*x^2 + с1*x + с0, напихнутые в массив/вектор C[3].
X - матрица степеней индексов.
Здесь вектор C - искомое, вектор Y - заданное, а матрицу X придется построить:
1-ый столбец X - все 7 индексов в нулевой степени, т.е. все единички:
1 1 1 1 1 1 1
2-ый столбец X - все 7 индексов в 1-ой степени, т.е. такие, как они есть:
-3 -2 -1 0 +1 +2 +3
(здесь можно нумеровать и в порядке "1 2 3 4 5 6 7" или "0 1 2 3 4 5 6", но я предпочитаю именно этот вариант, надеясь на симметрию в будущем, позволяющую уменьшить число умножений).
3-ый столбец X - все 7 индексов в 2-ой степени, т.е. квадраты предыдущего столбца:
9 4 1 0 1 4 9
Если у вас квадратичный полином, то это всё, а если был бы кубический, то пришлось бы еще добавить столбец из кубов.
Итого получаем матрицу X в виде:
Код
1    -3     9
1    -2     4
1    -1     1
1     0     0
1     1     1
1     2     4
1     3     9

А дальше делаем этой матрице операцию pinv. Если в матричной алгебре волокёте, то и без меня знаете, что это такое, а если нет, то и разбираться в том не будем, т.к. большой необходимости в том нет:
Код
pinv(X)
-0.0952    0.1429    0.2857    0.3333    0.2857    0.1429   -0.0952
-0.1071   -0.0714   -0.0357    0.0000    0.0357    0.0714    0.1071
+0.0595   -0.0000   -0.0357   -0.0476   -0.0357    0.0000    0.0595

А дальше можно и на МК считать, если эти весовые коэффициентики в него зашить. Коэффициенты полинома получатся такими
c0 = -0.0952*Y[i-3]+0.1429*Y[i-2]+0.2857*Y[i-1]+0.3333*Y[i]+0.2857*Y[i+1]+0.1429*Y[i+2]-0.0952*Y[i+3]
с1 = -0.1071*Y[i-3]-0.0714*Y[i-2]-0.0357*Y[i-1]+0.0000*Y[i]+0.0357*Y[i+1]+0.0714*Y[i+2]+0.1071*Y[i+3]
с2 = +0.0595*Y[i-3]-0.0000*Y[i-2]-0.0357*Y[i-1]-0.0476*Y[i]-0.0357*Y[i+1]+0.0000*Y[i+2]+0.0595*Y[i+3]
Т.е. получили все 3 коэффициента квадратичного полинома y = с2*x^2 + с1*x + с0

Впрочем, считать еще рано! Т.к. не все коэффициенты нам понадобятся.
У полинома
y = с2*x^2 + с1*x + с0
1-ая производная такая:
y' = 2*с2*x^2 + с1
А 2-ая производная такая:
y" = 2*с2
Отсюда следует, что для вычисления 2-ой производной коэффициенты полинома c1 и c0 не нужны, а потому и вычислять их не надо. А чтобы не множить каждый раз на 2, можно сразу умножить на 2 весовые коэффициенты третьей строки:
y"[i] = 2*С2 = +0.1190*Y[i-3]-0.0000*Y[i-2]-0.0714*Y[i-1]-0.0952*Y[i]-0.0714*Y[i+1]+0.0000*Y[i+2]+0.1190*Y[i+3]
- это и есть искомая 2-ая производная, вычисляемая для средней точки в ряду из 7-ми последовательных.

Но это еще не всё, т.к. теперь можно извлечь профит из симметрии в коэффициентах, вынося за общую скобку!
y"[i] = +0.1190*(Y[i-3]+Y[i+3])-0.0000*(Y[i-2]+Y[i+2])-0.0714*(Y[i-1]+Y[i+1])-0.0952*Y[i]
от этого умножений стало почти в два раза меньше.
Теперь выкидываем члены с нулевым коэффициентом:
y"[i] = +0.1190*(Y[i-3]+Y[i+3])-0.0714*(Y[i-1]+Y[i+1])-0.0952*Y[i]
Видите, как хорошо стало? sm.gif

Но..., можно сделать еще лучше для МК, если заменить вычисления с плавающей точкой на целочисленные. Например, умножить все коэффициенты на круглую степень числа 2 (скажем на 256), округлить, в у результата отрасывать младший байт, компенсируя умножение. Приблизительно получим:
y"[i]*256 = 15*(Y[i-3]+Y[i+3])-9*(Y[i-1]+Y[i+1])-12*Y[i]
МК от такой постановки задачи, несомненно, возрадуется sm.gif. Хотя 256, конечно, маловато.
Go to the top of the page
 
+Quote Post
Yevdokimenko
сообщение Jan 11 2013, 17:55
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 23-05-12
Пользователь №: 71 972



Спасибо, суть расчета я если честно не понял (как и почему), со времен ВУЗа много времени прошло, но конечный результат ясен.
Мне нужна производная от скорости (ускорение), т.е. первая производная.
В Вашем описании нет упоминаний о наборе Х-координат (шаг непостоянный), он не нужен ни при каких условиях для данного метода?
Go to the top of the page
 
+Quote Post
Xenia
сообщение Jan 11 2013, 18:15
Сообщение #7


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(Yevdokimenko @ Jan 11 2013, 21:55) *
Спасибо, суть расчета я если честно не понял (как и почему), со времен ВУЗа много времени прошло, но конечный результат ясен.

А меня в ВУЗе вообще этому не учили. Подробно ответила, поскольку у меня самой была похожая практическая задача, ради решения которой я всю эту информацию нарыла.

Цитата(Yevdokimenko @ Jan 11 2013, 21:55) *
Мне нужна производная от скорости (ускорение), т.е. первая производная.
В Вашем описании нет упоминаний о наборе Х-координат (шаг непостоянный), он не нужен ни при каких условиях для данного метода?

У меня в качестве X-координаты используется индекс массива, т.к. предполагается, что измерения в нем следуют с постоянным временным интервалом.

В принципе тот же метод годится и для более общего случая, если при построении матрицы X использовать вместо индексов время или временные метки. Однако переменный шаг означает, что матрица X меняется от точки к точке, а это на корню убивает эффективность, т.к. тогда для каждой точки пришлось бы не только строить матрицу X целиком, но и производить ее псевдообращение. Полагаю, что МК с такой задачей не справится. Поэтому было бы много полезнее обеспечить равномерную оцифровку с постоянным периодом.
Go to the top of the page
 
+Quote Post
Yevdokimenko
сообщение Jan 11 2013, 19:21
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 23-05-12
Пользователь №: 71 972



Равномерный шаг нагадит в точность, а это то, о чего я пытаюсь убежать разными способами.
Постоянный шаг Х невозможен, т.к. интервалы между событиями зависят от вагона факторов, один из которых - частота вращения колеса...

Данная формула (вычисление a, b - ненужно), по моим подсчетам, будет эквивалентна 15-20 простым матоперациям:

Если не ошибаюсь, то это около 20мкс+-.
Судя по всему она вполне подходит для заданного набора точек (X;Y) - т.е. переменный шаг учтен.
Посмотрим что из этого выйдет если ускорение буду считать пусть раз 100 (или 200/500) в секунду... rolleyes.gif
Благодарю за участие!
Go to the top of the page
 
+Quote Post
Xenia
сообщение Jan 11 2013, 20:20
Сообщение #9


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(Yevdokimenko @ Jan 11 2013, 23:21) *
Данная формула (вычисление a, b - ненужно), по моим подсчетам, будет эквивалентна 15-20 простым матоперациям:

Если не ошибаюсь, то это около 20мкс+-.


Ваш оптимизм безоснователен sm.gif - основные затраты времени происходят не там, где нужно вычесть/поделить друг на друга суммы, а чтобы те суммы набрать! Задайтесь реальным n и посмотрите, сколько у вас получится операций сложения+умножения при вычислении всех этих сумм.
Go to the top of the page
 
+Quote Post
Yevdokimenko
сообщение Jan 11 2013, 21:43
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 23-05-12
Пользователь №: 71 972



Цитата(Xenia @ Jan 12 2013, 00:20) *
Ваш оптимизм безоснователен sm.gif - основные затраты времени происходят не там, где нужно вычесть/поделить друг на друга суммы, а чтобы те суммы набрать! Задайтесь реальным n и посмотрите, сколько у вас получится операций сложения+умножения при вычислении всех этих сумм.
Я указал количество операций с учетом накопления ЛЮБОГО количества наблюдений (N).
От N, при наличии некоторой области памяти, длительность расчетов НИКАК не зависит. wink.gif
Go to the top of the page
 
+Quote Post
Guest_TSerg_*
сообщение Jan 12 2013, 09:48
Сообщение #11





Guests






Откуда Вы взяли пары x,y?
У Вас измеряется лишь дельта времени между сигналами, а значит имеется одномерный поток данных dT[i].
Причем это уже формально есть угловая скорость вращения и для получения ускорения достаточно первой производной, ну и расстояние считается интегрированием ( тут я думаю, без проблем ).

Цитата(Yevdokimenko @ Jan 12 2013, 01:43) *
От N, при наличии некоторой области памяти, длительность расчетов НИКАК не зависит. wink.gif


Длительнось любых расчетов над элементами массива определяется длиной массива, если в расчет вовлечены все его элементы - это аксиома.

Go to the top of the page
 
+Quote Post
_Anatoliy
сообщение Jan 12 2013, 10:53
Сообщение #12


Утомлённый солнцем
******

Группа: Свой
Сообщений: 2 646
Регистрация: 15-07-06
Из: г.Донецк ДНР
Пользователь №: 18 832



Цитата(TSerg @ Jan 12 2013, 11:48) *
Длительнось любых расчетов над элементами массива определяется длиной массива, если в расчет вовлечены все его элементы - это аксиома.

Например в фильтре скользящего среднего количество вычислений не зависит от длины фильтра wink.gif
Go to the top of the page
 
+Quote Post
Yevdokimenko
сообщение Jan 12 2013, 14:08
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 23-05-12
Пользователь №: 71 972



Цитата(_Anatoliy @ Jan 12 2013, 14:53) *
Например в фильтре скользящего среднего количество вычислений не зависит от длины фильтра wink.gif
Не только скользящее среднее...
Код
// усреднение значения по 4 последним значениям
int32_t GetAverageSpeedPL4(int32_t NewValue)
{
  static int32_t Value[4];
  static int32_t Sum;
  static uint8_t Index;
  Sum+=(NewValue-Value[Index]);
  Value[Index]=NewValue;
  ++Index&=3;
  return I32shr(Sum,2);
}

I32shr - побитовый сдвиг вправо на заданное кол-во разрядов с учетом знака.
Go to the top of the page
 
+Quote Post
Guest_TSerg_*
сообщение Jan 12 2013, 14:16
Сообщение #14





Guests






Цитата(_Anatoliy @ Jan 12 2013, 14:53) *
Например в фильтре скользящего среднего количество вычислений не зависит от длины фильтра wink.gif


Внимательно еще раз прочитайте, что написано в моем посте - "если вовлечены все элементы.."
В потоковой обработке данных с одинаковым весом, когда используется уже накопленное значение, вовлечены только три элемента: первое, последнее и сумма.

>Не только скользящее среднее...
То, что Вы привели и есть скользящее среднее.

В общем же случае, взвешенная обработка массива ( нерекурсивный фильтр ) требует участия всех элементов.

P.S.
Вы не на то обратили внимание в моих словахsm.gif
Я бы рекомендовал Вам поэкпериментировать с нерекурсивным фильтром выполняющим операцию дифференцирования.
Go to the top of the page
 
+Quote Post
Yevdokimenko
сообщение Jan 12 2013, 18:14
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 23-05-12
Пользователь №: 71 972



Цитата(TSerg @ Jan 12 2013, 18:16) *
То, что Вы привели и есть скользящее среднее.
Всегда думал что скользящее это:
Новое=Старое*(к-1)/к + Новое*к (с вышеизложенным это разные способы как по реализации, так и по итоговой точности).
Цитата(TSerg @ Jan 12 2013, 18:16) *
Я бы рекомендовал Вам поэкпериментировать с нерекурсивным фильтром выполняющим операцию дифференцирования.
Можно примером, если не затруднит.

Сообщение отредактировал Yevdokimenko - Jan 12 2013, 18:15
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 03:55
Рейтинг@Mail.ru


Страница сгенерированна за 0.01885 секунд с 7
ELECTRONIX ©2004-2016