Kalman filter example for Kirillov A.N.

Выполнил: Басимов Владислав Альбертович (гр.22508)

Преподаватель: Кириллов Александр Николаевич

Введение. Постановка задачи

Фильтр Калмана — это алгоритм обработки данных, который убирает шумы и лишнюю информацию. На вход подаётся набор измерений. Предполагается, что эти измерения всегда наделены некоторой ошибкой –это обуславливается погрешностью измерительных приборов. В простейшем случае получаемые с помощью прибора измерения(сигнал) можно описать в виде суммы полезного сигнала и ошибки. Поскольку погрешность измерения есть у любого прибора, то она уже передается сразу вместе с сигналом, и нам, как раз, нужно найти этот исходный сигнал, убрав ошибку. В этом заключается задача фильтра Калмана, то есть, необходимо отфильтровать (отсеять) из полученного сигнала только истинное значение сигнала, а искажающий шум (ошибки измерения) убрать.(Kalman 1960)

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

Моделируется эксперимент, при котором в тихой комнате при помощи микрофона считывается некоторый гудящий звук, громкость которого постоянно увеличивается. В качестве входного сигнала для фильтра Калмана берется амплитуда звуковой волны. Амплитуда данного сигнала будет расти с течением времени (нарастающие колебания) – рис.1. При проведении эксперимента используется микрофон не очень хорошего качества, поэтому при считывании звука накладываются некоторые помехи на получаемый сигнал.

Фильтр Калмана. Пример

Амплитуда исходного сигнала удовлетворяет закону ниже и представлена на рис.1.

\begin{equation} a\cdot x(t)+t\cdot sin(t),\\ \\ \end{equation}

где \(a\) - некоторая заданная константа.

Поскольку предполагается, что моделирование эксперимента проводится в обычной комнате (не в профессиональной звукоизолирующей студии), то могут случайно попасть в измерения посторонние звуки-шумы, для обозначения которых введём случайную величину \(\xi_{k}\):

\begin{equation} x_{k}=a\cdot x(k)+k\cdot sin(k)+\xi_{k}\\ \\ \end{equation}

Микрофон при записи данных может накладывать свои помехи на входящий сигнал. Например, скачки напряжения, высокий износ микрофона, порождающий ненужные возмущения диафрагмы микрофона. По этой причине, на вход подается сигнал с помехами наблюдения \(\eta_{k}\):

\begin{equation} {y_{k}=b\cdot x_{k}+\eta_{k}}\\ \\ \end{equation}

где \(b=0.93\). Задача состоит в том, чтобы по некоторым не совсем верным показаниям сенсора \(z_{k}\) найти хорошее приближение для истинного вида амплитуды входящего сигнала \(x_{k}\), которое обозначим \(x_{k}^{opt}\).

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

\begin{equation} \left\{\begin{matrix}x_{k+1}=x_{k}+u{k}+\xi_{k}\\ y_{k}=x_{k}+\eta_{k}\end{matrix}\right.{}\\ \end{equation}

где \(u_{k}\) - это известная величина, контролирующая эволюцию системы, известная по построенной физической модели, \(\xi_{k}\) - ошибка модели (случайная величина), \(\eta_{k}\) - ошибка сенсора (случайная величина)

Нам известно:

  • cредние значения ошибок равны нулю: \(E\xi_{k}=E\eta_{k}=0\);

  • известны дисперсии случайных величин, которые не зависят от \(k\): \(\sigma_{\xi}^{2}\) и \(\sigma_{\eta}^{2}\)

  • все случайные ошибки независимы друг от друга.щз

Для описания работы алгоритма возьмем \(k\)-й шаг шаг и предположим, что для него уже найдено \(x_{k}^{opt}\) - значение, отфильтрованное фильтром Калмана, и которое довольно хорошо приближает истинное значение амплитуды. Поскольку заранее известно управление \(u\) из вашеописанной системы уравнений, то можно предположить, что на следующем шаге система изменится согласно этому закону и значение с сенсора будут близки к \(x_{k}^{opt}+u_{k}\).

Идея Калмана: необходимо получить наилучшее приближение к истинному значению амплитуды \(x_{k+1}\). Для этого нужно выбрать ”золотую середину” между показанием неточного сенсора и ожидаемым значением.(Khudaverdyan 2013)

Для этого введем Коэффициент Калмана \(K\), который зависит от шага итерации. Показанию сенсора будет соответствовать вес \(K_{k+1}\), а предсказанному значению \(1-K_{k+1}\):

\begin{equation} x_{k+1}^{opt}=K_{k+1}+y_{k+1}+(1-K_{k+1})\cdot(x_{k}^{opt}+u_{k}){}\\ \end{equation}

Необходимо выбрать коэффициент Калмана \(K_{k+1}\) таким, чтобы получившееся оптимальное значение амплитуды \(x_{k+1}^{opt}\) было бы наиболее близко к истинному .

В общем случае, для нахождения значения коэффициента Калмана необходимо минимизировать ошибку:

\begin{equation} e_{k+1}=x_{k+1}-x_{k+1}^{opt}.\\ \\ \end{equation}

Подставляя данное выражение в (2) получаем:

\begin{equation} \\ e_{k+1}=(1-K_{k+1})(e_{k+1}+\xi_{k+1})-K_{k+1}\cdot\eta_{k+1}\\ \\ \end{equation}

Для минимизации ошибки будем минимизировать среднее значение от квадрата ошибки:

\begin{equation} E(e^{2}_{k+1})\rightarrow min\\ \\ \end{equation}

Выражение выше принимает минимальное значение в том случае, когда производная равна нулю:

Коэффициент Калмана примет следующий вид:

\begin{equation} -2\cdot(1-K_{k+1})\cdot(Ee^{2}_{k}+\sigma_{\xi}^{2})+2\cdot K_{k+1}\cdot\sigma_{\eta}^{2}=0\\ \\ \end{equation}

Раскрываем скобки:

\begin{equation} -Ee^{2}_{k}–\sigma_{\xi}^{2}+K_{k+1}\cdot Ee^{2}_{k}+K_{k+1}\cdot\sigma_{\xi}+K_{k+1}\cdot\sigma_{\eta}^{2}=0\\ \\ \end{equation}

Коэффициент Калмана примет следующий вид:

\begin{equation} K_{k+1}=\frac{Ee^{2}_{k}+\sigma_{\xi}^{2}}{Ee^{2}_{k}+\sigma_{\xi}^{2}+\sigma_{\eta}^{2}}\\ \\ \end{equation}

Реализация. Результаты

Фильтр Калмана был реализован в программной среде MATLAB. Результат работы фильтра представлен на рис.2.

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

Рис.2 Результат работы фильтра Калмана

Ниже представлены значения сигнала, полученные на различных шагах (k) при использовании Фильтра Калмана.

  • Шаг 1. Реальное значение: 0

    Полученное значение: -61.1297

    Отфильтрованное значение: -61.1297

  • Шаг 2.

    Реальное значение: 1.1580

    Полученное значение: -66.0665

    Отфильтрованное значение: -47.8986

  • Шаг 3. Реальное значение: 1.3654

    Полученное значение: 67.8306

    Отфильтрованное значение: 7.8764

  • Шаг 4. Реальное значение: 0.6872

    Полученное значение: -6.3770

    Отфильтрованное значение: 1.6732

  • Шаг 5. Реальное значение: -1.7838

    Полученное значение: -16.6645

    Отфильтрованное значение: -5.0923

  • Шаг 6. Реальное значение: -4.6572

    Полученное значение: -21.5845

    Отфильтрованное значение: -9.7234

  • Шаг 7. Реальное значение: -2.9923

    Полученное значение: 28.6839

    Отфильтрованное значение: -1.4804

  • Шаг 8. Реальное значение: 2.8898

    Полученное значение: -40.5974

    Отфильтрованное значение: -1.7371

  • Шаг 9. Реальное значение: 8.3166

    Полученное значение: -5.7690

    Отфильтрованное значение: 5.6095

  • Шаг 10. Реальное значение: 7.4292

    Полученное значение: -13.5245

    Отфильтрованное значение: 4.4872

  • Шаг 20. Реальное значение: -5.8194

    Полученное значение: -13.5245

    Отфильтрованное значение: -4.8042

  • Шаг 30. Реальное значение: -8.8279

    Полученное значение: -41.5449

    Отфильтрованное значение: -9.3467

  • Шаг 40. Реальное значение: 34.3194

    Полученное значение: 46.4955

    Отфильтрованное значение: 34.8061

По рис.2 можно заметить, что амплитуда сигнала, отфильтрованного при помощи фильтра Калмана, достаточно хорошо приближена к исходной амплитуде входящего сигнала. Это свидетельствует о том, что фильтр Калмана достаточно хорошо справляется со своей задачей. По результатам выполнения программы, было вычислено среднее значение ошибки равное 8.36, при этом среднее значение дисперсии равно 17.64.

clear all; N=250; % количество измерений a = 0.5; % константа b = 0.93; % константа sigmaPsi=1; % некорр. помехи. sigmaEta=50; %ошибка измерений // Для нее посчитаем сред значение k=1:N; x=k; x(1)=0; %Начальное значение y(1)=x(1) + normrnd(0,sigmaEta);% доб. шум через ген. псевдослуч. числа по норм. з-ну %Фильтр калмана xOpt(1)=y(1); eOpt(1)=sigmaEta; for t=1:(N-1) x(t+1)=(a*x(t)+sin(t)*t)+normrnd(0,sigmaPsi); y(t+1)=b*x(t+1)+normrnd(0,sigmaEta); %накладываем ошибку на текущее измерение eOpt(t+1)=sqrt((sigmaEta^2)*(eOpt(t)^2+sigmaPsi^2)/(sigmaEta^2+eOpt(t)^2+sigmaPsi^2)); K(t+1)=(eOpt(t+1))^2/sigmaEta^2; xOpt(t+1)=(a*xOpt(t)+sin(t)*t)*(1-K(t+1))+K(t+1)*y(t+1); end; plot(k,xOpt,k,y,k,x)

References

  1. R. E. Kalman. A New Approach to Linear Filtering and Prediction Problems. Journal of Basic Engineering 82, 35 ASME International, 1960. Link

  2. D. Khudaverdyan. Kalman filter. david.wf, 2013. Link

[Someone else is editing this]

You are editing this file