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

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

Предпосылки

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

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

    •  Функция kalman_filter

    •  Функция kalman_stm

    •  Функция matrix_solve

    •  Функция lu_replacement

    •  Функция forward_substitute

    •  Функция back_substitute

    •  Функция divide_no_zero

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

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

  1. Из галереи приложений откройте приложение 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 выберите входной параметр функции и выходные переменные, которые вы хотите регистрировать. В этом примере выберите все три, a, b и 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, который приемлем для этого проекта.