День 3 Летней школы Julia
Часть 2: анализ и обработка во временной области
Попробуем визуализировать сигнал, записанный с реального датчика, выполнить предобработку, оценить статистические метрики, локальные экстремумы и отсечь нежелательные выбросы.
#Pkg.add("DelimitedFiles")
#Pkg.add("Statistics")
#Pkg.add("Polynomials")
#Pkg.add("FindPeaks1D")
#Pkg.add("FastRunningMedian")
using DelimitedFiles, Statistics, Polynomials, FindPeaks1D, FastRunningMedian
Данные с АЦП сенсора хранятся в файле data.txt. Считаем их в виде матрицы в переменную datamat:
datamat = readdlm("data.txt")
Выделим из неё отдельные вектора для времени и "сырых" значений, отобразим на графике во временной области:
t = datamat[:,1];
original = datamat[:,2];
plot(t, original)
Удаление постоянной составляющей
Мы приближаем значения сигнала полиномом произвольного порядка:
poly = fit(t, original, 12);
trend = poly.(t);
plot(t, original)
plot!(t, trend, linewidth = 4)
Избавимся от постоянной составляющей:
sig = original - trend;
plot(t, sig)
Статистика сигнала
Рассмотрим функции для определения "популярных" метрик сигнала, таких как экстремумы, среднеквадратическое отклонение (СКО) и дисперсия. Но для начала оценим частоту дискретизации сигнала:
dt = mean(diff(t))
fs = 1/dt
nsamples = length(sig)
maxval = maximum(sig)
minval = minimum(sig)
range = abs(maxval - minval)
mean(sig)
std(sig)
var(sig)
Анализ пиков сигнала
Зачастую, полезно уметь находить локальные экстремумы сигнала, или так называемые пики:
idx, properties = findpeaks1d(sig; height = range/4);
plot(t,sig)
scatter!(t[idx], sig[idx])
Выведем амплитуды и соответствующие им моменты времени программно:
hcat(t[idx], sig[idx])
Фильтр бегущей медианы
Избавимся от пиков при помощи нелинейного фильтра, а именно - бегущей медианы с окном в пять отсчётов:
nospikes = running_median(sig, 5);
plot(t,sig)
plot!(t, nospikes)
Проверим статистические метрики отфильтрованного сигнала:
std(nospikes)
var(nospikes)
abs(maximum(nospikes) - minimum(nospikes))