为了拆分数据,检测 xyz 数据中重复的最佳方法是什么?
听起来您有一组已知模式,并希望在信号中找到这些模式出现的位置。执行此操作的典型方法是使用互相关。在这种方法中,您将计算模式与信号的互相关。您可以将其视为重复地将模式移动一些滞后以使其与信号的不同部分对齐,然后获取模式的点积和信号的局部部分。这给出了每个滞后的模式和本地信号之间的相似性的度量。当信号与模式匹配时,这将表现为互相关中的峰值。
存在互相关的不同变体。例如,一些版本在本地缩放和/或规范化信号。如果您希望比较是移位/比例不变的(例如,您希望信号的形状相同,但不关心实际幅度;在检测加速度计模式的情况下,这可能会对应做同样的动作,但或多或少地用力)。
互相关自然会波动,反映模式和信号之间不同程度的相似性。因此,问题是如何区分代表“真正匹配”的峰与反映部分相似性的峰。您必须根据您使用的互相关变体来定义它。例如,如果模式在某个偏移量处完全匹配信号,则非归一化互相关的幅度将等于模式的平方$l_2$ 范数(即,模式与自身的点积)。互相关的一些归一化版本将具有最大幅度 1。您需要定义的另一件事是一些容差,以考虑信号中的噪声(您可能不希望需要精确匹配)。
另一种可能性是您想使用其他一些相似性度量(例如欧几里德距离)。在这种情况下,您可以使用互相关中的峰值来识别候选匹配,然后使用您喜欢的任何距离度量/相似度函数来检查它们。
使用互相关的主要原因之一是它的计算效率很高。对于大信号,您可以通过使用 FFT 在傅里叶域中计算来获得更快的速度。许多包/库可用于执行此操作。
互相关方法(和 FFT 加速)也适用于更高维度的信号(例如图像)。
如果您提前知道模式,您可以制作模式的哈希表,而模式检测只是对输入信号的段进行哈希处理并寻找冲突。传统的散列仅适用于精确、无噪声的输入信号。通过检查输入信号是否足够接近目标,可以使局部敏感散列对输入信号的微小变化不敏感。
如果活动在特定频带内呈正弦曲线,则可以使用频率对模式进行分类。为此,您对数据执行快速傅立叶变换 (FFT),并在结果功率谱中搜索全局最大值。使用不同的带通滤波器,您可以针对特定的频带。或者,您需要在全频带功率谱中搜索局部最大值。请注意,此方法不会考虑相位。
如果活动以不规则但可预测的模式为特征,您可以搜索信号翻转多少次(幅度改变方向)并设置不同的最大值和最小值标准或时间范围标准(例如,正翻转后负翻转在 300 毫秒内至少为 -0.5)。
如果您对数据进行基线校正- 对于 0 毫秒的事件 - 相对于某个先前点(例如 -100 毫秒到 0 毫秒),您可以计算过零的次数以获得模式的长度。基线校正取基线范围的全局最大值和最小值,并将信号集中在 $$\frac{max-min}{2}$$

