Автомасштабирование и Curve Fitting

Приложение и затронутые темы

Приложение, предполагаемое для этого примера, является автоматическим отслеживанием маршрута на дороге. Мы покажем, как соответствовать полиному к зашумленным данным, представляющим контур маршрута дороги перед транспортным средством.

Пример использует это приложение аппроксимирования кривыми, чтобы проиллюстрировать несколько тем, включая:

  • Подбор кривой полиному произвольного порядка к зашумленным данным с помощью неявной матричной инверсии

  • Преобразование модели с плавающей точкой к инструментам автомасштабирования использования фиксированной точки

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

Во многих приложениях аппроксимирования кривыми цель состоит в том, чтобы оценить коэффициенты полинома младшего разряда. Полином затем используется в качестве модели для наблюдаемых зашумленных данных. Например, если квадратичный полином должен использоваться, существует три коэффициента (a, b и c), чтобы оценить:

$$ax^2 + bx + c$$

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

Этот пример сначала проиллюстрирует некоторые из этих тезисов в MATLAB®, и затем переместится в модель Simulink®.

Модель сигнала для дороги

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

% Model of roadway
Duration = 2;        % Distance that we look ahead
N = 25;              % Total number of sensors providing estimates of road boundary
Ts = Duration / N;   % Sample interval
FracPeriod = 0.5;    % Fraction of period of sinusoid to match
% y will contain the simulated sensor outputs
y = sin(2*pi* [0:(N-1)]' * (FracPeriod/N)) + sqrt(0.3) * randn(N,1);

Решение линейной системы Используя матричную факторизацию

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

  • y содержит датчик выходные параметры.

  • x содержит полиномиальные коэффициенты, которые мы должны получить.

  • A является постоянной матрицей, связанной с порядком полинома и местоположениями датчиков.

Мы решим уравнение с помощью QR-факторизации можно следующим образом:

$$Ax = QRx=y$$

и

$$x = pinv(A) * y = R^{-1}Q^T*y$$

где pinv () представляет псевдоинверсию. Учитывая матрицу А, следующий код может использоваться, чтобы реализовать решение этого матричного уравнения. Факторинг A позволяет для более легкого решения системы.

[Q, R] = qr(A);
z = Q' * y;
x = R \ z;
yhat = A * x;
plot(0:N-1,y,'k',0:N-1,yhat,'rs')

Ради полноты мы отмечаем, что матрица А Вандермонда может быть сформирована с помощью следующего кода:

Npoly = 3; % Order of polynomial to use in fitting
v = [0:Ts:((N-1)*Ts)]';
A = zeros(length(v), Npoly);
for i = Npoly : -1 : 1
    A(:,i) = v.^i;
end

Поскольку A является постоянным, так Q и R. Они могут быть предварительно вычислены. Поэтому единственный расчет, требуемый как новые данные о датчике, получен, x=R \(Q '*y).

Если у нас есть оценки полиномиальных коэффициентов, мы можем восстановить полином с любой гранулярностью, которой мы желаем - мы не ограничиваемся восстановлением только в точках, где у нас первоначально были данные:

Перемещение в Simulink® и подготовку к реализации фиксированной точки

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

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

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

  • Оффлайновые расчеты, которые могут быть реализованы в плавающей точке с инвариантными сигналами.

  • Расчеты во время выполнения, которые должны быть реализованы в фиксированной точке.

  • Визуализация данных, которая может быть реализована в плавающей точке.

Модель в качестве примера параметрируется таким же образом как код MATLAB выше. Чтобы видеть параметры модели, перейдите к Рабочему пространству модели, которое доступно от Model Explorer. Выберите MODELING> Model Explorer и Model Workspace (в средней панели) и попробуйте следующее:

  • Установите порядок полинома к 1 (Npoly=1) и повторно инициализируйте рабочую область. Модель теперь попытается соответствовать прямой линии к шумным входным данным.

  • Замедлите уровень искривления в данных установкой FracPeriod к 0,3. Подгонка кривой является четной лучше теперь, поскольку существует меньше искривления в данных.

Когда это - наше намерение реализовать эту модель с помощью вычислений с фиксированной точкой, один из первых вопросов должен быть, поддерживают ли необходимые компоненты фиксированную точку. Блок QR Factorization в DSP System Toolbox™ в настоящее время не поддерживает типы данных с фиксированной точкой, поэтому застревают мы? Ответ нет. Матрица, которая должна быть учтена, не зависит от данных во время выполнения. Это только зависит от вещей как порядок полинома, шага расчета и окна наблюдения. Таким образом мы принимаем, что матрица A будет учтена "оффлайн". Оффлайновые расчеты могут быть смоделированы в Simulink с помощью инвариантных сигналов.

Сигнал в Simulink становится инвариантным путем установки шага расчета соответствующего исходного блока к Inf и включения Встроенной оптимизации параметров на диалоговом окне Параметров конфигурации. Этой модели включили цвета шага расчета (Отображение> Шаг расчета> Цвета). Пурпурная часть модели имеет бесконечный шаг расчета - его выход вычисляется однажды, прежде чем модель начнет симулировать и будет затем использоваться остальной частью модели во время времени выполнения. Оффлайновые расчеты, которые это представляет, могут на самом деле быть вычислены в плавающей точке и затем их выходе, просто преобразованном в фиксированную точку для использования остальной частью модели во времени выполнения.

Выполнение модели производит выход, похожий на тот из кода MATLAB выше, за исключением того, что это запускается постоянно. Снимок состояния выхода модели показывают ниже:

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

Мы будем теперь работать к перереализации этой системы с помощью данных фиксированной точки. Обратите внимание на то, что, даже если система фиксированной точки является окончательным поставляемым компонентом, обычно желательно запуститься путем реализации его в плавающей точке и затем преобразования что функциональная реализация в фиксированную точку. В оставшейся части этого примера мы проиллюстрируем этот рабочий процесс путем преобразования модели выше от плавающей точки до фиксированной точки. Fixed-Point Tool в Simulink упрощает этот рабочий процесс. Откройте этот инструмент из своей модели путем выбора Fixed Point Tool из меню APPS. Первичные функциональности, которые мы будем использовать, являются переопределением типа данных и автомасштабированием. Переопределение типа данных является удобным способом переключить целую модель или подсистему между операцией и фиксированной точки с плавающей точкой. Автомасштабирование автоматически предлагает желательное масштабирование для различных количеств фиксированной точки в модели или подсистеме. Масштабирование задает местоположение двоичной точки в заданном размере слова для каждой величины.

Используя переопределение типа данных с моделями фиксированной точки

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

  • Откройте Fixed-Point Tool и заметьте, что он установил DataTypeOverride на Double, который является причиной, что модель в настоящее время запускает с двойной точностью данные с плавающей точкой.

  • Установите DataTypeOverride на Use local settings использовать типы данных, первоначально заданные для каждой подсистемы.

  • Запустите модель и обратите внимание, что она теперь использует типы данных с фиксированной точкой во фрагменте во время выполнения модели, которую мы хотим встроить. Выходные результаты являются теперь неправильными, как проиллюстрировано в графике ниже. Кроме того, многочисленные предупреждения записаны в окно команды MATLAB. Неправильные результаты и предупреждения состоят оба в том вследствие того, что модель правильно еще не сконфигурирована для выполнения фиксированной точки.

Предложение оптимизированных настроек фиксированной точки и автомасштабирование модели

Если при запуске модель с данными фиксированной точки, можно заметить, что модель правильно не масштабируется. Давайте попытаемся зафиксировать это.

Настройка систем фиксированной точки является сложной задачей. Каждое количество фиксированной точки должно иметь свой размер слова со знаком и дробную длину (местоположение двоичной точки) набор. Во многих случаях размер слова и со знаком известен, но двоичная точка должна быть расположена. В DSP System Toolbox мы используем длину части количества, чтобы установить местоположение двоичной точки. Дробная длина является количеством битов справа от двоичной точки.

Для того, чтобы установить масштабирование, можно выполнить общую процедуру, обрисовал в общих чертах в разделе "Workflow for Floating Point to Fixed-Point Conversion" выше. А именно,

  • В Fixed-Point Tool, набор DataTypeOverride модели к Double и его режим инструментирования фиксированной точки к Minimums, maximums, and overflows.

  • Запустите модель. Необходимо будет вручную остановить модель, если время остановки все еще установлено в Inf.

  • В Автоматической панели ввода данных снятие флажка Делает предложение Со знаком, Делает предложение для Наследованных и флажков С плавающей точкой. Это гарантирует, что только дробные длины предложены Fixed-Point Tool.

  • Нажмите кнопку Propose Data Types на Fixed-Point Tool.

  • Примите или отклоните каждую предложенную дробную длину в средней панели Fixed-Point Tool. Перед принятием обратите внимание, что записи в предложенном дробном столбце длины (ProposedDT) доступны для редактирования. Первоначально предложенная дробная длина является самым большим значением, которое не производит переполнение с текущими данными, таким образом обеспечивая максимальное разрешение при предотвращении переполнения. Дополнительная высота помещения может опционально быть включена с помощью параметров запаса прочности Процента на Fixed-Point Tool.

  • Нажмите кнопку Apply Data Types на Fixed-Point Tool, чтобы применить принятые дробные длины назад в модель. Каждая принятая дробная длина изменяется на диалоговом окне соответствующего блока. Для того, чтобы позволить принятым дробным длинам вступать в силу в модели, обратите внимание, что настройки фиксированной точки блока не могут быть установлены в наследованные режимы, такие как Same as input или Inherit via internal rule, а скорее должен быть установлен в явный режим, такой как Binary point scaling.

  • После автомасштабирования, задержанного DataTypeOverride к Use local settings и запустите модель снова. Результаты фиксированной точки теперь похожи на тех, мы наблюдали использование, с плавающей точкой.