dsp. KalmanFilter

Оцените системные измерения и состояния с помощью Фильтра Калмана

Описание

Система dsp.KalmanFilter object™ является средством оценки, используемым, чтобы рекурсивно получить решение для линейной оптимальной фильтрации. Эта оценка сделана без точного ведома базовой динамической системы. Фильтр Калмана реализует следующий линейный процесс дискретного времени с состоянием, x, в kth такт: x(k)=Ax(k1)+Bu(k1)+w(k1) (уравнение состояния). Это измерение, z, дано как: z(k)=Hx(k)+v(k) (уравнение измерения).

Алгоритм Фильтра Калмана вычисляет выполняющий двух шагов рекурсивно:

  • Предсказание: параметры Процесса x (состояние) и P (ошибочная ковариация состояния) оцениваются с помощью предыдущего состояния.

  • Исправление: состояние и ошибочная ковариация исправляются с помощью текущего измерения.

Отфильтровать каждый канал входа:

  1. Создайте объект dsp.KalmanFilter и установите его свойства.

  2. Вызовите объект с аргументами, как будто это была функция.

Чтобы узнать больше, как Системные объекты работают, смотрите то, Что Системные объекты? MATLAB.

Создание

Синтаксис

kalman = dsp.KalmanFilter
kalman = dsp.KalmanFilter(STMatrix, MMatrix, PNCovariance, MNCovariance, CIMatrix)
kalman = dsp.KalmanFilter(Name,Value)

Описание

kalman = dsp.KalmanFilter возвращает Системный объект Фильтра Калмана, kalman, со значениями по умолчанию для параметров.

пример

kalman = dsp.KalmanFilter(STMatrix, MMatrix, PNCovariance, MNCovariance, CIMatrix) возвращает Системный объект Фильтра Калмана, kalman. Свойство StateTransitionMatrix установлено в STMatrix, свойство MeasurementMatrix установлено в MMatrix, свойство ProcessNoiseCovariance установлено в PNCovariance, свойство MeasurementNoiseCovariance установлено в MNCovariance, и свойство ControlInputMatrix установлено в CIMatrix.

kalman = dsp.KalmanFilter(Name,Value) возвращает Системный объект Фильтра Калмана, kalman, с каждым набором свойств к заданному значению. Заключите каждое имя свойства в одинарные кавычки. Незаданные свойства имеют значения по умолчанию.

Свойства

развернуть все

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

Если свойство является настраиваемым, можно изменить его значение в любое время.

Для получения дополнительной информации об изменении значений свойств смотрите Разработку системы в MATLAB Используя Системные объекты (MATLAB).

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

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Задайте B в уравнении состояния, которое связывает вход управления с состоянием. B является вектор-столбцом со многими строками, равными количеству состояний.

Зависимости

Это свойство активируется только, когда значением свойства ControlInputPort является true.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Задайте H в уравнении измерения, которое связывает состояния с измерениями. H является вектором - строкой со многими столбцами, равными количеству измерений.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

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

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

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

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Задайте первоначальную оценку состояний модели как вектор-столбец с длиной, равной количеству состояний.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

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

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Задайте как скалярное логическое значение, отключив фильтры Системного объекта от выполнения шага исправления после шага прогноза в алгоритме Фильтра Калмана.

Задайте, присутствует ли вход управления, с помощью скалярного логического значения. Значением по умолчанию является true.

Использование

Для версий ранее, чем R2016b, используйте функцию step, чтобы запустить алгоритм Системного объекта. Аргументы к step являются объектом, который вы создали, сопровождаемый аргументами, показанными в этом разделе.

Например, y = step(obj,x) и y = obj(x) выполняют эквивалентные операции.

Синтаксис

[zEst, xEst, MSE_Est, zPred, xPred, MSE_Pred] = kalman(z,u)

Описание

пример

[zEst, xEst, MSE_Est, zPred, xPred, MSE_Pred] = kalman(z,u) выполняет итеративный алгоритм Фильтра Калмана по измерениям, z и управление вводят u. Столбцы в z и u обработаны как входные параметры, чтобы разделить параллельные фильтры, исправление которых (или обновление) шаг может быть отключен свойством DisableCorrection. Возвращенные значения являются оцененными измерениями zEst, оцененные состояния xEst, MSE предполагаемых состояний MSE_Est, предсказанные измерения zPred, предсказанные состояния xPred и MSE предсказанных состояний MSE_Pred.

Входные параметры

развернуть все

Вход Measurement, заданный как вектор или матрица.

Отношение количества строк входа измерения к количеству строк свойства MeasurementMatrix должно быть равно отношению количества строк входа управления к количеству столбцов свойства ControlInputMatrix.

Сигнал измерения может быть входом переменного размера. Если объект заблокирован, можно изменить размер каждого входного канала, но количество каналов не может измениться.

Типы данных: single | double

Вход управления, заданный как вектор или матрица.

Отношение количества строк входа управления к количеству столбцов свойства ControlInputMatrix должно быть равно отношению количества строк входа измерения к количеству строк свойства MeasurementMatrix.

Управляющий сигнал может быть входом переменного размера. Если объект заблокирован, можно изменить размер каждого входного канала, но количество каналов не может измениться.

Типы данных: single | double

Выходные аргументы

развернуть все

Предполагаемые измерения, возвращенные как вектор или матрица.

Типы данных: single | double

Предполагаемое состояние, возвращенное как вектор или матрица.

Типы данных: single | double

Среднеквадратическая ошибка предполагаемых состояний, возвращенных как скаляр или вектор-столбец. Если вход является вектором - строкой, MSE предполагаемых состояний является скаляром.

Типы данных: single | double

Предсказанные измерения, возвращенные как вектор или матрица.

Типы данных: single | double

Предсказанные состояния, возвращенные как вектор или матрица.

Типы данных: single | double

Среднеквадратическая ошибка предсказанных состояний, возвращенных как скаляр или вектор-столбец. Если вход является вектором - строкой, MSE предполагаемых состояний является скаляром.

Типы данных: single | double

Функции объекта

Чтобы использовать объектную функцию, задайте Системный объект как первый входной параметр. Например, чтобы выпустить системные ресурсы Системного объекта под названием obj, используйте этот синтаксис:

release(obj)

развернуть все

stepЗапустите алгоритм Системного объекта
releaseВысвободите средства и позвольте изменения в значениях свойств Системного объекта и введите характеристики
resetСбросьте внутренние состояния Системного объекта

Примеры

развернуть все

Примечание: Если вы используете R2016a или более ранний релиз, заменяете каждый вызов объекта с эквивалентным синтаксисом шага. Например, obj (x) становится шагом (obj, x).

Создайте Системные объекты для изменяющегося скалярного входа, Фильтра Калмана и осциллографа (для графического вывода).

numSamples = 4000;
R = 0.02;
src = dsp.SignalSource;
src.Signal = [ones(numSamples/4,1);-3*ones(numSamples/4,1);...
    4*ones(numSamples/4,1); -0.5*ones(numSamples/4,1)];
tScope = dsp.TimeScope('NumInputPorts',3,'TimeSpan',numSamples, ...
    'TimeUnits','Seconds','YLimits',[-5 5], ...
    'ShowLegend',true); % Create the Time Scope
kalman = dsp.KalmanFilter('ProcessNoiseCovariance', 0.0001,...
    'MeasurementNoiseCovariance',R,...
    'InitialStateEstimate',5,...
    'InitialErrorCovarianceEstimate',1,...
    'ControlInputPort',false); %Create Kalman filter

Добавьте шум в скаляр и передайте результат Фильтру Калмана. Передайте данные потоком и постройте отфильтрованный сигнал.

while(~isDone(src))
   trueVal = src();
   noisyVal = trueVal + sqrt(R)*randn;
   estVal = kalman(noisyVal);
   tScope(noisyVal,trueVal,estVal);
end

Примечание: Если вы используете R2016a или более ранний релиз, заменяете каждый вызов объекта с эквивалентным синтаксисом шага. Например, obj (x) становится шагом (obj, x).

Создайте сигнал, Фильтр Калмана и Системные объекты Осциллографа Времени.

numSamples = 4000;
R = 0.02;
src = dsp.SignalSource;
src.Signal = [  ones(numSamples/4,1);-3*ones(numSamples/4,1);...
              4*ones(numSamples/4,1);-0.5*ones(numSamples/4,1)];
tScope = dsp.TimeScope('NumInputPorts',3,'TimeSpan',numSamples, ...
          'TimeUnits','Seconds','YLimits',[-5 5],...
          'Title',['True(channel 1),noisy(channel 2) and ',...
          'estimated(channel 3) values'], ...
          'ShowLegend', true);
kalman = dsp.KalmanFilter('ProcessNoiseCovariance',0.0001,...
          'MeasurementNoiseCovariance',R,...
          'InitialStateEstimate',5,...
          'InitialErrorCovarianceEstimate',1,...
          'ControlInputPort',false);
ctr = 0;

Добавьте шум в сигнал. Передайте данные потоком и постройте отфильтрованный сигнал.

while(~isDone(src))
    trueVal = src();
    noisyVal = trueVal + sqrt(R)*randn;
    estVal = kalman(noisyVal);
    tScope(trueVal,noisyVal,estVal);

    % Disabling the correction step of second filter for the middle
    % one-third of the simulation
    if ctr == floor(numSamples/3)
        kalman.DisableCorrection = true;
    end
    if ctr == floor(2*numSamples/3)
        kalman.DisableCorrection = false;
    end
    ctr = ctr + 1;
end

Примечание: Если вы используете R2016a или более ранний релиз, заменяете каждый вызов объекта с эквивалентным синтаксисом шага. Например, obj (x) становится шагом (obj, x).

Создайте сигнал, где столбцы являются этими двумя скалярными значениями, которые будут прослежены. Также создайте Фильтр Калмана и Осциллографы Времени.

numSamples = 4000;
R = 0.02;
src = dsp.SignalSource;
sig1 = [  ones(numSamples/4,1);   -3*ones(numSamples/4,1);...
         4*ones(numSamples/4,1); -0.5*ones(numSamples/4,1)];
sig2 = [-2*ones(numSamples/4,1);   4*ones(numSamples/4,1);...
        -3*ones(numSamples/4,1); 1.5*ones(numSamples/4,1)];

src.Signal = [sig1, sig2];

tScope1 = dsp.TimeScope('NumInputPorts', 3, 'TimeSpan', numSamples, ...
           'TimeUnits', 'Seconds', 'YLimits',[-5 5], ...
           'Title', ['True(channel 1), noisy(channel 2) and ',...
           'estimated(channel 3) values'], ...
           'ShowLegend', true);
tScope2 = clone(tScope1);
kalman = dsp.KalmanFilter('ProcessNoiseCovariance', 0.0001,...
    'MeasurementNoiseCovariance', R,...
    'InitialStateEstimate', -3,...
    'InitialErrorCovarianceEstimate', 1,...
    'ControlInputPort',false);

Добавьте шум в сигнал. Передайте данные потоком и постройте отфильтрованный сигнал.

while(~isDone(src))
    trueVal = src();
    noisyVal = trueVal + sqrt(R)*randn(1,2);
    estVal = kalman(noisyVal);
           % Plot results of first channel on Time Scope
    tScope1(trueVal(:,1),noisyVal(:,1),estVal(:,1));
           % Plot results of second channel on Time Scope
    tScope2(trueVal(:,2),noisyVal(:,2),estVal(:,2));
end

Примечание: Если вы используете R2016a или более ранний релиз, заменяете каждый вызов объекта с эквивалентным синтаксисом шага. Например, obj (x) становится шагом (obj, x).

Используйте модульный шаг в качестве входа управления, чтобы отследить сигнал пандуса. Создайте сигнал пандуса, который будет прослежен, вход управления, Осциллограф Времени и Фильтр Калмана.

numSamples = 200;
R = 100;
src = dsp.SignalSource;
src.Signal = (1:numSamples)';
control = dsp.SignalSource;
control.Signal = ones(numSamples,1);

tScope = dsp.TimeScope('NumInputPorts', 3, 'TimeSpan', numSamples, ...
    'TimeUnits', 'Seconds', 'YLimits',[-5 205], ...
    'Title', ['Noisy(channel 1), True(channel 2) and ',...
    'estimated(channel 3) values'], ...
    'ShowLegend', true);
kalman = dsp.KalmanFilter('ProcessNoiseCovariance', 0.0001,...
    'MeasurementNoiseCovariance', R,...
    'InitialStateEstimate', 1,...
    'InitialErrorCovarianceEstimate', 1);

Добавьте шум в сигнал. Отфильтруйте сигнал с помощью фильтра Калмана. Просмотрите вывод, использующий осциллограф времени.

while(~isDone(src))
    trueVal = src();
    ctrl = control();
    noisyVal = trueVal + sqrt(R)*randn;
    estVal = kalman(noisyVal,ctrl);
    tScope(noisyVal,trueVal,estVal);
end

Алгоритмы

Этот объект реализует алгоритм, входные параметры и выходные параметры, описанные на странице с описанием блока Kalman Filter. Свойства объектов соответствуют параметрам блоков.

Ссылки

[1] Грег Уэлч и Гэри Бишоп, введение в фильтр Калмана, технический отчет TR95 041. Университет Северной Каролины в Чапел-Хилле: Чапел-Хилл, NC., 1995.

Расширенные возможности

Смотрите также

Блоки

Введенный в R2013b

Для просмотра документации необходимо авторизоваться на сайте