【技术专辑】查找噪声数据中的最大值

详细了解数据中的噪声类型,如何平滑噪声以及如何识别噪声中的最大值。

 

在处理传感器和实时数据分析时,噪声和干扰可能使信号处理更加困难。数据中的噪声使信号处理更加困难。在本文中,我们将首先研究噪声类型,然后我们将尝试通过过滤数据来消除它们。最后,我们将尝试在该数据中找到峰值。

 

噪声类型

 

电子电路中的噪声是不可避免的。例如,您可以看到图1中模拟信号中噪声的影响。 

 

【技术专辑】查找噪声数据中的最大值

图1. 噪声数据

 

已经识别和表征了许多类型的噪声。处理噪声是电子学中的一个广泛主题,需要大量的知识。例如,我们可以以各种方式设计放大器或传感器,以便它们具有低噪声。过滤信号以降低噪声取决于存在的噪声类型,并且可以根据噪声类型以特定方式完成。但是,在本文中,我们将尝试在没有任何偏好的情况下解决噪声问题,并假设信号通常是低频信号,如传感器输出。

 

模拟电路中常见的噪声类型:

 

•热噪声:也称为约翰逊 - 奈奎斯特噪声,由电荷中的随机运动产生,即使没有电压也会发生这种情况。

 

•散粒噪声:由于离散电子的到达时间而发生。

 

•闪烁噪声:所有电子设备中都会产生粉红色的噪声。

 

•突发噪声:信号电平的波动很小,就像信号电平的步骤一样。

 

•量化误差:将模拟信号转换为数字信号时会发生这种效应。

 

也可以从外部源向电路引入噪声。这称为耦合噪声,类型可简化为:

 

•串扰:信号在一条线路上传输并对近线或其他信道产生干扰的噪声源。

 

•干扰:其他外部噪声源会对信号产生不良影响。

 

噪声是一种非线性系统,可以改变信号规格。在频谱方面,非线性系统可以改变信号的中心频率或产生边带谐波,或者它可以通过向频谱添加其他频率来增加带宽。许多噪声(如白噪声)只会增加信号频谱的频率,并模糊真实信号的提取。在本文中,我们假设信号的中心频率要么不会改变,要么只会稍微改变,以便我们可以假设我们的系统是线性的。然而,为了改善SNR,我们需要消除由噪声引起的频谱中的其他频率。

 

根据以上所述,如果您想要找到如下图所示的实时数据系列的峰值,您可能会面临这样一个事实:如果您只是尝试使用差异化,那么每个点都是峰值。由于这些数据有很多波动和变化,我们应该平滑它并消除不需要的频率。

 

窗口化

 

处理实时数据有点不可能。我们只能使用一个点来获取大量信息,这是我们当前的输出。因此,我们应该考虑在窗口中处理数据,即在一定时期内采样的一系列点。

 

首先,我们应该抓住一组点并开始处理。这是窗口化的基本思想。窗口随数据移动,每次都给我们一系列数据。窗户的大小应由设计师根据其规格设定。随着窗口变得越来越大,数据处理越来越远离实时。

 

在这个例子中,我的窗口大小约为1500点,如图2所示。

 

【技术专辑】查找噪声数据中的最大值

图2.实时噪声数据

 

正常化

 

信号的另一个好的过程是阈值处理。阈值处理是我们为信号的每个点与其先前值之间的变化设置阈值的过程。通过这种方式,我们可以减少信号的弹跳。我们可以将每个点设置为相对于其先前点在一定量上更高或更低,否则,它应该与前一点相同。然而,设置阈值可取决于信号值。例如,在具有巨大幅度阈值的信号中,与具有较低幅度的信号不同。在电子学和数学中,我们可以通过归一化来消除幅度变化的影响。归一化意味着将信号幅度置于0到1之间,即[0 1]。

 

用C#编写的代码片段将用于此目的。

 

List res = new List();

 

double max = double.MinValue;

 

double min = double.MaxValue;

 

for (int i=0;i

 

{

 

       if (data[i] > max) max = data[i];

 

       if (data[i] < min) min = data[i];

 

}

 

for (int i = 0; i < data.Count; i++)

 

{

 

       res.Add( (data[i] - min) / (max - min));

 

}

 

return res;

                  

归一化后,窗口将如图3所示。如您所见,其总最大值为1,归一化消除了信号偏移。

 

【技术专辑】查找噪声数据中的最大值

图3.规范化窗口

 

平滑

 

如果我们了解系统的动态,噪声源及其规格,那么信号的噪声去除是一个复杂的过程,可以进行优化。如果我们知道所需信号的规格并假设我们的系统几乎是线性的,我们可以用非常窄的带通滤波器滤除噪声数据并提取所需的信号。但是,在很多情况下,我们要么无法访问规范,要么我们没有适当的工具来测量它们。例如,在我们的案例中,我们无法设置一个非常强大的测量环境。所以我们将在没有任何细节的情况下解决此案

 

通常,传感器不是非常快的设备。因此,它们的输出不会以快速变化,这意味着它们的输出处于低频带。当我们尝试从PC同时读取其输出而不使用任何额外设备时,这会变得更糟。因为PC通常具有有限的定时资源,并且像Windows这样的OS不允许实时操作。因此,我们可以假设信号处于低频带频率,这意味着我们可以通过使用低通滤波器来增加SNR 

 

可以使用IIR或FIR滤波器完成数字滤波。在相同规范中,IIR通常具有比FIR更低的复杂度,但在某些情况下,由于使用先前输出引起的正极,它们可能变得不稳定。因此,由于我们没有关于输入频率和极点的任何信息,我们选择FIR滤波器以确保稳定性。FIR方程示例如下:

 

 【技术专辑】查找噪声数据中的最大值

 

设计FIR滤波器需要大量工作,并且可以通过MATLAB等工具和程序来执行。但是,由于我们的情况下缺少规范,我们应该限制输入参数以尽快简化我们的程序。我们还想尽快处理数据,这就是我们选择高斯滤波器的原因。在高斯滤波器中,可以使用高斯函数计算系数,并且我们可以假设sigma作为参数。

 

高斯滤波器具有最低的群延迟以及其他滤波器,这使其适合于以快速速度平滑实时数据。

 

该代码通过使用具有特定西格玛的高斯函数来产生FIR系数。

 

List x = new List();

 

List gf = new List();

 

for (int i = 0; i < sz; i++)

 

{

 

       double k = (-sz / 2) + i * (sz / (sz - 1));

 

       x.Add(k);

 

       double  gF = Math.Exp(-(Math.Pow(k, 2)) / (2 * (Math.Pow(sigma, 2))));

 

       gf.Add(gF);

 

}

 

for (int i = 0; i < sz; i++)

 

{

 

       gf[i]=(gf[i])/ gf.Sum();

 

}

 

And then we can implement a simple FIR filter with this function:

 

int M = b.Count;

 

int n = x.Count;

 

List y = new List();

 

for (int yi = 0; yi < n; yi++)

 

{

 

       double t = 0.0;

 

       for (int bi = M - 1; bi >= 0; bi--)

 

       {

 

              if (yi - bi < 0) continue;

 

 

 

              t += b[bi] * x[yi - bi];

 

       }

 

       y.Add(t);

 

}

return y;

                  

平滑后,我们的噪声数据将如图4所示。它有一点偏移但我们可以假设偏移是线性的并用偏移补偿它。

 

【技术专辑】查找噪声数据中的最大值

图4.平滑窗口

 

寻找峰值

 

我们的窗户现在已经过平滑处理,并且由于噪音而没有太大的波动。在这个层面上,我们可以使用简单的数学理论来寻找最大值。在最大值中,该点应该大于其接近点。或者我们可以计算每个点的梯度,并检查点积分在积极的一段时间后突然变为负值的区域。为了获得更好的精度,我们甚至可以在梯度中设置一个阈值,即如果其梯度大于阈值,我们可以选择一个点作为峰值,该阈值可由设计人员通过实验调整以获得最佳SNR。

 

该功能将执行以上描述。

 

List y = new List();

 

int d = 10;

 

int s=data.Count();

 

for(int i=d;i

 

{

 

       bool h = true;

 

       for(int j=i-d+1;j

 

       {

              if (data[j - 1] > data[j])

 

              {

                     h = false;

                     break;

              }

       }

       if (h == false)

       {

              continue;

       }

       h = true;

       for (int j = i; j < i+d-1; j++)

       {

              if (data[j + 1] > data[j])

              {

                     h = false;

 

                     break;

             }

       }

       if (h == false)

       {

              continue;

       }

       double[] p = new double[2];

       p[0] = step[i];

       p[1] = data[i];

       y.Add(p);

}

return y;

                  

在我们的窗口中运行此功能后,我们得到如图5所示的峰值。在该图中,显示了该过程之前和之后的噪声数据。

 

【技术专辑】查找噪声数据中的最大值

图5.  平滑窗口及其峰值与实际噪声数据的比较

 

结论

 

在本文中,我们实现了一种简单的方法来提取实时噪声数据中的峰值。在此实现中,我们没有使用任何信号或噪声规范。如果已知有关数据的某些细节,则可以改进该方法。

  • 【技术专辑】查找噪声数据中的最大值已关闭评论
    A+
发布日期:2019年03月04日  所属分类:参考设计