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

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

Приложения обработки сигналов для реконфигурируемых платформ требуют алгоритмов, которые обычно задаются с помощью операций с плавающей точкой. Однако для степени, стоимости и причин эффективности, они обычно реализуются с операциями фиксированной точки или в программном обеспечении для ядер DSP или как оборудование специального назначения в FPGAs. Преобразование фиксированной точки может составить очень сложные и длительные, обычно требовательные 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 для более полного примера при создании и заполнении проектов HDL Coder MATLAB.

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

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

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

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

  • Позвольте пользователю вручную настраивать предложенные фиксированные точки

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

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

Шаг 1: запустите советника по вопросам рабочего процесса

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

  2. Выберите 'Convert to fixed-point at build time' для опции 'Преобразование Фиксированной точки'.

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

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

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

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

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

  1. Нажмите на 'шаг' Преобразования Фиксированной точки.

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

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

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

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

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

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

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

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

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

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

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

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

Можно также позволить 'Логарифмической опции' данных о гистограмме в меню кнопки 'Analyze' позволить регистрировать данных о гистограмме.

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

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

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

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

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

Шаг 5: протестируйте численные данные

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

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

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

Шаг 6: выполните итерации на результатах

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

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

Очистите Сгенерированные Файлы

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

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');
Для просмотра документации необходимо авторизоваться на сайте