Этот пример показывает некоторые лучшие практики для отладки вашего кода с фиксированной точкой, когда вам нужно больше, чем из коробки преобразования.
Создайте локальную рабочую папку, например c:\kalman_filter
.
В локальной рабочей папке создайте следующие файлы.
Из галереи Apps откройте приложение Fixed-Point Converter.
На странице Select перейдите к kalman_filter.m
Файл и нажатие кнопки Open.
Нажмите Next. На странице Define Input Types перейдите к kalman_filter_tb
файл. Нажмите Autodefine Input Types.
Тестовый файл запускает и строит график входного сигнала с шумом, фильтрованного сигнала, идеального фильтрованного сигнала и различия между фильтрованным и идеальным фильтрованным сигналом.
Нажмите Next. На странице Convert to Fixed Point щелкните Analyze, чтобы собрать информацию о области значений и предложениях по типам данных с помощью настроек по умолчанию.
Щелкните Convert, чтобы применить предложенные типы данных.
Щелкните Test стрелы и установите флажок Log inputs and outputs for comparison plots. Нажмите Test. Тестовый файл запускается Fixed-Point Converter kalman_filter_tb.m
для тестирования сгенерированного кода с фиксированной точкой. Выполняются симуляции с плавающей и фиксированной точками с ошибками, рассчитанными для переменных входов и выхода.
Сгенерированные графики показывают, что текущая реализация с фиксированной точкой не дает хороших результатов.
Ошибка для переменного выхода y
чрезвычайно высок, на уровне более 282 процентов.
Логгирование любых входных параметров функции и выходных переменных, которые вы подозреваете, являются причиной численных проблем, в выходные аргументы функции верхнего уровня.
Нажмите kalman_filter
на панели Source Code, чтобы вернуться к коду с плавающей точкой.
Когда вы выбираете опцию Log inputs and outputs for comparison plots во время фазы Test, входные и выходные переменные верхней функции уровня, kalman_filter
автоматически регистрируются для графического изображения.
The kalman_filter
функция вызывает matrix_solve
функция, которая содержит вызовы нескольких других функций. Чтобы выяснить, начинаются ли числовые проблемы в matrix_solve
function, select kalman_filter
> matrix_solve
на панели Source Code.
В столбце Log Data выберите входной параметр функции и выходные переменные, которые вы хотите записать. В этом примере выберите все три, a
, b
, и x
.
Нажмите Test.
Сгенерированный график показывает большую ошибку для выходной переменной matrix_solve
функция.
На странице Convert to Fixed Point нажмите Settings.
В разделе fimath установите Rounding method значение Nearest
. Установите Overflow action равным Saturate
.
Нажмите кнопку Convert, чтобы применить новые настройки.
Щелкните стреле рядом с Test и убедитесь, что Log inputs and outputs for comparison plots выбран. Включите ведение журнала для любых входных параметров функции или выходных переменных. Нажмите Test.
Исследуйте график для выходной переменной функции верхнего уровня, y
.
Новая fimath
настройки улучшают выход, но некоторая ошибка все еще остается.
Корректировка размера слова по умолчанию улучшает точность сгенерированного проекта с фиксированной точкой.
Нажмите Settings и измените размер слова по умолчанию на 32
. Нажмите кнопку Convert, чтобы применить новые настройки.
Нажмите Test. Ошибка для переменного выхода y
накапливается.
Закройте окно Fixed-Point Converter и постройте график.
The kalman_stm
функция вычисляет матрицу переходов состояний, которая является константой. Вам не нужно преобразовывать эту функцию в фиксированную точку. Чтобы избежать ненужного квантования через расчеты, замените эту функцию на константу двойной точности. Заменяя функцию константой, матрица переходов подвергается квантованию только один раз.
Нажмите на kalman_filter
функцию на панели Source Code. Отредактируйте kalman_filter
функция. Замените вызов на kalman_stm
функция с эквивалентной двойной константой.
A = [0.992114701314478, -0.125333233564304; 0.125333233564304, 0.992114701314478];
Щелкните Analyze, чтобы обновить предложения.
Щелкните Convert, чтобы применить новые предложения.
Нажмите Test. Ошибка на графике для выходных функций y
сейчас на порядке 10-6, что приемлемо для этого проекта.