Этот пример показывает, как установить типы данных с фиксированной точкой путем оснащения кода MATLAB® для журналирования min / макс. журналирования и использования инструментов, чтобы предложить типы данных.
Функции, которые вы будете использовать:
buildInstrumentedMex
- Создайте MEX-функцию с включенным инструментированием
showInstrumentationResults
- Покажите результаты инструментирования
clearInstrumentationResults
- Очистите результаты инструментирования
Функция, которую вы преобразовываете в фиксированную точку в этом примере, является прямой формой второго порядка 2 транспонированных фильтра. Можно заменить собственной функцией вместо этого, чтобы воспроизвести, они вступают собственная работа.
function [y,z] = fi_2nd_order_df2t_filter(b,a,x,y,z) for i=1:length(x) y(i) = b(1)*x(i) + z(1); z(1) = b(2)*x(i) + z(2) - a(2) * y(i); z(2) = b(3)*x(i) - a(3) * y(i); end end
Поскольку MATLAB® функционирует, чтобы быть оснащенным, это должно подойти для генерации кода. Для получения информации о генерации кода смотрите страницу с описанием для buildInstrumentedMex
. Лицензия MATLAB® Coder™ не требуется, чтобы использовать buildInstrumentedMex
.
В этой функции переменные y
и z
используются в качестве обоих вводов и выводов. Это - важный шаблон потому что:
Можно установить тип данных y
и z
вне функции, таким образом позволив вам снова использовать функцию и для фиксированной точки и для типов с плавающей точкой.
Сгенерированный код C создаст y
и z
как ссылки в списке аргументов функции. Для получения дополнительной информации об этом шаблоне, см. документацию под Генерацией кода от MATLAB®> Руководство пользователя> Генерация Эффективного и Повторно используемого кода> Генерация Эффективного Кода> Устранение Избыточных Копий Входных параметров функции.
Запустите следующий код, чтобы скопировать тестовую функцию во временную директорию, таким образом, этот пример не вмешивается в вашу собственную работу.
tempdirObj = fidemo.fiTempdir('fi_instrumentation_fixed_point_filter_demo');
copyfile(fullfile(matlabroot,'toolbox','fixedpoint','fidemos','+fidemo',... 'fi_2nd_order_df2t_filter.m'),'.','f');
Запустите следующий код, чтобы получить текущие состояния и сбросить глобальные состояния.
FIPREF_STATE = get(fipref); reset(fipref)
В этом примере требования проекта определяют тип данных входа x
. Эти требования подписываются, 16-битные, и дробные.
N = 256; x = fi(zeros(N,1),1,16,15);
Требования проекта также определяют математику фиксированной точки для цели DSP с 40-битным аккумулятором. Этот пример использует округление пола, и перенесите переполнение, чтобы произвести эффективный сгенерированный код.
F = fimath('RoundingMethod','Floor',... 'OverflowAction','Wrap',... 'ProductMode','KeepLSB',... 'ProductWordLength',40,... 'SumMode','KeepLSB',... 'SumWordLength',40);
Следующие коэффициенты соответствуют фильтру lowpass второго порядка, созданному
[num,den] = butter(2,0.125)
Значения коэффициентов влияют на область значений значений, которые будут присвоены фильтру вывод и состояния.
num = [0.0299545822080925 0.0599091644161849 0.0299545822080925]; den = [1 -1.4542435862515900 0.5740619150839550];
Тип данных коэффициентов, определенных требованиями проекта, задается как 16-битный размер слова и масштабируется к лучшей точности. Шаблон для создания объектов fi
от постоянных коэффициентов:
1. Бросьте коэффициенты к объектам fi
с помощью раунда-к-самому-близкому по умолчанию и насыщайте настройки переполнения, который дает коэффициентам лучшую точность.
2. Присоедините fimath
с округлением пола и перенесите настройки переполнения, чтобы управлять арифметикой, которая приводит к более эффективному коду С.
b = fi(num,1,16); b.fimath = F; a = fi(den,1,16); a.fimath = F;
Твердый код коэффициенты фильтра в реализацию этого фильтра путем передачи их как констант к команде buildInstrumentedMex
.
B = coder.Constant(b); A = coder.Constant(a);
Значения коэффициентов и значения входных параметров определяют типы данных вывода y
и вектора состояния z
. Создайте их с масштабированным двойным типом данных, таким образом, их значения достигнут полного спектра, и можно идентифицировать потенциальное переполнение и предложить типы данных.
yisd = fi(zeros(N,1),1,16,15,'DataType','ScaledDouble','fimath',F); zisd = fi(zeros(2,1),1,16,15,'DataType','ScaledDouble','fimath',F);
Чтобы оснастить код MATLAB®, вы создаете MEX-функцию из функции MATLAB® использование команды buildInstrumentedMex
. Входные параметры к buildInstrumentedMex
совпадают с входными параметрами к fiaccel
, но buildInstrumentedMex
не имеет никакого fi
- ограничения объектов. Выводом buildInstrumentedMex
является MEX-функция со вставленным инструментированием, поэтому когда MEX-функция запущена, моделируемые минимальные и максимальные значения зарегистрированы для всех именованных переменных и промежуточных значений.
Используйте опцию '-o'
, чтобы назвать MEX-функцию, которая сгенерирована. Если вы не используете опцию '-o'
, то MEX-функция является именем функции MATLAB® с добавленным '_mex'
. Можно также назвать MEX-функцию тем же самым как функцию MATLAB®, но необходимо помнить, что MEX-функции более приоритетны по сравнению с функциями MATLAB® и таким образом, изменения в функции MATLAB® не запустятся, или до MEX-функция регенерирована, или до MEX-функция удалена и очищена.
buildInstrumentedMex fi_2nd_order_df2t_filter ... -o filter_scaled_double ... -args {B,A,x,yisd,zisd}
Испытательный стенд для этой системы настраивается, чтобы запустить сигналы шага и щебет. В целом испытательные стенды для систем должны покрыть широкий спектр входных сигналов.
Первый испытательный стенд использует вход щебета. Сигнал щебета является хорошим представительным входом, потому что он покрывает широкий спектр частот.
t = linspace(0,1,N); % Time vector from 0 to 1 second f1 = N/2; % Target frequency of chirp set to Nyquist xchirp = sin(pi*f1*t.^2); % Linear chirp from 0 to Fs/2 Hz in 1 second x(:) = xchirp; % Cast the chirp to fixed-point
Оснащенная MEX-функция должна быть запущена, чтобы записать минимальные и максимальные значения для той запущенной симуляции. Последующие выполнения накапливают результаты инструментирования, пока они не очищены с clearInstrumentationResults
.
Обратите внимание на то, что числитель и коэффициенты знаменателя были скомпилированы как константы, таким образом, им не предоставляют, как введено сгенерированной MEX-функции.
ychirp = filter_scaled_double(x,yisd,zisd);
График отфильтрованного сигнала щебета показывает lowpass поведение фильтра с этими конкретными коэффициентами. Через низкие частоты проходят, и ослабляются более высокие частоты.
clf plot(t,x,'c',t,ychirp,'bo-') title('Chirp') legend('Input','Scaled-double output') figure(gcf); drawnow;
Команда showInstrumentationResults
отображает отчет генерации кода с оснащенными значениями. Вход к showInstrumentationResults
является именем оснащенной MEX-функции, для которой вы хотите показать результаты.
Это - список опций к команде showInstrumentationResults
:
Тип данных Значения по умолчанию -defaultDT T
, чтобы сделать предложение для удваивается, где T
является объектом numerictype
или одной из строк {remainFloat, double, single, int8, int16, int32, int64, uint8, uint16, uint32, uint64}
. Значением по умолчанию является remainFloat
.
-nocode
не показывает код MATLAB в печатаемом отчете. Отобразите только регистрируемые таблицы переменных. Эта опция только имеет эффект в сочетании с - печатаемая опция.
-optimizeWholeNumbers
Оптимизирует размер слова переменных, журналы min симуляции которых / макс. журналы указывают, что всегда были целыми числами.
Запас прочности -percentSafetyMargin N
в течение min симуляции / макс., где N
представляет процентное значение.
-printable
Создает печатаемый отчет и открывает в системном браузере.
-proposeFL
Предлагает дробные длины для заданных размеров слова.
-proposeWL
Предлагает размеры слова для заданных дробных длин.
Потенциальное переполнение только отображено для объектов fi
с Масштабированным Двойным типом данных.
Этот конкретный проект для DSP, где размеры слова фиксируются, так используйте флаг proposeFL
, чтобы предложить дробные длины.
showInstrumentationResults filter_scaled_double -proposeFL
Наведите на выражения, или переменные в оснащенной генерации кода сообщают, чтобы видеть симуляцию минимальные и максимальные значения. В этом проекте входные параметры падают между-1 и +1, и значения всех переменных и промежуточных результатов также падают между-1 и +1. Это предполагает, что типы данных могут все быть дробными (дробная длина один бит меньше, чем размер слова). Однако это не всегда будет верно для этой функции для других видов входных параметров, и важно протестировать много типов входных параметров прежде, чем установить итоговые типы данных с фиксированной точкой.
Следующий испытательный стенд запущен с входом шага. Вход шага является хорошим представительным входом, потому что он часто используется, чтобы охарактеризовать поведение системы.
xstep = [ones(N/2,1);-ones(N/2,1)]; x(:) = xstep;
Результаты инструментирования накапливаются, пока они не очищены с clearInstrumentationResults
.
ystep = filter_scaled_double(x,yisd,zisd); clf plot(t,x,'c',t,ystep,'bo-') title('Step') legend('Input','Scaled-double output') figure(gcf); drawnow;
Даже при том, что входные параметры для шага и входные параметры щебета являются оба полным спектром, как обозначено x
в 100-процентной текущей области значений в оснащенном отчете генерации кода, входное переполнение причин шага, в то время как вход щебета не сделал. Это - рисунок необходимости иметь много различных входных параметров для вашего испытательного стенда. В целях этого примера использовались только два входных параметров, но действительные испытательные стенды должны быть более полными.
showInstrumentationResults filter_scaled_double -proposeFL
Чтобы предотвратить переполнение, установите предложенные свойства фиксированной точки на основе предложенных дробных длин 14 битов для y
и z
из оснащенного отчета генерации кода.
В этой точке в рабочем процессе вы используете истинные фиксированные точки (в противоположность масштабированным двойным типам, которые использовались на более раннем шаге определения типов данных).
yi = fi(zeros(N,1),1,16,14,'fimath',F); zi = fi(zeros(2,1),1,16,14,'fimath',F);
Создайте оснащенную MEX-функцию фиксированной точки при помощи входных параметров фиксированной точки и команды buildInstrumentedMex
.
buildInstrumentedMex fi_2nd_order_df2t_filter ... -o filter_fixed_point ... -args {B,A,x,yi,zi}
После преобразования в фиксированную точку запустите испытательный стенд снова с входными параметрами фиксированной точки, чтобы подтвердить проект.
Запустите алгоритм фиксированной точки с входом щебета, чтобы подтвердить проект.
x(:) = xchirp; [y,z] = filter_fixed_point(x,yi,zi); [ysd,zsd] = filter_scaled_double(x,yisd,zisd); err = double(y) - double(ysd);
Сравните фиксированную точку выходные параметры с масштабированными дважды выходными параметрами, чтобы проверить, что они соответствуют вашим критериям расчета.
clf subplot(211);plot(t,x,'c',t,ysd,'bo-',t,y,'mx') xlabel('Time (s)'); ylabel('Amplitude') legend('Input','Scaled-double output','Fixed-point output'); title('Fixed-Point Chirp') subplot(212);plot(t,err,'r');title('Error');xlabel('t'); ylabel('err'); figure(gcf); drawnow;
Осмотрите переменные и промежуточные результаты гарантировать, что значения min / макс. значения в области значений.
showInstrumentationResults filter_fixed_point
Запустите алгоритм фиксированной точки с входом шага, чтобы подтвердить проект.
Запустите следующий код, чтобы очистить предыдущие результаты инструментирования видеть только эффекты выполнения входа шага.
clearInstrumentationResults filter_fixed_point
Запуститесь вход шага через фиксированную точку фильтруют и соответствуют выводу масштабированного двойного фильтра.
x(:) = xstep; [y,z] = filter_fixed_point(x,yi,zi); [ysd,zsd] = filter_scaled_double(x,yisd,zisd); err = double(y) - double(ysd);
Постройте фиксированную точку выходные параметры против масштабированных дважды выходных параметров, чтобы проверить, что они соответствуют вашим критериям расчета.
clf subplot(211);plot(t,x,'c',t,ysd,'bo-',t,y,'mx') title('Fixed-Point Step'); legend('Input','Scaled-double output','Fixed-point output') subplot(212);plot(t,err,'r');title('Error');xlabel('t'); ylabel('err'); figure(gcf); drawnow;
Осмотрите переменные и промежуточные результаты гарантировать, что значения min / макс. значения в области значений.
showInstrumentationResults filter_fixed_point
Запустите следующий код, чтобы восстановить глобальные состояния.
fipref(FIPREF_STATE); clearInstrumentationResults filter_fixed_point clearInstrumentationResults filter_scaled_double clear fi_2nd_order_df2t_filter_fixed_instrumented clear fi_2nd_order_df2t_filter_float_instrumented
Запустите следующий код, чтобы удалить временную директорию.
tempdirObj.cleanUp;
%#ok<*ASGLU>