Преобразование из плавающей запятой в фиксированную запятую

В этом примере показано, как начать с проекта с плавающей точкой в MATLAB, итерационно сходиться по эффективному проекту с фиксированной точкой в MATLAB и проверить числовую точность сгенерированного проекта с фиксированной точкой.

Приложения обработки сигналов для реконфигурируемых платформ требуют алгоритмов, которые обычно задаются с помощью операций с плавающей точкой. Однако по причинам степени, стоимости и эффективности они обычно реализуются с операциями с фиксированной точкой либо в программном обеспечении для ядер DSP, либо в качестве специального оборудования в FPGA. Преобразование с фиксированной точкой может быть очень сложным и длительным, обычно требующим от 25 до 50 процентов от общего времени проекта и реализации. Автоматизированные инструменты могут упростить и ускорить процесс преобразования.

Для реализаций программного обеспечения цель состоит в том, чтобы задать оптимизированную спецификацию с фиксированной точкой, которая минимизирует размер кода и время выполнения для заданного ограничения точности расчетов. Эта оптимизация достигается путем изменения двоичного местоположения точки (для масштабирования) и выбора размера слова данных в соответствии с различными типами данных, поддерживаемыми целевым процессором.

Для аппаратных реализаций можно оптимизировать полную архитектуру. Эффективная реализация сведет к минимуму как используемую область, так и потребление степени. Таким образом, цель процесса преобразования обычно фокусируется вокруг минимизации размера слова оператора.

Рабочий процесс с плавающей точкой и фиксированной точкой в настоящее время интегрирован в HDL Workflow Advisor, как описано в разделе Начало работы с MATLAB в HDL.

Введение

Рабочий процесс преобразования из плавающей запятой в фиксированную запятую в HDL- Coder™ включает следующие шаги:

  1. Проверьте, что проект с плавающей точкой совместим с генерацией кода.

  2. Вычислите фиксированные точки на основе симуляции теста.

  3. Сгенерируйте считываемый и отслеживаемый код MATLAB с фиксированной точкой путем применения предложенных типов.

  4. Проверьте сгенерированный проект с фиксированной точкой.

  5. Сравните числовую точность сгенерированного кода с фиксированной точкой с исходным кодом с плавающей точкой.

MATLAB- Проекта

Код MATLAB, используемый в этом примере, является простым транспонированным фильтром 2 прямой формы второго порядка. Этот пример также содержит тестовый набор MATLAB, который выполняет фильтр.

design_name = 'mlhdlc_df2t_filter';
testbench_name = 'mlhdlc_df2t_filter_tb';

Исследуйте проект MATLAB.

type(design_name);
%#codegen
function y = mlhdlc_df2t_filter(x)

%   Copyright 2011-2015 The MathWorks, Inc.

persistent z;
if isempty(z)
    % Filter states as a column vector
    z = zeros(2,1);
end

% Filter coefficients as constants
b = [0.29290771484375   0.585784912109375  0.292907714843750];
a = [1.0                0.0                0.171600341796875];

y    =  b(1)*x + z(1);
z(1) = (b(2)*x + z(2)) - a(2) * y;
z(2) =  b(3)*x - a(3) * y;

end

Для рабочего процесса с плавающей точкой к фиксированной точке желательно иметь полный тестовый интервал. Качество предлагаемых типов данных с фиксированной точкой зависит от того, насколько хорошо тестовый интервал охватывает динамическую область значений проекта с желаемой точностью.

Для получения дополнительной информации о требованиях к проекту с плавающей точкой и тестовому набору, смотрите раздел Структура Проект с плавающей точкой Работы с Сгенерированными файлами с фиксированной точкой.

type(testbench_name);

%

%   Copyright 2011-2015 The MathWorks, Inc.


Fs = 256;              % Sampling frequency
Ts = 1/Fs;             % Sample time
t = 0:Ts:1-Ts;         % Time vector from 0 to 1 second
f1 = Fs/2;             % Target frequency of chirp set to Nyquist
in = sin(pi*f1*t.^2);  % Linear chirp from 0 to Fs/2 Hz in 1 second
out = zeros(size(in)); % Output the same size as the input

for ii=1:length(in)
    out(ii) = mlhdlc_df2t_filter(in(ii));
end

% Plot
figure('Name', [mfilename, '_plot']);
subplot(2,1,1);
plot(in);
xlabel('Time')
ylabel('Amplitude')
title('Input Signal (with Noise)')

subplot(2,1,2);
plot(out);
xlabel('Time')
ylabel('Amplitude')
title('Output Signal (filtered)')

Создайте новую папку и скопируйте соответствующие файлы

Выполните следующие строки кода, чтобы скопировать необходимые файлы примера во временную папку.

mlhdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos', 'matlabhdlcoderdemos');
mlhdlc_temp_dir = [tempdir 'mlhdlc_flt2fix_prj'];

% create a temporary folder and copy the MATLAB files
cd(tempdir);
[~, ~, ~] = rmdir(mlhdlc_temp_dir, 's');
mkdir(mlhdlc_temp_dir);
cd(mlhdlc_temp_dir);

copyfile(fullfile(mlhdlc_demo_dir, [design_name,'.m*']), mlhdlc_temp_dir);
copyfile(fullfile(mlhdlc_demo_dir, [testbench_name,'.m*']), mlhdlc_temp_dir);

Моделируйте проект

Симулируйте проект с испытательным стендом до генерации кода, чтобы убедиться, что нет ошибок во время выполнения.

mlhdlc_df2t_filter_tb

Создайте новый HDL Coder проект

Чтобы создать новый проект, введите следующую команду:

coder -hdlcoder -new flt2fix_project

Затем добавьте файл 'mlhdlc _ filter.m' к проекту в качестве функции MATLAB и 'mlhdlc _ filter _ tb.m' в качестве испытательного стенда MATLAB.

Более полное руководство по созданию и заполнению проектов MATLAB HDL Coder см. в разделе «Начало работы с MATLAB в HDL».

Рабочий процесс генерации кода с фиксированной точкой

Рабочий процесс преобразования из плавающей запятой в фиксированную запятую позволяет вам:

  • Проверьте, что проект с плавающей точкой совместим с генерацией кода

  • Предложите фиксированные точки на основе данных моделирования и настроек размера слова

  • Разрешить пользователю вручную настроить предлагаемые фиксированные точки

  • Проверьте предлагаемые фиксированные точки

  • Проверьте, что сгенерированный код MATLAB с фиксированной точностью имеет желаемую числовую точность

Шаг 1: Запуск Workflow Advisor

  1. Нажмите кнопку Workflow Advisor, чтобы запустить HDL Workflow Advisor.

  2. Выберите 'Преобразовать в фиксированную точку во время сборки' для опции 'Преобразование с фиксированной точкой'.

Шаг 2: Задайте входные типы

На этом шаге можно задать типы входа вручную или путем определения и выполнения теста.

  1. Нажмите 'Run', чтобы выполнить этот шаг.

После заметки симуляции, что входная переменная 'x' задана как скалярный двойной 'double (1x1)'

Шаг 3: Запустите симуляцию

  1. Щелкните на шаге 'Fixed-Point Conversion'.

Проект компилируется с входными типами, определенными на предыдущем шаге, и после успешного компиляции в таблице переменных показаны предполагаемые типы для всех функций в проекте.

На этом этапе исходная конструкция инструментируется так, чтобы минимальное и максимальное значения для всех переменных в проекте были собраны во время симуляции.

  1. Нажмите кнопку 'Analyze'.

Заметьте, что таблицы 'Sim Min' и 'Sim Max' теперь заполнены областями значений симуляции. Фиксированные точки предлагаются на основе настроек размера слова по умолчанию.

На данном этапе, основываясь на вычисленных областях значений симуляции для всех переменных, можно вычислить:

  • Длины дробей для заданной настройки фиксированного размера слова, или

  • Размеры слова для заданного значения фиксированной длины дроби.

Таблица типов содержит следующую информацию для каждой переменной, существующей в проекте MATLAB с плавающей точкой, организованной по функциям:

  • Sim Min: Минимальное значение, присвоенное переменной во время симуляции.

  • Sim Max: Максимальное значение, присвоенное переменной во время симуляции.

  • Целое число: Все ли значения, назначенные во время симуляции, являются целыми числами.

Шаг предложения типа использует вышеуказанную информацию и объединяет ее с пользовательскими настройками размера слова, чтобы предложить тип фиксированной точки для каждой переменной.

Можно также включить опцию 'Log histogram data' в меню кнопки 'Analyze', чтобы включить регистрацию данных гистограммы.

Представление гистограммы кратко предоставляет информацию о динамической области значений данных моделирования для переменной. Ось X соответствует весам битов, а ось Y представляет количество вхождений. Предлагаемая информация о числовом типе накладывается поверх этого графика и может редактироваться. Перемещение ограничивающего белого прямоугольника влево или вправо изменяет положение двоичной точки. Перемещение правых или левых краев соответственно изменяет длину дроби или словосочетание. Все изменения, внесенные в предлагаемый тип, сохраняются в проекте.

Шаг 4: Проверьте типы

На этом этапе фиксированные точки из предыдущего шага используются, чтобы сгенерировать проект MATLAB с фиксированной точкой из исходной реализации с плавающей точкой.

  1. Нажмите кнопку 'Validate Types'.

Сгенерированный код и другие программные продукты преобразования доступны через гиперссылки в выходе. Фиксированные точки явно показаны в сгенерированном коде MATLAB.

Шаг 5: Число теста

  1. Нажмите кнопку 'Test Numerics'.

На этом этапе сгенерированный код с фиксированной точкой выполняется с использованием MATLAB Coder.

Если вы включите опцию 'Log all inputs and outputs for comparison plots' на панели 'Test Numerics', генерируется дополнительный график для каждого скалярного выхода, который показывает результаты с плавающей и фиксированной точками, а также различие между ними. Для некалярных выходов показана только информация об ошибке.

Шаг 6: Итерация результатов

Если числовые результаты не соответствуют вашей желаемой точности после симуляции с фиксированной точкой, можно вернуться к шагу 'Propose Fixed-Point Types' в Рабочем процессе Advisor. Настройте настройки размера слова или индивидуально измените типы по мере необходимости и повторите оставшиеся шаги в рабочем процессе, пока вы не достигнете желаемых результатов.

Дополнительные сведения о том, как выполнить итерацию и уточнение цифр алгоритма в сгенерированном коде с фиксированной точкой, см. в разделе Преобразование и уточнение типа фиксированной точки.

Очистка сгенерированных файлов

Выполните следующие команды, чтобы очистить временную папку проекта.

mlhdlc_demo_dir = fullfile(matlabroot, 'toolbox', 'hdlcoder', 'hdlcoderdemos', 'matlabhdlcoderdemos');
mlhdlc_temp_dir = [tempdir 'mlhdlc_flt2fix_prj'];
clear mex;
cd (mlhdlc_demo_dir);
rmdir(mlhdlc_temp_dir, 's');