我正在尝试编写一个程序来自动执行一项更无聊和重复的工作任务。我有一些编程经验,但没有处理或解释大量数据,所以我正在寻求你的建议(既有尝试技术的建议,也有阅读的东西,以了解更多关于这些东西的知识)。
我有一台设备通过重复采样来监控实验,并在屏幕上以图形的形式显示读数。实验的输入可以改变,其中一个变化应该在图形的一部分产生一个变化,我目前通过眼睛识别,这是我在实验中寻找的。我希望自动化它,以便计算机查看一组结果并找出导致更改的实验输入。
我已经可以从机器中提取结果了。目前,它们的运行结果是整数数组的形式,索引是样本编号,相应的值是测量值。
图表的整体形状对于每次实验运行都是类似的。我正在寻找的变化将大致相同,并且每次都会在大致相同的位置进行正确的实验输入。不幸的是,有一些陷阱使这个问题更加困难。
测量过程中存在一些噪音,这意味着不同运行之间的测量值存在一些随机变化。虽然图表的整体形状保持不变。
实验所用的时间因每次运行而略有不同,导致两种效果。首先,整个图形可以相对于另一个运行图形在x轴上稍微移位。其次,在不同的跑步中,个别特征可能会显得略宽或稍窄。
在这两种情况下,变化并不是特别大,您可以假设唯一的非随机变化是由正确的输入引起的。
答案 0 :(得分:2)
我认为您正在寻找有关Digital Signal Processing的信息。它可以从非常简单到非常难以理解。例如,如果您的事件前信号为0,并且相关信号之后的每个信号都是1,那么您可以查找前一个1,找出它发生的时间,然后您就完成了。这基本上是简单的限制性情况,它可能是一个很好的起点。实现这一点,你已经开始了解如何回答你的问题。那么,现在,你已经有了噪音。因此,事件发生前可能介于-10到10之间,事后可能介于90到110之间。注意第一个值大于10.但当然,它从未如此简单。您可能需要平均一个读数窗口,可能会寻找先前测量的一些变化阈值等。在高级情况下,您可能会发现自己使用转换到其他空间,应用过滤器,模式匹配等。但是根据你的描述,听起来相当简单的方法应该为你完成这项工作。不要被像FFT这样的概念所吓倒 - 你可能还不需要它们。至少现在,假设它可以简单地解决。从简单(但不充分)的解决方案开始,逐步找到有效的解决方案。
答案 1 :(得分:1)
值得关注的一项技术是,卡尔建议的过滤器和阈值方法是否足够Cross Correlation。其实质非常简单:如果两个数据集相当相似,它们的点积将在它们对齐时最大化(因为最高值将相乘)。因此,您可以通过在每个偏移处计算此产品并选择能够获得最高结果的产品来获得如何排列它们的良好估计。
在像您这样的情况下,我们的想法是拥有您正在寻找的曲线形状的“理想”版本 - 或者从理论/模拟生成,或者通过平均确定的一些好的实验曲线的结果并用眼睛对齐 - 并将其与实验数据进行比较。
为简单起见,我们假设数据集比理想值长,并且在任一端有足够的空白空间,我们可以忽略任何边界问题。由于您正在寻找一个特定事件,因此减少您的理想以遵守此假设应该是微不足道的。用Java粗略编码,过程可能会是这样的:
int offset ( double[] data, double[] ideal )
{
double cMax = -Double.MAX_VALUE;
int tMax = 0;
for ( int t = 0; t < data.length - ideal.length; ++t )
{
double c = 0;
for ( int i = 0; i < ideal.length; ++i )
{
c += data[t + i] * ideal[i];
}
if ( c > cMax )
{
cMax = c;
tMax = t;
}
}
return tMax;
}
显然,在很多情况下,这种方法可能会失败,特别是如果存在大量非独立噪声或者信号中存在导致aliasing的周期性。此外,这个例子抛弃了很多信息,只关注绝对最大值,如果在互相关中没有一个大的,窄的峰值,这可能是容易出错的。但是根据你的描述,似乎你的问题可以适用于这些方面。