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

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

Когда вы используете функции Signal Processing Toolbox™ для генерации кода, вы должны задать размер и тип входных параметров функции. Один из способов сделать это с -args опция компиляции. Размер и тип входов должны быть определены, потому что C является статически типизированным языком. Чтобы проиллюстрировать необходимость определения размера и типа входа, рассмотрите самый простой вызов 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 (MATLAB Coder). Создайте файл 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, входы или подмножество входов должны быть заданы как константы во время компиляции. Использовать coder.Type с -args опция компиляции или введите константы непосредственно в исходный код.

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

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

function output = myLowpassFilter(input,N,Wn) %#codegen
[B,A] = ellip(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. Исходный код включает коэффициенты фильтра числителя и знаменателя.

Запустите файл 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] = ellip(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));