Автомасштабирование и Аппроксимирование кривыми

Приложение и охватываемые темы

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

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

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

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

  • Уменьшение расчетов и моделирования « автономных » расчетов с использованием инвариантных сигналов

Во многих приложениях аппроксимирования кривыми цель состоит в том, чтобы оценить коэффициенты полинома низкого порядка. Затем полином используется в качестве модели для наблюдаемых зашумленных данных. Для примера, если должен использоваться квадратичный полином, существует три коэффициента (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-факторизацию A следующим образом:

$$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')

Для полноты заметим, что матрица Vandermonde A может быть сформирована с помощью следующего кода:

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. Выберите МОДЕЛИРОВАНИЕ > Model Explorer и Рабочее пространство модели (на средней панели) и попробуйте следующее:

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

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

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

Сигнал в Simulink становится инвариантным путем установки шага расчета соответствующего исходного блока на Inf и включения оптимизации Inline параметров в диалоговом окне Параметры Конфигурации. У этой модели включён шаг расчета цветов (Display > Шаг расчета > Colors). Пурпурная часть модели имеет бесконечный шаг расчета - ее выход вычисляется один раз, до начала моделирования модели, и затем используется остальной частью модели во время выполнения. Автономные расчеты, которые он представляет, могут быть фактически вычислены в плавающей точке, а затем их выход просто преобразован в фиксированную точку для использования остальной частью модели во время выполнения.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Нажмите кнопку «Предложить типы данных» на Fixed-Point Tool.

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

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

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