Для этого примера предусмотрено автоматическое отслеживание полосы движения на дороге. Мы покажем, как подогнать полином к шумным данным, представляющим границу полосы дороги перед транспортным средством.
В примере используется приложение для подбора кривой для иллюстрации нескольких тем, в том числе:
Подгонка полинома произвольного порядка к шумным данным с помощью неявной инверсии матрицы
Преобразование модели с плавающей запятой в фиксированную точку с помощью инструментов автоматического масштабирования
Сокращение вычислений и моделирование «автономных» вычислений с использованием инвариантных сигналов
Во многих приложениях подбора кривой целью является оценка коэффициентов полинома низкого порядка. Затем полином используется в качестве модели для наблюдаемых шумных данных. Например, если используется квадратичный многочлен, для оценки существует три коэффициента (a, b и 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 содержит полиномиальные коэффициенты, которые нам нужно получить.
А - постоянная матрица, связанная с порядком полинома и расположениями датчиков.
Уравнение будет решено с помощью QR-факторизации А следующим образом:

и

где pinv () представляет псевдоинверсию. Учитывая матрицу А, следующий код может быть использован для реализации решения этого матричного уравнения. Факторинг А позволяет упростить решение системы.
[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Так как А является постоянным, то и Q и R. Они могут быть предварительно вычислены. Поэтому при получении новых данных датчика требуется только вычисление x = R\( Q '* y).
Как только у нас есть оценки полиномиальных коэффициентов, мы можем восстановить полином с любой гранулярностью мы хотим - мы не ограничиваемся реконструкцией только в точках, где мы изначально имели данные:

Затем мы реконструируем эту проблему и ее решение в среде Simulink. Конечным результатом, который мы имеем в виду, является реализация с фиксированной точкой части алгоритма времени выполнения, подходящей для развертывания во встроенной среде.
Модель, реализующая это приложение подбора кривой, концептуально разделена на четыре части:
Генерирование данных, которое может быть реализовано в плавающей точке, поскольку эта часть соответствует датчикам, которые будут независимы от устройства подгонки кривой.
Автономные вычисления, которые могут быть реализованы в плавающей точке с инвариантными сигналами.
Вычисления времени выполнения, которые должны быть реализованы в фиксированной точке.
Визуализация данных, которая может быть реализована в плавающей точке.
Пример модели параметризуется таким же образом, как и код MATLAB выше. Чтобы просмотреть параметры модели, перейдите в рабочую область модели, которая доступна в обозревателе моделей. Выберите MODELING > Model Explorer и Model Workspace (в средней области) и попробуйте выполнить следующие действия:
Установите порядок многочлена 1 (Npoly = 1) и повторно инициализируйте рабочую область. Теперь модель попытается подогнать прямую линию к шумным входным данным.
Замедьте скорость кривизны в данных, установив значение FracPeriod равным 0,3. Посадка кривой сейчас еще лучше, так как в данных меньше кривизны.
Поскольку мы намерены реализовать эту модель с использованием арифметики с фиксированной точкой, одним из первых вопросов должен быть вопрос о том, поддерживают ли необходимые компоненты фиксированную точку. Блок факторизации QR в системе DSP Toolbox™ в настоящее время не поддерживает типы данных с фиксированной точкой, так что мы застряли? Ответ - нет. Матрица, которая должна быть факторизована, не зависит от данных времени выполнения. Это зависит только от порядка полинома, времени выборки и окна наблюдения. Таким образом, мы предполагаем, что матрица A будет факторизована «в автономном режиме». Автономные вычисления можно смоделировать в Simulink с помощью инвариантных сигналов.
Сигнал в Simulink становится инвариантным, устанавливая время выборки соответствующего исходного блока на Inf и включив оптимизацию встроенных параметров в диалоговом окне «Параметры конфигурации». Для этой модели включены цвета времени образца (Display > Sample Time > Colors). Пурпурная часть модели имеет бесконечное время выборки - её вывод вычисляется один раз, до начала моделирования модели, а затем используется остальной частью модели во время выполнения. Автономные вычисления, которые он представляет, могут быть фактически вычислены в плавающей точке, а затем их выходные данные просто преобразованы в фиксированную точку для использования остальной частью модели во время выполнения.
При выполнении модели выходные данные аналогичны выводу кода MATLAB, приведенному выше, за исключением того, что он выполняется постоянно. Ниже показан снимок выходных данных модели:


Теперь мы будем работать над повторным внедрением этой системы с использованием данных с фиксированной точкой. Обратите внимание, что даже если система с фиксированной точкой является конечным результатом, обычно желательно начать с ее реализации в плавающей точке и затем преобразовать эту функциональную реализацию в фиксированную точку. В оставшейся части этого примера мы иллюстрируем этот рабочий процесс, преобразуя модель выше из плавающей точки в фиксированную. Инструмент «Фиксированная точка» в Simulink упрощает этот процесс. Откройте этот инструмент из модели, выбрав команду Инструмент фиксированной точки (Fixed Point Tool) в меню ПРИЛОЖЕНИЯ (APPS). Основными функциональными возможностями, которые мы будем использовать, являются переопределение типа данных и автоматическое масштабирование. Переопределение типа данных - это удобный способ переключения всей модели или подсистемы между операциями с плавающей и фиксированной точками. Автоматическое масштабирование автоматически предлагает желаемое масштабирование для различных величин с фиксированной точкой в модели или подсистеме. Масштабирование указывает местоположение двоичной точки в пределах заданного размера слова для каждой величины.
Часто удобно перемещаться между типами данных с плавающей и фиксированной точками при оптимизации модели для поведения с фиксированной точкой. Обычно желательно, чтобы поведение с фиксированной точкой как можно ближе соответствовало поведению с плавающей точкой. Чтобы увидеть эффект переопределения типа данных в модели примера, попробуйте выполнить следующие действия.
Откройте инструмент Fixed-Point и убедитесь, что для DataTypeOverride задано значение Double, что является причиной того, что модель в настоящее время выполняется с данными с плавающей запятой двойной точности.
Задать для DataTypeOverride значение Use local settings для использования типов данных, первоначально заданных для каждой подсистемы.
Запустите модель и обратите внимание, что в ней теперь используются типы данных с фиксированной точкой в той части модели времени выполнения, которую требуется встроить. Результаты вывода теперь неверны, как показано на графике ниже. Кроме того, в окно команд MATLAB записываются многочисленные предупреждения. Неверные результаты и предупреждения связаны с тем, что модель еще не настроена должным образом для выполнения с фиксированной точкой.

После запуска модели с данными с фиксированной точкой можно убедиться в неправильном масштабировании модели. Попробуем это исправить.
Настройка систем с фиксированной точкой является сложной задачей. Для каждой величины с фиксированной точкой должно быть задано значение signedity, длина слова и длина дроби (расположение двоичной точки). Во многих случаях длина слова и сигнатура известны, но двоичная точка должна быть расположена. В DSP System Toolbox мы используем длину количественной доли для установки местоположения двоичной точки. Длина дроби - это число битов справа от двоичной точки.
Для настройки масштабирования можно выполнить общую процедуру, описанную выше в разделе «Рабочий процесс преобразования плавающей точки в фиксированную точку». В частности,
В инструменте «Фиксированная точка» задайте для DataTypeOverride модели значение Double и его режим КИПиА с фиксированной точкой Minimums, maximums, and overflows.
Запустите модель. Необходимо вручную остановить модель, если время остановки по-прежнему установлено на Inf.
На панели «Автоматическая типизация данных» снимите флажки «Предложить подпись», «Предложить для унаследованных» и «Плавающая точка». Это гарантирует, что инструмент «Фиксированная точка» предложит только длины дробей.
Нажмите кнопку «Предложить типы данных» на инструменте «Фиксированная точка».
Примите или отклоните каждую предложенную длину дроби на средней панели инструмента «Фиксированная точка». Перед принятием обратите внимание, что записи в столбце предполагаемой длины дроби (DDT) доступны для редактирования. Первоначально предложенная длина дроби является наибольшим возможным значением, которое не приводит к переполнению текущими данными, обеспечивая, таким образом, максимальное разрешение, избегая переполнения. Дополнительное напорное помещение может быть дополнительно включено с использованием параметров процента запаса прочности инструмента Fixed-Point Tool.
Нажмите кнопку Применить типы данных (Apply Data Types) на инструменте «Фиксированная точка» (Fixed-Point Tool), чтобы применить принятые длины дробей обратно в модель. Каждая принятая длина дроби изменяется в диалоговом окне соответствующего блока. Чтобы допустимые длины дробей вступили в силу в модели, обратите внимание, что настройки фиксированной точки блока не могут быть установлены в наследуемые режимы, такие как Same as input или Inherit via internal rule, но, скорее, должен быть установлен в явный режим, такой как Binary point scaling.
После автоматического масштабирования задайте для DataTypeOverride значение Use local settings и запустите модель еще раз. Результаты с фиксированной точкой теперь аналогичны тем, которые мы наблюдали, используя плавающую точку.
