Документация Engee
Notebook

Усреднение сигнала

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

Описание модели

Самым простым способом усреднениям сигнала является суммирование всех имеющихся элементов и деление суммы на количество элементов в векторе. Если на входе мы получаем сигнал $s$, то последовательность выходных сигналов $y$ такого фильтра должна быть следующей:

$$y_1 = \frac{s_1}{1}$$

$$y_2 = \frac{s_1 + s_2}{2}$$

$$y_3 = \frac{s_1 + s_2 + s_3}{3}$$

$$\dots$$

На схеме собраны блоки суммирования (Sum) и взятия предыдущего значения (Delay). Верхняя половина модели отвечает за подсчет числителя в вышеприведенных выражениях, суммирует входные элементы. Нижняя часть модели суммирует константу 1 столько раз, сколько шагов симуляции было выполнено.

image.png

Сигнал, который мы усредняем, является просто результатом суммирования константы 1 с вектором равномерно распределенного шума с амплитудой 0.01. Спустя 500 отсчетов модели к сигналу добавляется ступенька амплитудой 1.

image.png

Запуск модели

Запустим модель при помощи средств программного управления.

In [ ]:
# Если модель еще не открыта, загрузим из файла
if "running_average"  getfield.(engee.get_all_models(), :name)
    engee.load( "$(@__DIR__)/running_average.engee");
end;

data = engee.run( "running_average" )
Out[0]:
Dict{String, DataFrame} with 2 entries:
  "Исходный"   => 2501×2 DataFrame…
  "Сглаженный" => 2501×2 DataFrame
In [ ]:
plot(
    plot( data["Исходный"].time, data["Исходный"].value, label="Исходный сигнал", legend=:bottomright),
    plot( data["Сглаженный"].time, data["Сглаженный"].value, label="Сглаженный сигнал", legend=:bottomright ),
    layout=(2,1)
)
Out[0]:

Преимущество такого вида фильтрации в быстрой изначальной настройке фильтра: после запуска модели выходной сигнал преодолел расстояние от 0 до 1 за несколько пару отсчетов и стабилизировался после нескольких десятков тактов моделирования.

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

Заключение

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

Блоки, использованные в примере