В этом примере показано, как установить типы данных с фиксированной точкой путем оснащения кода 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>