基于反应事件的Scala流峰值检测

基于反应事件的Scala流峰值检测,scala,playframework,stream,reactive-programming,Scala,Playframework,Stream,Reactive Programming,我正在努力找出构造一个应用程序的最佳方法,这个应用程序本质上是一个峰值检测程序。在我的工作中,我负责开发一个系统,该系统基本上是观察数据流中的脉冲,并对峰值数据进行计算 目前,该软件是在LabVIEW中实现的。我相信在座的很多人都会理解我为什么希望看到那种环境的终结。我想在Scala中重新设计它(如果我想让它使用web前端,可能会使用Play),但我不确定如何最好地接近初始峰值检测组件 我看过许多不同语言的峰值检测教程,我从理论角度理解了许多算法。我不确定的是,我将如何从最常用的Scala/Pl

我正在努力找出构造一个应用程序的最佳方法,这个应用程序本质上是一个峰值检测程序。在我的工作中,我负责开发一个系统,该系统基本上是观察数据流中的脉冲,并对峰值数据进行计算

目前,该软件是在LabVIEW中实现的。我相信在座的很多人都会理解我为什么希望看到那种环境的终结。我想在Scala中重新设计它(如果我想让它使用web前端,可能会使用Play),但我不确定如何最好地接近初始峰值检测组件

我看过许多不同语言的峰值检测教程,我从理论角度理解了许多算法。我不确定的是,我将如何从最常用的Scala/Play方式来处理这个问题

显然,我不希望有人为我写代码,但我真的很感激任何关于我应该采取的最有意义的方向的指示。由于我对用例的描述不能太具体,我将试着在下面概述一下我要做的事情:

  • 与数据采集硬件接口,以发送控制电压并读取数据的“流”。
    • 我应该能够解决硬件方面的问题,但是是否有一个特定的结构最适合返回的流?我不一定提前知道我将读取多少数据,所以可以缓冲和分块的流可能是合适的
  • 在流中扫描以找到峰值,测量其高度并触发事件。
    • 峰值通常大约有20个样本宽,但这取决于采样率,所以我不想硬编码这样的东西。我认为滑动窗口是必要的,这样峰值就不会在缓冲区边缘被“切断”。当高峰到来时,我需要记录下来并采取行动。我认为反应流等可能是合适的,但我不确定。我将作出现场图表等数据,所以无论它是做我需要一种方法来发送一个成功的检测事件立即
  • 这些流可能相当长,并且采样率很高(最低为每秒250k采样),因此我不希望将整个流缓冲到内存中。唯一需要永久保存的信息是峰值电压数据。我需要一种方法来可视化原始流以进行校准,但我认为这应该非常简单
完整的应用程序要复杂得多,我需要对噪声和漂移进行一些初始过滤,但我相信,一旦我知道应该基于什么样的实现,我应该能够解决这个问题

我试着研究一下Play的迭代对象,但它们有点难以理解。如果它们是合适的,那么我很乐意学习它们,但因为我不确定这是否是解决问题的最佳方式,我想知道我应该去哪里寻找

反应式框架和类似的框架看起来确实很有趣,我可以看到如何真正轻松地围绕它们构建应用程序的其余部分,但我不确定如何最好地在它们之上实现流峰值检测功能,而不仅仅是在值超过阈值时触发(如前面提到的“峰值”)可能非常宽,且信号嘈杂)


任何建议都将不胜感激

这不是这个问题的解决方案,但我写这篇文章是为了回答这个问题,因为评论部分的空间/格式限制

由于您正在探索各种选择,我建议如下:

  • 假设您有足够大的缓冲区在内存中保留一个数据窗口(
    W=tXw
    ),您可以使用现有算法计算缓冲区的峰值。接下来,您可以在增量缓冲区(
    d
    )中收集接下来的几个样本数据(一个小得多的窗口)。增量缓冲区是增量的大小。假设这是时间序列数据,您可以通过从缓冲区
    W
    中删除第一个增量(
    dXt
    )值并向缓冲区添加
    d
    值,轻松创建新的滑动窗口。这就是Spark streaming如何在数据流上实现
    reduceByWindow
    功能
    Iteratee
    也可以在这里提供帮助

  • 如果您的系统是分布式的,那么您可以使用流处理系统(Storm、Spark streaming)来获得更好的延迟和吞吐量,而代价是分布式系统

  • 如果您确实是资源受限的,并且能够获得近似的有界结果,那么我建议您考虑实现概率数据结构的组合,例如,和


  • 这听起来正是反应流的用途。查看2014年ScalaDays的Viktor Klang和Roland Kuhn的演示,感谢您的快速响应!这是我看到的其中一次会谈,让我觉得他们是合适的。不幸的是,我不太清楚如何使用它们构建峰值分析部分-如果是一个简单的阈值检查(如果值>阈值生成或映射事件),我就可以了,但是如何查看反应流中可能重叠的部分/窗口,然后在分析每个“缓冲区”后将峰值数据输出到新流?@porl-你能接受近似的答案吗?或者你需要每个窗口中峰值的“精确”值吗?由于背景电平的噪声和漂移,所有测量中都存在误差,因此我不能说它们需要“精确”,但越接近越好。当前的算法非常简单,基本上是从超过阈值的点开始,然后向前读取,直到值下降到下面(或者超过宽度,在这种情况下,漂移被重新计算)。一旦这个缓冲区被创建,它被分成三个部分,中间部分的最大值与t进行比较