Установите Типы данных Используя Инструментирование Min/Max

В этом примере показано, как установить типы данных с фиксированной точкой путем оснащения кода MATLAB® для логгирования min / макс. логгирования и использования инструментов, чтобы предложить типы данных.

Функции, которые вы будете использовать:

Модуль под тестом

Функция, которую вы преобразуете в фиксированную точку в этом примере, является прямой формой второго порядка 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® Function как масштабированную дважды MEX-функцию

Чтобы оснастить код 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-функцию, чтобы записать значения Min/Max

Оснащенная 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;

Запустите оснащенную MEX-функцию с входом шага

Результаты инструментирования накапливаются, пока они не очищены с 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);

Оснастите MATLAB® Function как MEX-функцию фиксированной точки

Создайте оснащенную 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>