Отладка численных проблем при преобразовании с фиксированной точкой с помощью переменных Логгирований

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

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

  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. The kalman_filter функция вызывает matrix_solve функция, которая содержит вызовы нескольких других функций. Чтобы выяснить, начинаются ли числовые проблемы в matrix_solve function, select 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 и постройте график.

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

The 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, что приемлемо для этого проекта.