Тема: фильтр калмана
кто нибудь реализавал фильтр калмана в canny 7? есть ли примеры?
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
CANNY forum → Программируемые контроллеры CANNY 7.x (7, 7.2 duo, alfa, gamma, MGX, 7.3 echo) → фильтр калмана
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
кто нибудь реализавал фильтр калмана в canny 7? есть ли примеры?
кто нибудь реализавал фильтр калмана в canny 7? есть ли примеры?
Ладно...
Может кто подскажет как вычислить в canny 7
x = ( x * K) + (oldX * (1.0 - K));
oldX = x;
Где K-константа заранее заданная,
X-полученное из вне значение счетчика
Итог - вывод новой х из расчета формулы и предыдущего значения х... ???
Может так?
Может так?
Так, наверное не получится.
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
А с этим уже проще работать, но нужно все равно учитывать возможные отрицательные значения множителей.
Работать с отрицательными числами тоже возможно, только разрядность будет чуть меньше.
Если я верно понял задачу, сообщите - попробую набросать диаграмму.
Евгений пишет:Может так?
Так, наверное не получится.
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...
пусть к=0,1
пусть к=0,1
При к<1 давайте представим его в виде дорби: к=1/К1, тогда:
x = (x - oldX)/К1 + oldX
При к=0,1, т.е. 1/К1=1/10:
x = (x - oldX)/10 + oldX.
В любом случае значения переменных и результатов вычислений могут быть отрицательными. Это нужно учитывать. Диапазон значений, при учете возможного знака, может быть от -32767 до +32767.
Если принципиально хочется использовать исходную формулу
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, получается целое значение х - искомый результат.
Но возможно с использованием преобразования исходной формулы (как указано выше) диаграмма будет лаконичнее.
с формулой x = (x - oldX)/10 + oldX согласен будет короче и понятнее (исходную формулу использовать не принципиально-результат же один)
Попробовал формулу x = (x - oldX)/К1 + oldX в симуляторе.
Есть смысл вынести коэффициент К1 за скобку:
x = ((x - oldX) + (oldX * К1)) / К1,
т.е.
x = ((x - oldX) + (oldX * 10)) / 10.
Так получается меньше проблем при х < oldX, т.е. когда уже выполняется регулирование и под действием управляющего воздействия значение счетчика начинает уменьшаться.
Попробуйте в симуляторе.
как учесть остаток?
к примеру х=76
олд х = 73
итог 73,3... Или по данной диаграмме только целые числа используются ?
В диаграмме могут быть использованы только целые значения.
Если требуется учесть остаток, то его можно обработать отдельно, взяв значение с выхода "Остаток" блока №5 "Деление".
Если требуется использовать значение остатка в дальнейших вычислениях, то нужно привести значения так, чтобы остаток вошел в целую часть, повысить т.о. точность. Учет того, что значение отлично от реального нужно будет выполнять уже при выдаче управляющего воздействия.
к примеру выход целых блока 5 умножить на 10 и остаток на 10 и сложить получим целое число 733... а 733 вполне подходящее в моем случае число. Я правильно понял?
Не совсем. Это число, с учетом остатка, должно будет участвовать в дальнейших вычислениях?
Не совсем. Это число, с учетом остатка, должно будет участвовать в дальнейших вычислениях?
нет 733 это готовый результат, который подходит для анализа...
мне всё равно 73,3 или 733 -порядок не имеет значения...
Проведу испытания,-отпишусь о результатах. Спасибо
Хорошо. Но полученное значение Х участвует в дальнейших вычислениях. Может оказаться важным, учитывается остаток в них или нет.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться