Сообщество Engee

Анализ и обработка во временной области с EngeeDSP

Автор
avatar-ussmoussmo
Notebook

Анализ и обработка во временной области с EngeeDSP

Знакомимся с функционалом EngeeDSP на примере анализа и обработки сигнала во временной области.

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

  1. Амплитудный анализ: пиковое значение, среднее значение (постоянная составляющая), среднеквадратичное значение (RMS) и проч.

  2. Временной анализ: длительность сигнала, частота следования импульсов, скорость нарастания фронта.

  3. Форма сигнала: анализ искажений, наличие "всплесков" (выбросов), затуханий и т.д.

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

Задача данного примера - визуализировать сигнал, записанный с реального датчика, выполнить предобработку, оценить статистические метрики, локальные экстремумы и отсечь нежелательные выбросы.

Импорт и визуализация сигнала

Данные с АЦП сенсора хранятся в файле data.txt. Считаем их в виде матрицы в переменную datamat:

In [ ]:
using DelimitedFiles
datamat = readdlm("data.txt")
Out[0]:
10000×2 Matrix{Float64}:
 0.0     0.0
 0.001   0.0
 0.002   0.0
 0.003   0.0
 0.004   0.0
 0.005   0.0
 0.006   0.0
 0.007   0.0
 0.008   0.0
 0.009   0.0
 0.01    0.0
 0.011   0.0
 0.012   0.0
 ⋮      
 9.988  -0.769358
 9.989  -0.764874
 9.99   -0.761144
 9.991  -0.76214
 9.992  -0.764418
 9.993  -0.763871
 9.994  -0.766009
 9.995  -0.763577
 9.996  -0.763095
 9.997  -0.764831
 9.998  -0.766074
 9.999  -0.767068

Выделим из неё отдельные вектора для времени и "сырых" значений, отобразим на графике во временной области:

In [ ]:
t = datamat[:,1];
original = datamat[:,2];
plot(t, original, xguide = "Время (с)", title = "Исходный сигнал", legend = false)
Out[0]:

Удаление постоянной составляющей

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

Избавимся от постоянной составляющей, при помощи функции detrend из набора функций EngeeDSP. Под капотом функции применяется метод приближения значений сигнала полиномом произвольного порядка, а затем рассчитанный полином вычитается из сигнала. В нашем случае, подходит полином 12-го порядка:

In [ ]:
sig = EngeeDSP.Functions.detrend(original, 12)
plot(t, sig, xguide = "Время (с)", title = "Сигнал без постоянной составляющей", legend = false)
Out[0]:

Статистика сигнала

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

Рассмотрим функции EngeeDSP для определения таких "популярных" метрик сигнала, как экстремумы, среднеквадратичное значение (RMS) и дисперсия. Но для начала оценим период дискретизации сигнала:

In [ ]:
dt = EngeeDSP.Functions.mean(diff(t))
Out[0]:
0.001

И частоту дискретизации сигнала:

In [ ]:
fs = 1/dt
Out[0]:
1000.0

Определим длительность дискретного сигнала - количество отсчётов в векторе sig:

In [ ]:
nsamples = length(sig)
Out[0]:
10000

Найдём максимальное значение и порядковый номер максимального отсчёта в численном векторе:

In [ ]:
maxval, maxidx = EngeeDSP.Functions.max(sig)
Out[0]:
(M = 0.21000776480728567, I = 3256)

То же самое для минимального значения. Это - абсолютные экстремумы сигнала:

In [ ]:
minval, minidx = EngeeDSP.Functions.min(sig)
Out[0]:
(M = -0.18815908552773913, I = 3254)

Зная их, можно определить размах сигнала:

In [ ]:
range = abs(maxval - minval)
Out[0]:
0.3981668503350248

Теперь подсчитаем среднее арифметическое (обратите внимание, оно по значению близко к нулю):

In [ ]:
EngeeDSP.Functions.mean(sig)
Out[0]:
1.7684215789515178e-10

Найдём среднеквадратическое значение (RMS):

In [ ]:
rmsval = EngeeDSP.Functions.rms(sig)
Out[0]:
0.021745540426125472

И дисперсию:

In [ ]:
EngeeDSP.Functions.var(sig)
Out[0]:
(V = 0.0004729158200062578, M = 1.7684215789515178e-10)

Анализ пиков сигнала

Зачастую, полезно уметь находить локальные экстремумы сигнала, или так называемые пики. Для этого воспользуемся функцией findpeaks. Функция возвращает величины и индексы пиков, а также (опционально) их ширину и выраженность. В качестве дополнительных входных аргументов укажем минимальную высоту пика и минимальное расстояние между соседними пиками:

In [ ]:
pks, locs, w, p = EngeeDSP.Functions.findpeaks(sig, out=:data, 
                                            MinPeakHeight = 0.08,
                                            MinPeakDistance = 500);
plot(t,sig, xguide = "Время (с)", label = false)
scatter!(t[locs], pks, label = "Пики")
Out[0]:

Выведем амплитуды и соответствующие им моменты времени программно. Также выведем ширину и выраженность:

In [ ]:
hcat(t[locs], pks, w, p)
Out[0]:
6×4 Matrix{Float64}:
 3.255  0.210008   2.29612  0.348882
 4.661  0.107894   3.94602  0.237671
 6.835  0.143331   2.1476   0.277283
 8.363  0.0834394  3.75173  0.176231
 8.909  0.11189    3.10714  0.208709
 9.651  0.0939499  5.35202  0.205565

Фильтр бегущей медианы

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

Избавимся от пиков при помощи нелинейного фильтра, а именно - бегущей медианы с окном в пятнадцать отсчётов. Для этого применим функцию movmedian:

In [ ]:
nospikes = EngeeDSP.Functions.movmedian(sig, 15);
plot(t,sig, xguide = "Время (с)", label = "До фильтра")
plot!(t, nospikes, linewidth = 2.5, label = "После фильтра")
Out[0]:

Проверим статистические метрики отфильтрованного сигнала:

In [ ]:
EngeeDSP.Functions.rms(nospikes)
Out[0]:
0.019490707144526026
In [ ]:
EngeeDSP.Functions.var(nospikes)
Out[0]:
(V = 0.00037992459672715685, M = -3.256879171607716e-5)
In [ ]:
newmax, maxidx = EngeeDSP.Functions.max(nospikes);
newmin, minidx = EngeeDSP.Functions.min(nospikes);
new_range = abs(newmax - newmin)
Out[0]:
0.12617180148957607

Заключение

Мы познакомились с функционалом EngeeDSP для задач визуализации, анализа и обработки сигналов во временной области. С применением описанных функций вы можете:

  • Измерять базовые параметры сигнала (амплитуда, длительность).

  • Визуализировать форму сигнала.

  • Очищать сигнал от шумов и помех с помощью простых операций (усреднение, фильтрация).

  • Подготавливать сигнал для более глубокого анализа, например, для перехода в частотную область с помощью преобразования Фурье.