1

Тема: фильтр калмана

кто нибудь реализавал фильтр калмана в canny 7? есть ли примеры?

2

Re: фильтр калмана

awzglobal пишет:

кто нибудь реализавал фильтр калмана в canny 7? есть ли примеры?

Ладно...
Может кто подскажет как вычислить в canny 7

x = ( x * K) + (oldX * (1.0 - K));
oldX = x;

Где K-константа заранее заданная,
X-полученное из вне значение счетчика
Итог - вывод новой х из расчета формулы и предыдущего значения х... ???

3 (19-05-2016 23:02:52 отредактировано Евгений)

Re: фильтр калмана

Может так?

Вложений в сообщении

Иконка вложения 1.jpg 216.36 кб, скачивался 69 раз, последний раз 2016-05-19 

4

Re: фильтр калмана

Евгений пишет:

Может так?

Так, наверное не получится.

x = ( x * K) + (oldX * (1.0 - K));
oldX = x;

(1.0 - K), если К>=1, неположительное число.
В беззнаковой арифметике это может дать большое значение, например 1-2=65534. Тогда его умножение на oldX, при oldX>1, приведет к неправильным результатам.
Можно попробовать раскрыть скобки и привести выражение к иному виду (если я правильно прочитал исходную формулу):
x = ( x * K) + (oldX * (1.0 - K))
x = ( x * K) + (oldX - (oldX * K))
x = ( x * K) + oldX - (oldX * K)
К - за скобки и тогда:
x =  K * (x - oldX) + oldX
А с этим уже проще работать, но нужно все равно учитывать возможные отрицательные значения множителей.
Работать с отрицательными числами тоже возможно, только разрядность будет чуть меньше.
Если я верно понял задачу, сообщите - попробую набросать диаграмму.

5

Re: фильтр калмана

Денис, CANNY пишет:
Евгений пишет:

Может так?

Так, наверное не получится.

x = ( x * K) + (oldX * (1.0 - K));
oldX = x;

(1.0 - K), если К>=1, неположительное число.
В беззнаковой арифметике это может дать большое значение, например 1-2=65534. Тогда его умножение на oldX, при oldX>1, приведет к неправильным результатам.
Можно попробовать раскрыть скобки и привести выражение к иному виду (если я правильно прочитал исходную формулу):
x = ( x * K) + (oldX * (1.0 - K))
x = ( x * K) + (oldX - (oldX * K))
x = ( x * K) + oldX - (oldX * K)
К - за скобки и тогда:
x =  K * (x - oldX) + oldX
А с этим уже проще работать, но нужно все равно учитывать возможные отрицательные значения множителей.
Работать с отрицательными числами тоже возможно, только разрядность будет чуть меньше.
Если я верно понял задачу, сообщите - попробую набросать диаграмму.

K меньше единицы!
подбирать буду непосредственно получив разброс данных X...

6

Re: фильтр калмана

пусть к=0,1

7

Re: фильтр калмана

awzglobal пишет:

пусть к=0,1

При к<1 давайте представим его в виде дорби: к=1/К1, тогда:
x = (x - oldX)/К1 + oldX

При к=0,1, т.е. 1/К1=1/10:
x = (x - oldX)/10 + oldX.

В любом случае значения переменных и результатов вычислений могут быть отрицательными. Это нужно учитывать. Диапазон значений, при учете возможного знака, может быть от -32767 до +32767.

8

Re: фильтр калмана

Если принципиально хочется использовать исходную формулу

x = ( x * K) + (oldX * (1.0 - K));

то при 0<к<1 можно перейти от дробных значений к целым умножив и разделив правую часть выражений например на 100:
x = (( x * K) + (oldX * (1.0 - K))) * 100 / 100.
Раскрыв скобки получим:
x = (( x * K * 100) + (oldX * 100 * (1.0 - K))) / 100;
x = (( x * K * 100) + (oldX * ( 1.0 * 100 - K * 100))) / 100;

Все вычисления в скобках выполняются с целыми (недробными) значениями и легко реализуются в CannyLab, потом результат делится на 100, получается целое значение х - искомый результат.

Но возможно с использованием преобразования исходной формулы (как указано выше) диаграмма будет лаконичнее.

9

Re: фильтр калмана

с формулой x = (x - oldX)/10 + oldX    согласен будет короче и понятнее (исходную формулу использовать не принципиально-результат же один)

10

Re: фильтр калмана

Попробовал формулу x = (x - oldX)/К1 + oldX в симуляторе.
Есть смысл вынести коэффициент К1 за скобку:
x = ((x - oldX) + (oldX * К1)) / К1,
т.е.
x = ((x - oldX) + (oldX * 10)) / 10.
Так получается меньше проблем при х < oldX, т.е. когда уже выполняется регулирование и под действием управляющего воздействия значение счетчика начинает уменьшаться.

Попробуйте в симуляторе.

Вложений в сообщении

Иконка вложения KalmanFilter.cfd 1.17 кб, скачивался 64 раз, последний раз 2016-05-20 

KalmanFilter.png, 35.43 кб, 800 x 160
KalmanFilter.png 35.43 кб, скачивался 139 раз, последний раз 2016-05-20 

11

Re: фильтр калмана

как учесть остаток?
к примеру х=76
олд х = 73
итог 73,3... Или по данной диаграмме только целые числа используются ?

12

Re: фильтр калмана

В диаграмме могут быть использованы только целые значения.
Если требуется учесть остаток, то его можно обработать отдельно, взяв значение с выхода "Остаток" блока №5 "Деление".
Если требуется использовать значение остатка в дальнейших вычислениях, то нужно привести значения так, чтобы остаток вошел в целую часть, повысить т.о. точность. Учет того, что значение отлично от реального нужно будет выполнять уже при выдаче управляющего воздействия.

13

Re: фильтр калмана

к примеру выход целых блока 5 умножить на 10 и остаток на 10 и сложить получим целое число 733...  а 733 вполне подходящее в моем  случае число. Я правильно понял?

14

Re: фильтр калмана

Не совсем. Это число, с учетом остатка, должно будет участвовать в дальнейших вычислениях?

15

Re: фильтр калмана

Денис, CANNY пишет:

Не совсем. Это число, с учетом остатка, должно будет участвовать в дальнейших вычислениях?

нет 733 это готовый результат, который подходит для анализа...
мне всё равно 73,3 или 733 -порядок не имеет значения...
Проведу испытания,-отпишусь о результатах. Спасибо

16

Re: фильтр калмана

Хорошо. Но полученное значение Х участвует в дальнейших вычислениях. Может оказаться важным, учитывается остаток в них или нет.