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

smoothdata

Сглаживание зашумленных данных.

Библиотека

EngeeDSP

Синтаксис

Вызов функции

  • B = smoothdata(A) — сглаживает элементы A с помощью скользящего среднего. Функция smoothdata определяет размер скользящего окна на основе элементов A. Окно перемещается по длине вектора, вычисляя среднее значение по элементам каждого окна. Если A — матрица, то функция smoothdata вычисляет скользящее среднее по каждому столбцу A.

  • B = smoothdata(A, dim) — выполняет сглаживание по размерности dim матрицы A. Например, если A — матрица, то smoothdata(A, 2) сглаживает данные в каждой строке матрицы A.

  • B = smoothdata(___, method) — использует метод сглаживания method c любым предыдущим вариантом синтаксиса. Например, smoothdata(A, "sgolay") использует фильтр Савицкого — Голея для сглаживания данных в A.

  • B = smoothdata(___, method, window) — использует размер окна для метода сглаживания. Например, smoothdata(A, "movmedian", 5) сглаживает данные в A, вычисляя медиану по скользящему окну из 5 элементов.

  • B = smoothdata(___, nanflag) — также задает способ обработки значений NaN в A для любого из предыдущих вариантов синтаксиса. Например, smoothdata(A, "includenan") включает все значения NaN при сглаживании. По умолчанию smoothdata игнорирует значения NaN.

  • B = smoothdata(___, Name,Value) — использует дополнительные параметры для сглаживания, заданные одним или несколькими аргументами типа Name,Value.

  • B, winsize = smoothdata(___) — также возвращает размер скользящего окна.

Аргументы

Входные аргументы

# A — входные данные
вектор | матрица

Details

Входные данные, заданные как вектор или матрица.

Типы данных

Float32, Float64, Int8, Int16, Int32, Int64, UInt8, UInt16, UInt32, UInt64, Bool

Поддержка комплексных чисел

Да

# dim — измерение, по которому выполняется операция
скаляр

Details

Измерение, по которому выполняется операция, заданное как положительный целочисленный скаляр. Если измерение не указано, то по умолчанию используется первое измерение массива, размер которого не равен 1.

Рассмотрим входную матрицу A размером на :

  • smoothdata(A,1) сглаживает данные в каждом столбце матрицы A и возвращает матрицу на .

smoothdata 1

  • smoothdata(A,2) сглаживает данные в каждой строке матрицы A и возвращает матрицу на .

smoothdata 2

# method — метод сглаживания
"movmean" (по умолчанию) | "movmedian" | "gaussian" | "lowess" | "loess" | "rlowess" | "rloess" | "sgolay"

Details

Метод сглаживания, заданный одним из следующих значений:

  • "movmean" — среднее по каждому окну A. Этот метод полезен для уменьшения периодических трендов в данных.

  • "movmedian" — медиана по каждому окну A. Этот метод полезен для уменьшения периодических трендов в данных при наличии выбросов.

  • "gaussian" — гауссовское средневзвешенное по каждому окну A.

  • "lowess" — линейная регрессия по каждому окну A. Этот метод может быть вычислительно затратным, но приводит к меньшему количеству разрывов.

  • "loess" — квадратичная регрессия по каждому окну A. Этот метод более вычислительно затратен, чем "lowess".

  • "rlowess" — устойчивая линейная регрессия по каждому окну A. Этот метод является более вычислительно затратной версией метода "lowess", но более устойчив к выбросам.

  • "rloess" — робастная квадратичная регрессия для каждого окна A. Этот метод является более вычислительно затратной версией метода "lowess", но более устойчив к выбросам.

  • "sgolay" — фильтр Савицкого — Голея, который сглаживает данные в соответствии с квадратичным полиномом, подобранным для каждого окна A. Этот метод может быть эффективнее других методов, когда данные быстро меняются.

# window — размер окна
скаляр | двухэлементный вектор

Details

Размер окна, заданный как положительный целочисленный скаляр или двухэлементный вектор неотрицательных целых чисел. Функция smoothdata определяет окно относительно точек выборки.

  • Если window — это положительный целочисленный скаляр, то окно имеет длину window и центрируется относительно текущего элемента.

  • Если window — это двухэлементный вектор неотрицательных целых чисел [b f], то окно содержит текущий элемент, b предшествующих элементов и f последующих элементов.

Дополнительную информацию о положении окна см. в разделе Размер скользящего окна.

# nanflag — условие отсутствия значения
"omitmissing" (по умолчанию) | "omitnan" | "includemissing" | "includenan"

Details

Условие отсутствия значения, заданное одним из следующих значений:

  • "omitmissing" или "omitnan" — игнорировать значения NaN в A при сглаживании. Если все элементы в окне — NaN, то соответствующие элементы в B также NaN. Значения "omitmissing" и "omitnan" ведут себя одинаково.

  • "includemissing" или "includenan" — включить значения NaN в A при сглаживании. Если какой-либо элемент в окне — NaN, то соответствующие элементы в B также NaN. Значения "includemissing" и "includenan" ведут себя одинаково.

Входные аргументы «имя-значение»

Укажите необязательные пары аргументов в формате Name, Value, где Name — имя аргумента, а Value — соответствующее значение. Аргументы типа «имя-значение» должны располагаться после других аргументов, но порядок пар не имеет значения.

Используйте запятые для разделения имени и значения, а Name заключите в кавычки.

Пример: B = smoothdata([4.2, 3.8, 4.3, 5], "SmoothingFactor", 0.5).

# SmoothingFactor — коэффициент размера окна
скаляр

Details

Коэффициент размера окна, заданный как скаляр в диапазоне от 0 до 1. Как правило, значение SmoothingFactor регулирует уровень сглаживания, масштабируя размер окна, который функция smoothdata определяет на основе значений в A. Значения, близкие к 0, приводят к уменьшению размера окна, что приводит к меньшему сглаживанию. Значения, близкие к 1, приводят к увеличению размера окна, что приводит к большему сглаживанию. В некоторых случаях, в зависимости от значений, используемых smoothdata для определения размера окна, значение аргумента SmoothingFactor может не оказывать существенного влияния на размер окна.

По умолчанию значение аргумента SmoothingFactor равно 0.25. Указать SmoothingFactor можно только если не указано window.

# Degree — степень фильтра Савицкого — Голея
скаляр

Details

Степень фильтра Савицкого — Голея, заданная как неотрицательный целочисленный скаляр. Этот аргумент типа «имя-значение» может быть указан только в том случае, если выбран метод сглаживания "sgolay". Значение аргумента Degree соответствует степени полинома в фильтре Савицкого — Голея, который аппроксимирует данные в каждом окне. По умолчанию оно равно 2.

Значение аргумента Degree должно быть меньше размера окна для равномерных точек выборки. Для неравномерных точек выборки значение должно быть меньше максимального количества точек в любом окне.

Выходные аргументы

# B — сглаженные данные
вектор | матрица

Details

Сглаженные данные, возвращаемые в виде вектора или матрицы.

Аргумент B имеет тот же размер, что и A.

# winsize — размер окна
скаляр | двухэлементный вектор

Details

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

Если в качестве входного аргумента указано window, то winsize совпадает с window. Если в качестве входного аргумента не указано window, то функция smoothdata определяет размер окна на основе данных в A.

Примеры

Сглаживание данных с помощью скользящего среднего

Details

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

import EngeeDSP.Functions: smoothdata
using Plots, Random

Random.seed!(0)
x = 1:100
A = cos.(2π * 0.05 * x .+ 2π * rand()) .+ 0.5 * randn(100)
B = smoothdata(A)

plot(x, A, label="Input Data")
plot!(x, B, label="Smoothed Data")

smoothdata 8

Матрица зашумленных данных

Details

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

import EngeeDSP.Functions: smoothdata
using Plots, Random

Random.seed!(0)
x = 1:100
s1 = cos.(2π * 0.03 * x .+ 2π * rand(rng)) .+ 0.5 * randn(rng, 100)
s2 = cos.(2π * 0.04 * x .+ 2π * rand(rng)) .+ 0.4 * randn(rng, 100) .+ 5
s3 = cos.(2π * 0.05 * x .+ 2π * rand(rng)) .+ 0.3 * randn(rng, 100) .- 5

A = [s1'; s2'; s3']


B = smoothdata(A, 2)[1]

# Построение графиков
plot(x, B[1, :], label="s1")
plot!(x, B[2, :], label="s2")
plot!(x, B[3, :], label="s3")

smoothdata 9

Гауссов фильтр

Details

Сгладим вектор зашумленных данных с помощью фильтра скользящего среднего, взвешенного по Гауссу. Отобразим размер окна, используемого фильтром.

import EngeeDSP.Functions: smoothdata
using Plots, Random

Random.seed!(0)
x = 1:100
A = cos.(2π * 0.05 * x .+ 2π * rand(rng)) .+ 0.5 * randn(rng, 100)

B, winsize = smoothdata(A, "gaussian")

winsize
4.0

Сгладим исходные данные с помощью окна большего размера, содержащего 20 элементов. Построим график сглаженных данных для окон обоих размеров.

C = smoothdata(A, "gaussian", 20)[1]

plot(x, B, label="Small Window", linewidth=2)
plot!(x, C, label="Large Window", linewidth=2)

smoothdata 10

Дополнительно

Размер скользящего окна

Details

В этой таблице показано положение окна по вектору равномерно распределенных точек выборки по умолчанию [1 2 3 4 5 6 7].

Описание Размер окна и положение Точки выборки в окне Схема

Для скалярного размера окна передний край окна включается, а задний край окна исключается.

window = 3 Текущая точка выборки = 4

3, 4, 5

smoothdata 3

window = 4 Текущая точка выборки = 4

2, 3, 4, 5

smoothdata 4

Для определения размера векторного окна учитываются передний и задний край.

window = [2 2] Текущая точка выборки = 4

2, 3, 4, 5, 6

smoothdata 5

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

  • "movmean"

  • "movmedian"

  • "gaussian"

window = [2 2] Текущая точка выборки = 2

1, 2, 3, 4

smoothdata 6

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

  • "lowess"

  • "loess"

  • "rlowess"

  • "rloess"

  • "sgolay"

window = [2 2] Текущая точка выборки = 2

1, 2, 3, 4, 5

smoothdata 7

Алгоритмы

Если размер окна для метода сглаживания не указан, то функция smoothdata вычисляет размер окна по умолчанию на основе эвристики. Для коэффициента сглаживания эвристика оценивает размер окна скользящего среднего, который ослабляет примерно процентов энергии входных данных.