Генерация кода C в командной строке

Изучение целей

В этом примере вы будете учиться как:

  • Автоматически сгенерируйте MEX-функцию из своего кода MATLAB® и используйте эту MEX-функцию, чтобы подтвердить ваш алгоритм в MATLAB прежде, чем сгенерировать код С.

  • Автоматически сгенерируйте код С из своего кода MATLAB.

  • Задайте свойства входного параметра функции в командной строке.

  • Задайте входные параметры переменного размера при генерации кода.

  • Задайте свойства генерации кода.

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

Учебные предпосылки

Что необходимо знать

Чтобы завершить этот пример, у вас должно быть основное знакомство с программным обеспечением MATLAB.

Необходимые продукты

Чтобы завершить этот пример, необходимо установить следующие продукты:

Для получения инструкций по установке Продуктов Mathworks см. документацию по установке MATLAB для своей платформы. Если вы установили MATLAB и хотите проверить, который установлены другие Продукты Mathworks, введите ver в Окно Команды MATLAB.

Пример: Фильтр Калмана

Описание

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

Пример для этого примера использует Фильтр Калмана, чтобы оценить положение объекта, перемещающегося в двумерное пространство от серии шумных входных параметров на основе прошлых положений. Радиус-вектор имеет два компонента, x и y, указывая на его горизонтальные и вертикальные координаты.

Фильтры Калмана имеют широкий спектр приложений, включая управление, обработку сигналов и обработку изображений; радар и гидролокатор; и финансовое моделирование. Они - рекурсивные фильтры, которые оценивают состояние линейной динамической системы от ряда неполных или шумных измерений. Алгоритм Фильтра Калмана полагается на представление пространства состояний фильтров и использует набор переменных, сохраненных в векторе состояния, чтобы охарактеризовать полностью поведение системы. Это обновляет вектор состояния линейно и рекурсивно использование матрицы Грина и оценки шума процесса.

Алгоритм

В этом разделе описываются алгоритм Фильтра Калмана и реализован в версии MATLAB фильтра, предоставленного этим примером.

Алгоритм предсказывает положение перемещения, основанного на объектах на его прошлых положениях с помощью средства оценки Фильтра Калмана. Это оценивает нынешнее положение путем обновления вектора состояния Кальмана, который включает положение (x и y), скорость (Vx и Vy), и ускорение (Ax и Эйе) движущегося объекта. Вектор состояния Кальмана, x_est, является персистентной переменной.

% Initial conditions
persistent x_est p_est
if isempty(x_est)
    x_est = zeros(6, 1);
    p_est = zeros(6, 6);
end
x_est инициализируется к пустому вектору - столбцу 6x1 и обновил каждый раз, когда фильтр используется.

Фильтр Калмана использует законы движения оценить новое состояние:

X=X0+Vx.dtY=Y0+Vy.dtVx=Vx0+Ax.dtVy=Vy0+Ay. dt

Эти законы движения получены в матрице Грина A, который является матрицей, которая содержит содействующие значения x, y, Vx, Vy, Ax и Ay.

% Initialize state transition matrix
dt=1;
A=[ 1 0 dt 0 0 0;...
    0 1 0 dt 0 0;...
    0 0 1 0 dt 0;...
    0 0 0 1 0 dt;...
    0 0 0 0 1 0 ;...
    0 0 0 0 0 1 ];

Фильтрация процесса

Процесс фильтрации имеет две фазы:

  • Предсказанное состояние и ковариация

    Фильтр Калмана использует ранее предполагаемое состояние, x_est, чтобы предсказать текущее состояние, x_prd. Предсказанное состояние и ковариация вычисляются в:

    % Predicted state and covariance
    x_prd = A * x_est;
    p_prd = A * p_est * A' + Q; 

  • Оценка

    Фильтр также использует текущее измерение, z, и предсказанное состояние, x_prd, чтобы оценить более близкое приближение текущего состояния. Предполагаемое состояние и ковариация вычисляются в:

    % Measurement matrix
    H = [ 1 0 0 0 0 0; 0 1 0 0 0 0 ];
    Q = eye(6);
    R = 1000 * eye(2);
    % Estimation
    S = H * p_prd' * H' + R;
    B = H * p_prd';
    klm_gain = (S \ B)';
    
    % Estimated state and covariance
    x_est = x_prd + klm_gain * (z - H * x_prd);
    p_est = p_prd - klm_gain * H * p_prd;
    
    % Compute the estimated measurements
    y = H * x_est;

Ссылка

Haykin, Саймон. Адаптивная теория фильтра. Верхний Сэддл-Ривер, NJ: Prentice-Hall, Inc., 1996.

Файлы для примера

Об учебных файлах

Пример использует следующие файлы:

  • Пример файлы кода MATLAB для каждого шага примера.

    Всюду по этому примеру вы работаете с файлами MATLAB, которые содержат простой алгоритм Фильтра Калмана.

  • Создайте скрипты, которые вы используете, чтобы скомпилировать ваш функциональный код.

  • Тестовые файлы, что:

    • Выполните функции предварительной обработки.

    • Вызовите Фильтр Калмана.

    • Выполните функции последующей обработки.

  • MAT-файл, который содержит входные данные.

Местоположение файлов

Учебные файлы доступны в следующей папке: docroot\toolbox\coder\examples\kalman. Чтобы запустить пример, необходимо скопировать эти файлы в локальную папку. Для инструкций смотрите Копирование Файлов Локально.

Имена и описания файлов

ВводИмяОписание
Функциональный код kalman01.mБазовая реализация MATLAB скалярного Фильтра Калмана.
kalman02.mВерсия исходного алгоритма, который подходит для генерации кода.
kalman03.mФильтр Калмана, подходящий для использования с основанными на кадре и основанными на пакете входными параметрами.
Создайте скриптыbuild01.mГенерирует MEX-функцию для исходного Фильтра Калмана.
build02.mГенерирует код С для исходного Фильтра Калмана.
build03.mГенерирует код С для основанного на кадре Фильтра Калмана.
build04.mГенерирует код С для переменного размера (основанный на пакете) Фильтр Калмана.
Тестовые скриптыtest01.mТестирует скалярный Фильтр Калмана и строит график траектории.
test02.mТестовая MEX-функция для исходного Фильтра Калмана и графиков траектория.
test03.mТестирует основанный на кадре Фильтр Калмана.
test04.mТестирует переменный размер (основанный на пакете) Фильтр Калмана.
Matfileposition.matСодержит входные данные, используемые алгоритмом.
Функция plotplot_trajectory.mСтроит график траектории объекта, и Фильтр Калмана оценил положение.

Конструктивные соображения при записи КОДА MATLAB для генерации кода

При записи кода MATLAB, который вы хотите преобразовать в эффективный, автономный код C/C++, необходимо рассмотреть следующее:

  • Типы данных

    C и C++ используют статический контроль типов. Чтобы определить типы ваших переменных перед использованием, MATLAB CODER требует полного присвоения на каждую переменную.

  • Калибровка массивов

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

  • Memory

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

    С динамическим выделением памяти вы потенциально используете меньше памяти за счет времени, чтобы управлять памятью. Со статическим ЗУ вы получаете лучшую скорость, но с более высоким использованием памяти. Большая часть кода MATLAB использует в своих интересах динамические функции калибровки в MATLAB, поэтому динамическое выделение памяти обычно позволяет вам сгенерировать код из существующего кода MATLAB без большой модификации. Динамическое выделение памяти также позволяет некоторым программам компилировать, даже когда верхние границы не могут быть найдены.

  • Скорость

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

    Улучшить скорость сгенерированного кода:

    • Выберите подходящий компилятор C/C++. Компилятор по умолчанию, что предоставления MathWorks с MATLAB для Windows® 64-битные платформы не являются хорошим компилятором для производительности.

    • Рассмотрите проверки на этапе выполнения отключения.

      По умолчанию, для безопасности, код, сгенерированный для вашего кода MATLAB, содержит проверки целостности памяти и проверки скорости отклика. Обычно эти проверки приводят к большему количеству сгенерированного кода и более медленного моделирования. Отключение проверок на этапе выполнения обычно приводит к оптимизированному сгенерированному коду и более быстрому моделированию. Отключите эти проверки, только если вы проверили, что границы массивов и проверка размерности являются ненужными.

Смотрите также

Шаги примера

Копирование файлов локально

Скопируйте учебные файлы в локальную рабочую папку:

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

  2. Изменитесь на папку docroot\toolbox\coder\examples. В подсказке команды MATLAB войдите:

    cd(fullfile(docroot, 'toolbox', 'coder', 'examples')) 

  3. Скопируйте содержимое подпапки kalman к вашей локальной папке solutions, задав имя полного пути папки solutions:

    copyfile('kalman', 'solutions')
    Ваша папка solutions теперь содержит полный набор решений для примера. Если вы не хотите выполнять шаги для каждой задачи в примере, можно просмотреть решения видеть, как код должен выглядеть.

  4. Создайте локальную папку work, например, c:\coder\kalman\work.

  5. Скопируйте следующие файлы от своей папки solutions до вашей папки work.

    • kalman01.m

    • position.mat

    • Файлы типа "build" build01.m через build04.m

    • Тестовые скрипты test01.m через test04.m

    • plot_trajectory.m

    Ваша папка work теперь содержит файлы, что необходимо начать с примером.

Выполнение оригинального кода MATLAB

В этом примере вы работаете с функцией MATLAB, которая реализует алгоритм Фильтра Калмана, который предсказывает положение перемещения, основанного на объектах на его прошлых положениях. Прежде, чем сгенерировать код С для этого алгоритма, вы делаете версию MATLAB подходящей для генерации кода и генерируете MEX-функцию. Затем вы тестируете получившуюся MEX-функцию, чтобы подтвердить функциональность модифицированного кода. Когда вы работаете через пример, вы совершенствовали дизайн алгоритма, чтобы принять входные параметры переменного размера.

Во-первых, используйте скрипт test01.m, чтобы запустить исходную функцию MATLAB, чтобы видеть, как алгоритм Фильтра Калмана работает. Этот скрипт загружает входные данные и вызывает алгоритм Фильтра Калмана, чтобы оценить местоположение. Это затем вызывает функцию plot, plot_trajectory, который строит график траектории объекта, и Фильтр Калмана оценил положение.

 Содержимое test01. m

 Содержимое plot_trajectory. m

  1. Установите свою текущую папку MATLAB на папку работы, которая содержит ваши файлы для этого примера. В подсказке команды MATLAB войдите:

    cd work
    где work является именем полного пути папки работы, содержащей ваши файлы. Для получения дополнительной информации смотрите Файлы и Папки что MATLAB доступы (к MATLAB).

  2. В подсказке команды MATLAB войдите:

    test01

    Тестовый скрипт запускает и строит график траектории объекта синего цвета, и Фильтр Калмана оценил положение зеленого цвета. Первоначально, вы видите, что требуется короткое время для предполагаемого положения, чтобы сходиться с фактическим положением объекта. Затем три внезапных сдвига в положении происходят — каждый раз, когда Фильтр Калмана приспосабливает и отслеживает объект после нескольких итераций.

Подготовка вашего компилятора C

MATLAB CODER автоматически определяет местоположение и использует поддерживаемый установленный компилятор. Для текущего списка поддерживаемых компиляторов см. Поддерживаемые и Совместимые Компиляторы на веб-сайте MathWorks.

Можно использовать mex -setup, чтобы изменить компилятор по умолчанию. См. Компилятор Значения по умолчанию Изменения (MATLAB).

Факторы для того, чтобы сделать ваш код подходящим для генерации кода

Разработка для Генерации кода.  Прежде, чем сгенерировать код, необходимо подготовить код MATLAB к генерации кода. Первый шаг должен устранить неподдерживаемые построения.

Проверка Проблемы во Время проектирования.  Существует два инструмента, которые помогают вам обнаружить проблемы генерации кода во время проектирования: анализатор кода и инструмент готовности генерации кода.

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

Чтобы использовать анализатор кода, чтобы идентифицировать предупреждения и ошибки, характерные для MATLAB для генерации кода, необходимо добавить директиву %#codegen (или прагма) к файлу MATLAB. Полный список MATLAB для сообщений анализатора кода Генерации кода доступен в настройках Анализатора КОДА MATLAB. Смотрите Выполнение Отчета Анализатора кода (MATLAB).

Примечание

Анализатор кода не может обнаружить весь MATLAB для проблем генерации кода. После устранения ошибок или предупреждений, что анализатор кода обнаруживает, скомпилируйте свой код с MATLAB CODER, чтобы определить, имеет ли код другие проблемы соответствия.

Инструмент готовности генерации кода экранирует код MATLAB на функции и функции, которые не поддерживаются для генерации кода. Инструмент предоставляет отчет, который перечисляет исходные файлы, которые содержат неподдерживаемые функции и функции и индикацию относительно того, сколько работает, требуется, чтобы делать код MATLAB подходящим для генерации кода.

Можно получить доступ к инструменту готовности генерации кода следующими способами:

  • В браузере текущей папки — путем щелчка правой кнопкой по файлу MATLAB

  • В командной строке — при помощи функции coder.screener.

  • Используя приложение MATLAB CODER — после того, как вы задаете свои файлы точки входа, выполнение приложения Анализатор кода и инструмент готовности генерации кода.

Проверка Проблем во Время Генерации кода.  Можно использовать codegen, чтобы проверить на проблемы во время генерации кода. codegen проверяет, что ваш код MATLAB подходит для генерации кода.

Когда codegen обнаруживает ошибки или предупреждения, он автоматически генерирует сообщение об ошибке, которое описывает проблемы и обеспечивает ссылки на оскорбление код MATLAB. Для получения дополнительной информации см. Отчеты Генерации кода.

После генерации кода codegen генерирует MEX-функцию, которую можно использовать, чтобы протестировать реализацию в MATLAB.

Проверка Проблемы во Время выполнения.  Можно использовать codegen, чтобы сгенерировать MEX-функцию и проверку на проблемы во время выполнения. В моделировании код, сгенерированный для ваших функций MATLAB, включает проверки на этапе выполнения. Отключение проверок на этапе выполнения и внешних вызовов обычно приводит к оптимизированному сгенерированному коду и более быстрому моделированию. Вы управляете проверками на этапе выполнения с помощью объекта настройки MEX, coder.MexCodeConfig. Для получения дополнительной информации смотрите Проверки на этапе выполнения Управления.

Если вы сталкиваетесь с ошибками времени выполнения в своих функциях MATLAB, стек этапа выполнения появляется автоматически в Окне Команды MATLAB. Смотрите Ошибки времени выполнения Отладки.

Создание КОДА MATLAB, подходящего для генерации кода

Создание Кода, Подходящего для Генерации кода.  Чтобы изменить код самостоятельно, выполните упражнения в этом разделе. В противном случае откройте предоставленный файл kalman02.m в вашей подпапке solutions, чтобы видеть измененный алгоритм.

Чтобы начать процесс создания вашего кода MATLAB, подходящего для генерации кода, вы работаете с файлом kalman01.m m. Этот код является версией MATLAB скалярного Фильтра Калмана, который оценивает состояние динамической системы от ряда шумных измерений.

  1. Установите свою текущую папку MATLAB на папку работы, которая содержит ваши файлы для этого примера. В подсказке команды MATLAB войдите:

    cd work
    
    где work является именем полного пути папки работы, содержащей ваши файлы. Смотрите Файлы и Папки что MATLAB доступы (к MATLAB).

  2. Откройте kalman01.m в редакторе MATLAB. В подсказке команды MATLAB войдите:

    edit kalman01.m

    Файл открывается в редакторе MATLAB. Индикатор сообщения анализатора кода в правом верхнем углу редактора MATLAB является зеленым, который указывает, что это не обнаружило ошибки, предупреждения или возможности для улучшения кода.

  3. Включите MATLAB для проверки ошибок генерации кода путем добавления директивы %#codegen после объявления функции.

    function y = kalman01(z) %#codegen

    Индикатор сообщения анализатора кода остается зеленым, указывая, что он не обнаружил связанные с генерацией кода проблемы.

    Для получения дополнительной информации об использовании анализатора кода смотрите Выполнение Отчета Анализатора кода (MATLAB).

  4. Сохраните файл в текущей папке как kalman02.m m:

    1. Чтобы совпадать с именем функции к имени файла, поменяйте имя функции на kalman02.

      function y = kalman02(z)

    2. В редакторе MATLAB выберите Save As из меню File.

    3. Введите kalman02.m как новое имя файла.

      Примечание

      Если вы не совпадаете с именем файла к имени функции, анализатор кода предупреждает вас, что эти имена не являются тем же самым, и подсвечивает имя функции в оранжевом, чтобы указать, что это может обеспечить автоматическое исправление. Для получения дополнительной информации см. Изменяющийся Код На основе сообщений Анализатора кода (MATLAB).

    4. Нажмите Save.

     Лучшая практика — сохранение вашего кода

    Вы теперь готовы скомпилировать свой код с помощью codegen. По умолчанию codegen проверяет, что ваш код MATLAB подходит для генерации кода. Затем после компиляции codegen генерирует MEX-функцию, которую можно протестировать в MATLAB.

Генерация MEX-функции Используя codegen

Поскольку C использует статический контроль типов, codegen должен определить свойства всех переменных в файлах MATLAB во время компиляции. Поэтому необходимо задать свойства всех входных параметров функции в то же время, что и вы компилируете файл с codegen.

Чтобы скомпилировать kalman02.m, необходимо задать размер входного вектора y.

  1. Загрузите файл position.mat в свой MATLAB workspace.

    load position.mat
    Эта команда загружает матричный position, содержащий x и координаты y точек 310 на Декартовом пробеле.

  2. Получите первый вектор в матрице положения.

    z = position(1:2,1);

  3. Скомпилируйте файл kalman02.m с помощью codegen.

    codegen -report kalman02.m -args {z}

    codegen сообщает, что генерация кода завершена. По умолчанию это генерирует MEX-функцию, kalman02_mex, в текущей папке и обеспечивает ссылку на отчет генерации кода.

    Обратите внимание на то, что:

    • Опция -report дает команду codegen генерировать отчет генерации кода, который можно использовать, чтобы отладить код MATLAB и проверить, что это подходит для генерации кода.

    • Опция -args дает команду codegen компилировать файл kalman02.m с помощью класса, размера и сложности демонстрационного входного параметра z.

     Лучшая практика — генерация отчета генерации кода

Вы доказали, что пример кода Фильтра Калмана подходит для генерации кода, использующей codegen. Вы готовы начать следующую задачу в этом примере, Проверяя MEX-функцию.

Проверка MEX-функции

В этой части примера вы тестируете MEX-функцию, чтобы проверить, что это обеспечивает ту же функциональность как оригинальный код MATLAB.

Кроме того, моделирование вашего алгоритма в MATLAB прежде, чем сгенерировать код С позволяет вам обнаружить и зафиксировать ошибки времени выполнения, которые было бы намного более трудно диагностировать в сгенерированном коде C. По умолчанию MEX-функция включает проверки целостности памяти. Эти проверки выполняют границы массивов и проверку размерности и обнаруживают нарушения целостности памяти в коде, сгенерированном для функций MATLAB. Если нарушение обнаруживается, выполнение остановок MATLAB с диагностическим сообщением. Для получения дополнительной информации смотрите Проверки на этапе выполнения Управления.

Выполнение Сгенерированной MEX-функции.  Вы запускаете MEX-функцию, kalman02_mex, с помощью coder.runTest, чтобы вызвать тестовый файл, test02. Этот тестовый файл совпадает с test01, который вы использовали в Выполнении оригинального кода MATLAB за исключением того, что это вызывает kalman02 вместо kalman01.

 Содержимое test02. m

coder.runTest запускает тестовый файл и заменяет вызовы алгоритма MATLAB с вызовами MEX-функции.

coder.runTest('test02','kalman02')

coder.runTest запускает MEX-функцию, kalman02_mex, с помощью тех же входных параметров, которые вы использовали в Выполнении оригинального кода MATLAB.

Тестовый скрипт запускает и строит график траектории объекта, и Фильтр Калмана оценил положение как прежде.

Вы сгенерировали MEX-функцию для своего кода MATLAB, проверили, что это функционально эквивалентно вашему оригинальному коду MATLAB и проверенное на ошибки времени выполнения. Теперь вы готовы начать следующую задачу в этом примере, Генерируя код С Используя codegen.

Чтобы проверить, что MEX-функция функционально эквивалентна вашему оригинальному коду MATLAB, вместо того, чтобы использовать coder.runTest, можно использовать опцию -test codegen. Например:

codegen  kalman02 -args {z} -test test02 -report

Используя codegen с -test опция комбинирует генерацию MEX и тестирующий за один шаг.

 Лучшая практика — разделение испытательного стенда из функционального кода

Генерация кода С Используя codegen

В этой задаче вы используете codegen, чтобы сгенерировать код С для вашего алгоритма фильтра MATLAB. Вы затем просматриваете сгенерированный код C в генерации кода, сообщают и сравнивают сгенерированный код C с оригинальным кодом MATLAB. Вы используете предоставленный скрипт сборки build02.m, чтобы сгенерировать код.

О Скрипте Сборки.  Скрипт сборки автоматизирует серию команд MATLAB, которые вы хотите выполнить неоднократно из командной строки, экономя вам время и устранение входных ошибок.

Скрипт сборки build02.m содержит:

% Load the position vector
load position.mat
% Get the first vector in the position matrix 
% to use as an example input
z = position(1:2,1);
% Generate C code only, create a code generation report
codegen -c -d build02 -config coder.config('lib') -report kalman02.m -args {z}
Обратите внимание на то, что:

  • codegen открывает файл kalman02.m и автоматически переводит код MATLAB в исходный код C.

  • Опция -c дает команду codegen генерировать код только, не компилируя код в объектный файл. Эта опция позволяет вам выполнить итерации быстро между изменением кода MATLAB и генерацией кода С.

  • Опция -config coder.config('lib') дает команду codegen генерировать встраиваемый код С, подходящий для предназначения для статической библиотеки вместо того, чтобы генерировать MEX-функцию по умолчанию. Для получения дополнительной информации смотрите coder.config.

  • Опция -d дает команду codegen генерировать код в выходной папке build02.

  • Опция -report сообщает, что codegen, чтобы сгенерировать генерацию кода сообщает, что можно использовать, чтобы отладить код MATLAB и проверить, что это подходит для генерации кода.

  • Опция -args дает команду codegen компилировать файл kalman01.m с помощью класса, размера и сложности демонстрационного входного параметра z.

 Лучшая практика — генерация кода С только во время разработки

Как сгенерировать код С

  1. Запустите скрипт сборки.

    build02

    MATLAB обрабатывает файл типа "build" и выводит сообщение:

    Code generation successful: View report.
    codegen генерирует файлы в папке, build02.

  2. Нажмите просматривают отчет.

    Средство просмотра Отчета MATLAB CODER открывает и отображает сгенерированный код, kalman02.c c. Чтобы узнать больше об отчете, см. Отчеты Генерации кода.

Сравнение сгенерированного кода C к оригинальному коду MATLAB

Чтобы сравнить ваш сгенерированный код C с оригинальным кодом MATLAB, откройте файл C, kalman02.c и файл kalman02.m в редакторе MATLAB.

Вот некоторые важные моменты о сгенерированном коде C:

  • Функциональная подпись:

    void kalman02(const double z[2], double y[2])
    z соответствует входному параметру z в вашем коде MATLAB. Размером z является 2, который соответствует общему размеру (2 x 1) примера вводит вас используемый, когда вы скомпилировали свой код MATLAB.

  • Можно легко сравнить сгенерированный код C с оригинальным кодом MATLAB. В сгенерированном коде C:

    • Ваше имя функции неизменно.

    • Ваши комментарии сохраняются в том же положении.

    • Ваши имена переменных эквивалентны в оригинальном коде MATLAB.

      Примечание

      Если переменная в вашем коде MATLAB установлена в постоянное значение, это не появляется как переменная в сгенерированном коде C. Вместо этого сгенерированный код C содержит фактическое значение переменной.

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

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

Изменение Вашего КОДА MATLAB.  Чтобы изменить код самостоятельно, выполните упражнения в этом разделе. В противном случае откройте предоставленный файл kalman03.m в вашей подпапке решений, чтобы видеть измененный алгоритм.

Алгоритм фильтра, который вы использовали до сих пор в этом примере, принимает только один входной параметр. Можно теперь изменить алгоритм, чтобы обработать вектор, содержащий больше чем один входной параметр. Необходимо найти длину вектора и вызвать код фильтра для каждого элемента в векторе в свою очередь. Вы делаете это путем вызова алгоритма фильтра в for - цикл.

  1. Откройте kalman02.m в редакторе MATLAB.

    edit kalman02.m

  2. Добавьте for - цикл вокруг кода фильтра.

    1. Перед комментарием

      % Predicted state and covariance
      вставьте:
      for i=1:size(z,2)

    2. После

      % Compute the estimated measurements
      y = H * x_est;
      вставьте:
      end

    Ваш код фильтра должен теперь выглядеть так:

    for i=1:size(z,2)
    	% Predicted state and covariance
    	x_prd = A * x_est;
    	p_prd = A * p_est * A' + Q;
    	
    	% Estimation
    	S = H * p_prd' * H' + R;
    	B = H * p_prd';
    	klm_gain = (S \ B)';
    	
    	% Estimated state and covariance
    	x_est = x_prd + klm_gain * (z - H * x_prd);
    	p_est = p_prd - klm_gain * H * p_prd;	
    
    	% Compute the estimated measurements
    	y = H * x_est;
    end

  3. Измените строку, которая вычисляет предполагаемое состояние и ковариацию, чтобы использовать элемент ith входного параметра z.

    Изменение

    x_est = x_prd + klm_gain * (z - H * x_prd);
    к
    x_est = x_prd + klm_gain * (z(:,i) - H * x_prd);

  4. Измените строку, которая вычисляет предполагаемые измерения, чтобы добавить результат к элементу ith вывода y.

    Изменение

    y = H * x_est;
    к
    y(:,i) = H * x_est;

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

  5. Переместите указатель через красный маркер, чтобы просмотреть ошибку.

    Анализатор кода сообщает, что генерация кода требует, чтобы переменный y был полностью задан прежде, чем преобразовать его в нижний индекс.

     Почему предварительно выделяют Выходные параметры?

  6. Чтобы исправить ошибку, предварительно выделите память для вывода y, который одного размера как входной параметр z. Добавьте этот код перед for - цикл.

     % Pre-allocate output signal:
     y=zeros(size(z));

    Красный ошибочный маркер исчезает, и индикатор сообщения анализатора кода в правом верхнем краю кода становится зеленым, который указывает, что вы зафиксировали ошибки и предупреждения, обнаруженные анализатором кода.

    Для получения дополнительной информации об использовании анализатора кода смотрите Выполнение Отчета Анализатора кода (MATLAB).

  7. Поменяйте имя функции на kalman03 и сохраните файл как kalman03.m в текущей папке.

 Содержимое kalman03. m

Вы готовы начать следующую задачу в примере, Тестируя Ваш Измененный Алгоритм.

Тестирование Измененного Алгоритма.  Используйте тестовый скрипт test03.m, чтобы протестировать kalman03.m m. Этот скрипт устанавливает формат кадра на 10 и вычисляет количество кадров во входном параметре в качестве примера. Это затем вызывает Фильтр Калмана и строит график результатов для каждого кадра в свою очередь.

 Содержимое test03. m

В подсказке команды MATLAB войдите:

test03

Тестовый скрипт запускает и строит график траектории объекта, и Фильтр Калмана оценил положение как прежде.

Вы готовы начать следующую задачу в примере, Генерируя код С для Вашего Измененного Алгоритма.

Примечание

Прежде, чем сгенерировать код С, это - лучшая практика сгенерировать MEX-функцию, которую можно выполнить в среде MATLAB, чтобы протестировать алгоритм и проверку на ошибки времени выполнения.

Генерация кода С для Измененного Алгоритма.  Вы используете предоставленный скрипт сборки build03.m, чтобы сгенерировать код. Единственной разницей между этим скриптом сборки и скриптом для начальной версии фильтра является входной параметр в качестве примера, используемый при компиляции файла. build03.m указывает, что входной параметр к функции является матрицей, содержащей пять радиус-векторов 2x1, который соответствует формату кадра 10.

 Содержимое build03. m

Сгенерировать код С для kalman03:

  1. В подсказке команды MATLAB войдите:

    build03

    MATLAB обрабатывает файл типа "build" и выводит сообщение:

    Code generation successful: View report.

    Сгенерированный код C находится в work\codegen\lib\kalman03, где work является папкой, которая содержит ваши учебные файлы.

  2. Просмотреть сгенерированный код C:

    1. Нажмите просматривают отчет.

      Средство просмотра Отчета MATLAB CODER открывает и отображает сгенерированный код, kalman03.c c.

  3. Сравните сгенерированный код C с кодом С для скалярного Фильтра Калмана. Вы видите, что код почти идентичен за исключением того, что существует теперь for - цикл для обработки кадра.

    Вот некоторые важные моменты о сгенерированном коде C:

    • Функциональная подпись теперь:

      void kalman03(const double z[10], double y[10])
      Размером z и y является теперь 10, который соответствует размеру входного параметра в качестве примера z, (2x5) раньше компилировал ваш код MATLAB.

    • Фильтрация теперь происходит в for - цикл. for - цикл выполняет итерации по всем 5 входным параметрам.

      for(i = 0; i < 5; i++) 
      {       
        /*  Predicted state and covariance */ ...

Изменение фильтра, чтобы принять входной параметр Переменного Размера

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

Тестирование алгоритма с вводами Переменного Размера

Используйте тестовый скрипт test04.m, чтобы протестировать kalman03.m с входными параметрами переменного размера.

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

 Содержимое test04. m

Чтобы запустить тестовый скрипт, в подсказке команды MATLAB, войдите:

test04

Тестовый скрипт запускает и строит график траектории объекта, и Фильтр Калмана оценил положение как прежде.

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

Примечание

Прежде, чем сгенерировать код С, это - лучшая практика сгенерировать MEX-функцию, которую можно выполнить в среде MATLAB, чтобы протестировать алгоритм и проверку на ошибки времени выполнения.

Генерация кода С для входного параметра Переменного Размера

Вы используете предоставленный скрипт сборки build04.m, чтобы сгенерировать код.

О скрипте сборки

 Содержимое build04. m

Этот файл типа "build":

  • Задает верхние границы явным образом для входного параметра переменного размера с помощью объявления coder.typeof(z, [2 N], [0 1]) с опцией -args на командной строке codegen. Второй входной параметр, [2 N], задает размер, и верхние границы переменного размера вводят z. Поскольку N=100, coder.typeof указывает, что входной параметр к функции является матрицей с двумя размерностями, верхней границей для первой размерности является 2; верхней границей для второго измерения является 100. Третий входной параметр задает, какие размерности являются переменными. Значение true или каждый подразумевает, что соответствующая размерность является переменной; значение false или нуля означает, что соответствующая размерность фиксируется. Значение [0 1] указывает, что первая размерность фиксируется, второе измерение, является переменным. Для получения дополнительной информации см. Генерирующийся Код для функций MATLAB с Данными Переменного Размера.

  • Создает объект cfg настройки кода и использует его с опцией -config, чтобы задать параметры генерации кода. Для получения дополнительной информации смотрите coder.config.

Как сгенерировать код С для входного параметра Переменного Размера

  1. Используйте скрипт сборки build04, чтобы сгенерировать код С.

    build04

  2. Просмотрите сгенерированный код C как прежде.

    Вот некоторые важные моменты о сгенерированном коде C:

    • Сгенерированный код C может обработать входные параметры от 2 x 1 до 2 x 100. Функциональная подпись теперь:

      void kalman01(const double z_data[], const int z_size[2], double y_data[], int y_size[2])

      Поскольку y и z являются переменным размером, сгенерированный код содержит два данные о каждом из них: данные и фактический размер выборки. Например, для переменного z, сгенерированный код содержит:

      • Данные z_data[].

      • z_size[2], который содержит фактический размер входных данных. Эта информация отличается каждый раз, когда фильтр называется.

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

       for(i = 0; i+1 <= z_size[1]; i++) {
         /*  Predicted state and covariance */
           for(k = 0; k < 6; k++) {
             ...

Ключевые пункты, чтобы помнить

  • Поддержите свой код MATLAB, прежде чем вы измените его.

  • Выберите соглашение о присвоении имен для своих файлов и сохраняйте временные версии часто. Например, этот пример использует суффикс двух-цифры, чтобы дифференцировать различные версии алгоритма фильтра.

  • Используйте скрипты сборки, чтобы создать ваши файлы.

  • Используйте тестовые скрипты, чтобы отделиться пред - и последующая обработка от основного алгоритма.

  • Сгенерируйте MEX-функцию прежде, чем сгенерировать код С. Используйте эту MEX-функцию, чтобы моделировать ваш алгоритм в MATLAB, чтобы подтвердить его операцию и проверку на ошибки времени выполнения.

  • Используйте опцию -args, чтобы задать входные параметры в командной строке.

  • Используйте опцию -report, чтобы создать отчет генерации кода.

  • Используйте coder.typeof, чтобы задать входные параметры переменного размера.

  • Используйте объект настройки генерации кода (coder.config), чтобы задать параметры для автономной генерации кода C.

Узнать больше

Следующие шаги

К...Смотрите...

Смотрите параметры компиляции для codegen

codegen

Узнать, как интегрировать ваш код MATLAB с моделями Simulink®

Отслеживаемый объект Используя КОД MATLAB (Simulink)

Узнайте больше об использовании MATLAB для генерации кода

Программирование MATLAB для генерации кода

Используйте данные переменного размера

Генерация кода для массивов Переменного Размера

Ускорьте фиксированную точку код MATLAB

fiaccel

Интегрируйте пользовательский код С в код MATLAB и сгенерируйте автономный код

Вызовите Код C/C++ из КОДА MATLAB

Интегрируйте пользовательский код С в функцию MATLAB для генерации кода

coder.ceval

Сгенерируйте HDL из кода MATLAB

www.mathworks.com/products/slhdlcoder

Была ли эта тема полезной?