Установите Типы данных Используя Инструментирование 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>