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

Сглаживание данных при помощи сверточных фильтров

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

Чтобы продемонстрировать работу свертки, выведем контурную диаграмму, данные которой будут выступать в роли нашего эталонного сигнала.

In [ ]:
include( "$(@__DIR__)/peaks.jl" );
gr()
x,y,z = peaks(;n=100)
levels = -7:1:10;
contour( z, lc=:viridis, cbar=false, levels=levels )
Out[0]:

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

In [ ]:
z_noise = z .+ rand(100,100) .- 0.5;
contour( z_noise, lc=:viridis, cbar=false, levels=levels )
Out[0]:

В предустановленную библиотеку DSP входит функция conv, которая позволяет выполнить свертку n-мерных данных с ядром соответствующей размерности. Иногда даже небольшого ядра свертки достаточно для того, чтобы сгладить сигнал, в котором содержится небольшой набор гармонических компонентов. А использование в качестве ядра матрицы большего размера позволяет лучше сглаживать сигнал.

In [ ]:
using DSP

K = (1/9)*ones(3,3);
z_smooth1 = conv( z_noise, K );
contour( z_smooth1, levels=levels, lc=:viridis, cbar=false )
Out[0]:

Напоследок, проверим работу свертки с ядром размером 5 на 5 элементов.

In [ ]:
K = (1/25)*ones(5,5);
z_smooth2 = conv(z_noise, K);
contour( z_smooth2, levels=levels, lc=:viridis, cbar=false )
Out[0]:

Заключение

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