Когда вы используете функции 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 входные параметры или подмножество входных параметров должны быть заданы как константы во время компиляции. Функции с этим поведением отмечены в правом столбце таблицы Supported 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));