Усреднение сигнала¶
Как реализовать самый простой метод усреднения сигнала при помощи базовых блоков? Разберемся на примере простой модели, как разделить накопленную сумму на количество элементов в выборке и получить среднее арифметическое значение входного сигнала.
Описание модели¶
Самым простым способом усреднениям сигнала является суммирование всех имеющихся элементов и деление суммы на количество элементов в векторе. Если на входе мы получаем сигнал $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
столько раз, сколько шагов симуляции было выполнено.
Сигнал, который мы усредняем, является просто результатом суммирования константы 1
с вектором равномерно распределенного шума с амплитудой 0.01
. Спустя 500 отсчетов модели к сигналу добавляется ступенька амплитудой 1
.
Запуск модели¶
Запустим модель при помощи средств программного управления.
# Если модель еще не открыта, загрузим из файла
if "running_average" ∉ getfield.(engee.get_all_models(), :name)
engee.load( "$(@__DIR__)/running_average.engee");
end;
data = engee.run( "running_average" )
plot(
plot( data["Исходный"].time, data["Исходный"].value, label="Исходный сигнал", legend=:bottomright),
plot( data["Сглаженный"].time, data["Сглаженный"].value, label="Сглаженный сигнал", legend=:bottomright ),
layout=(2,1)
)
Преимущество такого вида фильтрации в быстрой изначальной настройке фильтра: после запуска модели выходной сигнал преодолел расстояние от 0 до 1 за несколько пару отсчетов и стабилизировался после нескольких десятков тактов моделирования.
Недостаток, как мы видим, в очень медленной реакции на последующие изменения. Чем длиннее предыстория сигнала, тем медленнее выходное значение фильтра отреагирует на ступеньку.
Заключение¶
Мы реализовали простой метод усреднения сигнала, который очень легко реализовать в виде графических блоков или в виде кода для обработки результатов симуляции.