Когда вы используете функции 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));