В этом примере показано, как начать с проекта с плавающей точкой в MATLAB, итеративно сходитесь на эффективном проекте фиксированной точки в MATLAB и проверьте числовую точность сгенерированного проекта фиксированной точки.
Приложения обработки сигналов для реконфигурируемых платформ требуют алгоритмов, которые обычно задаются с помощью операций с плавающей точкой. Однако для степени, стоимости и причин эффективности, они обычно реализуются с операциями фиксированной точки или в программном обеспечении для ядер DSP или как оборудование специального назначения в FPGAs. Преобразование фиксированной точки может составить очень сложные и длительные, обычно требовательные 25 - 50 процентов общего времени разработки и реализации. Автоматизированные инструменты могут упростить и ускорить процесс преобразования.
Для реализаций программного обеспечения цель состоит в том, чтобы задать оптимизированную спецификацию фиксированной точки, которая минимизирует размер кода и время выполнения для данного ограничения точности расчета. Эта оптимизация достигается посредством модификации местоположения двоичной точки (для масштабирования) и выбор длины слова данных согласно различным типам данных, поддержанным целевым процессором.
Для аппаратных реализаций может быть оптимизирована полная архитектура. Эффективное внедрение минимизирует и используемую область и потребление энергии. Таким образом цель процесса преобразования обычно фокусируется вокруг минимизации размера слова оператора.
С плавающей точкой к рабочему процессу фиксированной точки в настоящее время интегрировано в HDL Workflow Advisor как описано в Начало работы с MATLAB к Рабочему процессу HDL.
Рабочий процесс преобразования из плавающей запятой в фиксированную запятую в HDL Coder™ включает следующие шаги:
Проверьте, что проект с плавающей точкой совместим с генерацией кода.
Вычислите фиксированные точки на основе симуляции испытательного стенда.
Сгенерируйте читаемую и прослеживаемую фиксированную точку код 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
Чтобы создать новый проект, введите следующую команду:
coder -hdlcoder -new flt2fix_project
Затем добавьте файл 'mlhdlc_filter.m' в проект как функция MATLAB и 'mlhdlc_filter_tb.m' как Испытательный стенд MATLAB.
Обратитесь к Начало работы с MATLAB к Рабочему процессу HDL для более полного примера при создании и заполнении проектов HDL Coder MATLAB.
Рабочий процесс преобразования из плавающей запятой в фиксированную запятую позволяет вам:
Проверьте, что проект с плавающей точкой является совместимой генерацией кода
Предложите фиксированные точки на основе настроек размера слова и данных моделирования
Позвольте пользователю вручную настраивать предложенные фиксированные точки
Подтвердите предложенные фиксированные точки
Проверьте, что сгенерированная фиксированная точка код MATLAB имеет желаемую числовую точность
Нажмите на кнопку Workflow Advisor, чтобы запустить HDL Workflow Advisor.
Выберите 'Convert to fixed-point at build time' для опции 'Преобразование Фиксированной точки'.
На этом шаге вы можете входные define типы вручную или путем определения и выполнения испытательного стенда.
Нажмите 'Run', чтобы выполнить этот шаг.
После уведомления симуляции, что входная переменная 'x' задана как скаляр дважды 'дважды (1x1)'
Нажмите на 'шаг' Преобразования Фиксированной точки.
Проект скомпилирован с входными типами, заданными на предыдущем шаге и после того, как компиляция успешна, таблица переменных показывает выведенные типы для всех функций в проекте.
На этом шаге оснащен первоначальный проект так, чтобы минимальные и максимальные значения для всех переменных в проекте были собраны в процессе моделирования.
Нажмите на кнопку 'Analyze'.
Заметьте, что таблица 'Sim Min' и 'Sim Max' теперь заполняется с областями значений симуляции. Фиксированные точки предложены на основе настроек размера слова по умолчанию.
На данном этапе, на основе вычисленной симуляции располагается для всех переменных, можно вычислить:
Дробные длины для данной зафиксированной установки размера слова, или
Размеры слова для данной зафиксированной дробной установки длины.
Таблица типа содержит следующую информацию для каждой переменной, существующей в проекте MATLAB с плавающей точкой, организованном функцией:
Сим Мин: минимальное значение, присвоенное переменной в процессе моделирования.
Сим Макс: максимальное значение, присвоенное переменной в процессе моделирования.
Целое число: Являются ли все значения, присвоенные в процессе моделирования, целыми числами.
Шаг предложения по типу использует вышеупомянутую информацию и комбинирует ее с заданными пользователями настройками размера слова, чтобы предложить фиксированную точку для каждой переменной.
Можно также позволить 'Логарифмической опции' данных о гистограмме в меню кнопки 'Analyze' позволить регистрировать данных о гистограмме.
Представление гистограммы кратко дает информацию о динамическом диапазоне данных моделирования для переменной. Ось X соответствует нагрузкам на долото, и ось Y представляет количество случаев. Предложенная числовая информация о типе наложена сверху этого графика и доступна для редактирования. Перемещение ограничивающего белого поля левые или правые изменения положение двоичной точки. Перемещение правых краев или левых краев соответственно изменяет дробную длину или wordlength. Все изменения, внесенные в предложенный тип, сохранены в проекте.
На этом шаге фиксированные точки от предыдущего шага используются, чтобы сгенерировать фиксированную точку проект MATLAB от исходной реализации с плавающей точкой.
Нажмите на кнопку 'Validate Types'.
Сгенерированный код и другие артефакты преобразования доступны через гиперссылки в окне вывода. Фиксированные точки явным образом показывают в сгенерированном коде MATLAB.
Нажмите на кнопку 'Test Numerics'.
На этом шаге сгенерированная фиксированная точка выполняется с помощью MATLAB Coder.
Если вы включаете 'Журналу все вводы и выводы для опции' графиков сравнения на 'Тестовой панели' Численных данных, дополнительный график сгенерирован для каждого скалярного выхода, который показывает результаты и фиксированной точки с плавающей точкой, а также различие между двумя. Для нескалярных выходных параметров только показывают информацию об ошибке.
Если числовые результаты не встречают вашей желаемой точности после симуляции фиксированной точки, можно возвратиться к, 'Предлагают' шаг Фиксированных точек в Советнике по вопросам Рабочего процесса. Настройте настройки размера слова или индивидуально измените типы, как желаемый и повторную остальную часть шагов в рабочем процессе, пока вы не достигнете своих желаемых результатов.
Обратитесь к Преобразованию Фиксированной точки и Улучшению для получения дополнительной информации о том, как выполнить итерации и совершенствовать численные данные алгоритма в сгенерированной фиксированной точке.
Запустите следующие команды, чтобы очистить временную папку проекта.
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');