dsp.KalmanFilter

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

Описание

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

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

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

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

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

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

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

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

Создание

Описание

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 Используя Системные объекты.

Задайте 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.

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

Описание

пример

[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 = timescope('NumInputPorts',3,...
    'TimeSpanSource','Property','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).

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

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 = timescope('NumInputPorts',3,...
          'TimeSpanSource','Property','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).

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

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 = timescope('NumInputPorts', 3,...
           'TimeSpanSource','Property','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).

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

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

tScope = timescope('NumInputPorts', 3,...
    'TimeSpanSource','Property','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