Отладьте числовые проблемы в преобразовании фиксированной точки Используя переменное логгирование

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

Необходимые условия

  1. Создайте локальную рабочую папку, например, c:\kalman_filter.

  2. В вашей локальной рабочей папке создайте следующие файлы.

    •  kalman_filter функция

    •  kalman_stm функция

    •  matrix_solve функция

    •  lu_replacement функция

    •  forward_substitute функция

    •  back_substitute функция

    •  divide_no_zero функция

    •  kalman_filter_tb тестовый файл

Преобразуйте в фиксированную точку Используя настройку по умолчанию

  1. Из галереи Apps откройте приложение Fixed-Point Converter.

  2. На странице Select просмотрите к kalman_filter.m файл и нажимает Open.

  3. Нажмите Next. На странице Define Input Types просмотрите к kalman_filter_tb файл. Нажмите Autodefine Input Types.

    Тестовый файл запускает и строит входной сигнал с шумом, отфильтрованный сигнал, идеал отфильтрованный сигнал и различие между отфильтрованным и идеал отфильтрованный сигнал.

  4. Нажмите Next. На странице Convert to Fixed Point нажмите Analyze, чтобы собрать информацию области значений и предложения по типу данных с помощью настроек по умолчанию.

  5. Нажмите Convert, чтобы применить предложенные типы данных.

  6. Кликните по стреле Test и установите флажок Log inputs and outputs for comparison plots. Нажмите Test. Fixed-Point Converter запускает тестовый файл kalman_filter_tb.m протестировать сгенерированную фиксированную точку. Симуляции и фиксированной точки с плавающей точкой запущены с ошибками, вычисленными для переменных ввода и вывода.

    Сгенерированные графики показывают, что текущая реализация фиксированной точки не приводит к хорошим результатам.

    Ошибка для выходной переменной y чрезвычайно высоко, в более чем 282 процентах.

Определите где числовые порожденные проблемы

Регистрируйте любой входной параметр функции и выходные переменные, которые вы подозреваете, причина числовых проблем к выходным аргументам функции верхнего уровня.

  1. Нажмите kalman_filter в Source Code разделяют на области, чтобы возвратиться к коду с плавающей точкой.

    Когда вы выбираете опцию Log inputs and outputs for comparison plots во время фазы Test, переменных ввода и вывода функции верхнего уровня, kalman_filter автоматически регистрируются для графического вывода.

  2. kalman_filter вызовы функции matrix_solve функция, которая содержит вызовы нескольких других функций. Заниматься расследованиями, происходят ли числовые проблемы в matrix_solve функционируйте, выберите kalman_filter > matrix_solve в панели Source Code.

    В столбце Log Data выберите входной параметр функции и выходные переменные, которые вы хотите регистрировать. В этом примере выберите все три, aB, и x.

  3. Нажмите Test.

    Сгенерированный график показывает большую ошибку для выходной переменной matrix_solve функция.

Настройте fimath Настройки

  1. На странице Convert to Fixed Point нажмите Settings.

    Под fimath, набор Rounding method к Nearest. Установите Overflow action на Saturate.

  2. Нажмите Convert, чтобы применить новые настройки.

  3. Кликните по стреле рядом с Test и гарантируйте, что Log inputs and outputs for comparison plots выбран. Позвольте регистрировать для любого входного параметра функции или выходных переменных. Нажмите Test.

    Исследуйте график на функциональную выходную переменную верхнего уровня, y.

    Новый fimath настройки улучшают выход, но некоторая ошибка все еще остается.

Настройте настройки размера слова

Корректировка размера слова по умолчанию улучшает точность сгенерированного проекта фиксированной точки.

  1. Нажмите Settings и измените размер слова по умолчанию в 32. Нажмите Convert, чтобы применить новые настройки.

  2. Нажмите Test. Ошибка для выходной переменной y накапливается.

  3. Закройте Fixed-Point Converter и постройте окно.

Замените постоянные функции

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

  1. Нажмите kalman_filter функция в панели Source Code. Отредактируйте kalman_filter функция. Замените вызов kalman_stm функция с эквивалентной двойной константой.

    A = [0.992114701314478, -0.125333233564304; 0.125333233564304, 0.992114701314478];
    Сохраните изменения.

  2. Нажмите Analyze, чтобы обновить предложения.

  3. Нажмите Convert, чтобы применить новые предложения.

  4. Нажмите Test. Ошибка на графике для функций выход y находится теперь порядка 10-6, который приемлем для этого проекта.