exponenta event banner

Указание входных данных при создании кода из MATLAB

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

При использовании функций 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). Создание файла 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.

Входами должны быть константы

Для ряда поддерживаемых функций панели инструментов обработки сигналов входы или подмножество входов должны быть указаны как константы во время компиляции. Использовать coder.Type с -args или введите константы непосредственно в исходном коде.

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

Для иллюстрации требования к постоянному вводу с помощью 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));