Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы / 1 / Л1_Малышев_Кузнецов.docx
Скачиваний:
0
Добавлен:
12.02.2026
Размер:
638.13 Кб
Скачать

3. Экспоненциальное скользящее среднее (ema - Exponential Moving Average)

𝐸𝑀𝐴𝑖 – текущее значение экспоненциальной средней, 𝑋𝑖 - текущее значение отсчета, К– коэффициент сглаживания, значения которого определяют по формуле k=2/(n+1), n – порядок средней.

Отчёт о проделанной работе

В ходе работы была разработана программа, рассчитывающая простое и взвешенное скользящее среднее для сигнала с разными размерами окон.

На рисунке 2 представлены графики исходного сигнала (синий) и сигнала, обработанного простым скользящим средним с окнами равными 60 сек (красный), 120 сек (жёлтый) и 180 сек (фиолетовый).

Рисунок 2 – График сигналов для простого скользящего среднего

На рисунке 3 представлены фрагменты тех же графиков, но в увеличенном масштабе по оси времени.

Рисунок 3 – Увеличенный по оси времени график сигналов для SMA.

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

На графиках 4 и 5, представлены графики, аналогичные графикам, представленным на графиках 2 и 3, однако в этот раз обработка сигнала проводилась линейно взвешенным скользящим средним.

Рисунок 4 – График сигналов для WMA

Рисунок 5 – Увеличенный по оси времени график сигналов для WMA.

Исходя из полученных графиков, можно сделать выводы, аналогичные предыдущим.

Сравним используемые методы, на рисунке 6 показаны графики основного сигнала и сигнала, обработанного SMA и WMA с окном 60 сек. На рисунках 7-9 показаны увеличенные по оси времени графики основного сигнала и сигнала, обработанного SMA и WMA с окнами 60 сек, 120 сек и 180 сек соответственно.

Рисунок 6 – Графики сигналов

Рисунок 7 – Увеличенный по оси времени график сигналов для окна 60 сек

Рисунок 8 – Увеличенный по оси времени график сигналов для окна 120 сек

Рисунок 9 – Увеличенный по оси времени график сигналов для окна 180 сек

Как видно из полученных графиков, оба метода сглаживают сигнал, однако метод линейно взвешенного скользящего среднего более отзывчиво отвечает на изменение сигнала, из-за чего более чётко отражает изменчивость сигнала, особенно это заметно при окне 120 сек (рис. 8).

Вывод

В ходе работы была разработана программа для расчёта скользящего среднего разными методами для разных размеров окна.

При изучении влияния размера окна фильтра скользящего среднего на результаты фильтрации (на примере 10-ти секундного тренда ЧСС), было выяснено, что выходной сигнал становится более гладким и менее изменчивым при увеличении размера окна.

При сравнении результатов использования методов SMA и WMA было выяснено, что WMA лучше отражает изменчивость исходного сигнала.

Приложение 1 Листинг программы

close all;

% П1. Загрузка данных

hr10 = table2array(readtable("hr10.csv"));

Fd = 0.1; % Част. диск.

T = 1/Fd; % Пер. Диск.

N = 13; % Вариант

% П2. Выбор фрагмента согласно варианту

signal = hr10(((N/10)*3600/T):length(hr10), 1);

% Создаём временныее отсчёты

t = duration (0,0,(N/10)*3600:10:length(hr10)*10,"Format","hh:mm:ss");

% Создаём окно №1

figure("Name","Simple Moving Average");

% П3-7. Рассчитываем простое

% скользящее среднее для окон:

% 60 сек

output_60 = sma(signal,60,T);

% 120 сек

output_120 = sma(signal,120,T);

% 180 сек

output_180 = sma(signal,180,T);

% Активируем график 1

% Выводим на него основной сигнал

% И сглаженные сигналы с разными окнами

subplot(1,2,1);

plot(t,signal);

grid on;

hold on;

plot(t,output_60);

hold on;

plot(t,output_120);

hold on;

plot(t,output_180);

hold on;

legend("Original", "30 sec window", "100 sec window", "200 sec window");

title("Full Time Series");

% Активируем график 2

% Выводим на него те же сигналы,

% но увеличенные (первые 200 отсчётов)

subplot(1,2,2);

plot(t(1:200),signal(1:200));

grid on;

hold on;

plot(t(1:200),output_60(1:200));

hold on;

plot(t(1:200),output_120(1:200));

hold on;

plot(t(1:200),output_180(1:200));

hold on;

legend("Original", "30 sec window", "100 sec window", "200 sec window");

title("Magnified Time Series");

% Создаём окно №2

figure("Name","Weighted Moving Average");

% П8-10. Рассчитываем линейное

% взвешенное скользящее среднее

% для окон размером: 60 сек

output_60 = wma(signal,60,T);

% 120 сек

output_120 = wma(signal,120,T);

% 180 сек

output_180 = wma(signal,180,T);

% На график 1 выводим сигналы

subplot(1,2,1);

plot(t,signal);

grid on;

hold on;

plot(t,output_60);

hold on;

plot(t,output_120);

hold on;

plot(t,output_180);

hold on;

legend("Original", "30 sec window", "100 sec window", "200 sec window");

title("Full Time Series");

% На график 2 увеличенные сигналы (первые 200 отсчётов)

subplot(1,2,2);

plot(t(1:200),signal(1:200));

grid on;

hold on;

plot(t(1:200),output_60(1:200));

hold on;

plot(t(1:200),output_120(1:200));

hold on;

plot(t(1:200),output_180(1:200));

hold on;

legend("Original", "30 sec window", "100 sec window", "200 sec window");

title("Magnified Time Series");

% Создаём новое окно 3 для сравнения методов

figure("Name","Tests compare with windows size = 60 sec");

% Рассчитываем Скольз. Сред.

output_sma_60 = sma(signal,60,T);

output_wma_60 = wma(signal,60,T);

output_sma_120 = sma(signal,120,T);

output_wma_120 = wma(signal,120,T);

output_sma_180 = sma(signal,180,T);

output_wma_180 = wma(signal,180,T);

% На график 1 выводим графики для окна 60 сек

subplot(2,2,1);

plot(t, signal, "Color","#aaaaaa");

grid on;

hold on;

plot(t, output_sma_60);

grid on;

plot(t, output_wma_60);

legend("Original", "SMA", "WMA");

title("Full Time Series, windows = 60 sec");

% На график 2 увеличенные графики для окна 60 сек

subplot(2,2,2);

plot(t(1:200), signal(1:200), "Color","#aaaaaa");

grid on;

hold on;

plot(t(1:200), output_sma_60(1:200));

grid on;

plot(t(1:200), output_wma_60(1:200));

legend("Original", "SMA", "WMA");

title("Magnified Time Series, windows = 60 sec");

% На график 3 увеличенные графики для окна 120 сек

subplot(2,2,3);

plot(t(1:200), signal(1:200), "Color","#aaaaaa");

grid on;

hold on;

plot(t(1:200), output_sma_120(1:200));

grid on;

plot(t(1:200), output_wma_120(1:200));

legend("Original", "SMA", "WMA");

title("Magnified Time Series, windows = 120 sec");

% На график 4 увеличенные графики для окна 180 сек

subplot(2,2,4)

plot(t(1:200), signal(1:200), "Color","#aaaaaa");

grid on;

hold on;

plot(t(1:200), output_sma_180(1:200));

grid on;

plot(t(1:200), output_wma_180(1:200));

legend("Original", "SMA", "WMA");

title("Magnified Time Series, windows = 180 sec");

% Функция расчёта простого скользящего среднего

function [outputArray] = sma(inputArray,windowSize, T)

% Перевод размера окна из секунд в отсчёты

windowSize = windowSize/T;

bufer = zeros(windowSize, 1); %Буфер

% Создаём выходной массив

outputArray = zeros(length(inputArray), 1);

% Валидация размера окна

if windowSize < 1

windowSize = 1;

end

if windowSize > length(inputArray)

windowSize = length(inputArray);

end

% Основной расчёт

for i = 1:length(inputArray)

% Если элементов меньше или равно размеру окна

% Рассчитывается среднее значение для последних

% i элементов.

if i <= windowSize

% Заполняем буфер

bufer(1:i) = inputArray(1:i);

% Среднее значение буфера

outputArray(i) = sum(bufer)/i;

% Если элементов больше размера окна, то

% рассчитывается среднее значение для окна

else

bufer(1:windowSize) = inputArray(i-(windowSize-1):i);

outputArray(i) = sum(bufer)/windowSize;

end

end

end

% Функция расчёта линейно взвеш. скольз. сред.

function [outputArray] = wma(inputArray,windowSize, T)

% Перевод размера окна из секунд в отсчёты

windowSize = windowSize/T;

bufer = zeros(windowSize, 1); %Буфер

% Создаём выходной массив

outputArray = zeros(length(inputArray), 1);

% Валидация размера окна

if windowSize < 1

windowSize = 1;

end

if windowSize > length(inputArray)

windowSize = length(inputArray);

end

% Основной расчёт

for i = 1:length(inputArray)

% Временная сумма = 0

tempSumm = 0;

% Если элементов меньше или равно размеру окна

% Рассчитывается среднее значение для последних

% i элементов.

if i <= windowSize

% Заполняем буфер i элементами

bufer(1:i) = inputArray(1:i);

for j = 1:i

w = j; % Вес равен номеру

% Прибавляем к сумме элемент умноженный на вес

tempSumm = tempSumm + bufer(j)*w;

end

% Делим сумму на сумму весов

outputArray(i) = tempSumm/sum(1:i);

% Если элементов больше размера окна, то

% рассчитывается среднее значение для окна

else

% Заполняем буфер

bufer(1:windowSize) = inputArray(i-(windowSize-1):i);

for j = 1:windowSize

w = (i-windowSize+j); % Вес равен номеру

% Прибавляем к сумме элемент умноженный на вес

tempSumm = tempSumm + bufer(j)*w;

end

% Делим сумму на сумму весов

outputArray(i) = tempSumm/sum(i-(windowSize-1):i);

end

end

end

Соседние файлы в папке 1