Определение входных параметров в генерации кода из MATLAB

Определение входного размера и типа

Когда вы используете функции Signal Processing Toolbox™ в генерации кода, необходимо задать размер и тип входных параметров функции. Один способ сделать это с -args параметр компиляции. Размер и тип входных параметров должны быть заданы, потому что C является статически типизированным языком. Чтобы проиллюстрировать потребность к входному define размеру и ввести, рассмотрите самый простой вызов xcorr требование двух входных параметров. Следующее демонстрирует различия в использовании xcorr в MATLAB® и в генерации кода из MATLAB.

Перекрестный коррелят два белых шумовых вектора в MATLAB:

x = randn(512,1); %real valued white noise
y = randn(512,1); %real valued white noise
[C,lags] = xcorr(x,y);
x_circ = randn(256,1)+1j*randn(256,1); %circular white noise
y_circ = randn(256,1)+1j*randn(256,1); %circular white noise
[C1,lags1] = xcorr(x_circ,y_circ);

xcorr не требует размера и типа входных параметров. xcorr получает эту информацию во времени выполнения. Контрастируйте это поведение с файлом MEX, созданным с codegen. Создайте файл myxcorr.m в папке, где вы читали и разрешение записи. Убедитесь, что эта папка находится на пути поиска файлов MATLAB. Скопируйте и вставьте следующие две строки кода в myxcorr.m и сохраните файл. Тег компилятора %#codegen должен быть включен в файл.

function [C,Lags]=myxcorr(x,y)  %#codegen
[C,Lags]=xcorr(x,y);

Введите следующую команду в командной строке MATLAB:

codegen myxcorr -args {zeros(512,1),zeros(512,1)} -o myxcorr 

Запустите файл MEX:

x = randn(512,1); %real valued white noise
y = randn(512,1); %real valued white noise
[C,Lags] = myxcorr(x,y);

Задайте два новых входных параметров x1 и y1 путем перемещения x и y.

x1 = x'; %x1 is 1x512
y1 = y'; %y1 is 1x512

Попытайтесь повторно выполнить файл MEX с транспонированными входными параметрами.

[C,Lags] = myxcorr(x1,y1); %Errors

Предыдущие ошибки в программе с сообщением ??? MATLAB expression 'x' is not of the correct size: expected [512x1] found [1x512].

Ошибка заканчивается, потому что входные параметры заданы, чтобы быть 512x1 вектор-столбцы с действительным знаком при компиляции. Для входных параметров с комплексным знаком необходимо указать, что вход комплексный оцененный. Например:

codegen myxcorr -o ComplexXcorr ...
-args {complex(zeros(512,1)),complex(zeros(512,1))}

Запустите файл MEX в командной строке MATLAB с входными параметрами с комплексным знаком правильного размера:

x_circ = randn(512,1)+1j*randn(512,1); %circular white noise
y_circ = randn(512,1)+1j*randn(512,1); %circular white noise
[C,Lags] = ComplexXcorr(x_circ,y_circ);

Попытка запустить ComplexXcorr с действительными ценными входными параметрами приводит к ошибке: ??? MATLAB expression 'x' is not of the correct complexness.

Входными параметрами должны быть Константы

Для многих поддерживаемых функций Signal Processing Toolbox входные параметры или подмножество входных параметров должны быть заданы как константы во время компиляции. Функции с этим поведением отмечены в правом столбце таблицы List of Signal Processing Toolbox Functions та Генерация кода Поддержки. Используйте coder.Type с -args параметр компиляции, или вводят константы непосредственно в исходный код.

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

Проиллюстрировать постоянное входное требование с butter, создайте файл myLowpassFilter.m в папке, где вы читали и разрешение записи. Убедитесь, что эта папка находится на пути поиска файлов MATLAB. Скопируйте и вставьте следующие строки кода в myLowpassFilter.m и сохраните файл.

function output = myLowpassFilter(input,N,Wn) %#codegen
[B,A] = butter(N,Wn,'low');
output = filter(B,A,input);

Если у вас есть программное обеспечение MATLAB Coder™, введите следующую команду в командной строке MATLAB:

codegen myLowpassFilter -o myLowpassFilter ...
-args {zeros(512,1),coder.newtype('constant',5),coder.newtype('constant',0.1)} -report

Если программа компилирует успешно, следующее сообщение появляется в командном окне: Code generation successful: View report.

Нажмите на View report. Нажмите на C code перейдите вверху слева и откройте целевой исходный файл myLowpassFilter.c.

Обратите внимание на то, что числитель и коэффициенты фильтра знаменателя включены в исходный код.

   static real_T dv0[6] = { 5.9795780369978346E-5, 0.00029897890184989173, ...
   static real_T dv1[6] = { 1.0, -3.9845431196123373, 6.4348670902758709, ...

Запустите файл MEX, не вводя константы:

output = myLowpassFilter(randn(512,1));

При попытке запустить файл MEX путем введения констант, вы получаете ошибку ??? Error using ==> myLowpassFilter 1 input required for entry-point 'myLowpassFilter'.

Можно также ввести константы в исходный код MATLAB непосредственно. Отредактируйте myLowPassFilter.m файл и замена код MATLAB с линиями:

function output = myLowpassFilter(input) %#codegen
[B,A] = butter(5,0.1,'low');
output = filter(B,A,input);

Введите следующую команду в командной строке MATLAB:

codegen myLowpassFilter -args {zeros(512,1)} -o myLowpassFilter

Запустите файл MEX путем ввода следующего в командной строке MATLAB:

output = myLowpassFilter(randn(512,1));