Engee 文档
Notebook

使用EngeeDSP进行时域分析处理

我们正在使用时域信号分析和处理的例子来熟悉EngeeDSP的功能。

时域信号分析和处理是一种处理信号的方法,我们考虑其随时间变化的基本参数。 该分析有助于从"原始"信号中提取重要的数值特征。:

  1. 幅度分析:峰值、平均值(常数分量)、均方根值等。

  2. 时间分析:信号持续时间,脉冲重复率,前上升率。

  3. 波形:失真分析,存在"尖峰"(异常值),衰减等。

处理允许您从信号中提取信息,更改其特征和统计指标,按级别缩放或平滑其形状。

这个例子的目的是可视化从真实传感器记录的信号,执行预处理,评估统计度量,局部极值,并切断不需要的异常值。

信号导入和可视化

来自传感器ADC的数据存储在文件中 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功能。 使用所描述的函数,您可以:

*测量信号的基本参数(幅度,持续时间)。

*可视化波形。

*清洁使用简单的操作(平均,滤波)从噪声和干扰的信号。

*准备信号进行更深入的分析,例如,使用傅立叶变换过渡到频域。