在时域数据中查找周期长度

信息处理 优化
2022-02-07 12:03:05

p我对信号源进行了一系列测量,该信号源以秒的未知间隔时间发出周期性信号。检测信号并不容易,所以我在数据中遗漏了很多信号。数据也很嘈杂,因此每个信号的数据误差高达 +/- 10%。

示例测量x可能如下所示:

72.3, 185.1, 364.2, 570.2, 679.2, 1060.7

我正在寻找的结果是隐藏在测量值中的周期,p = ~100在本例中可能是最佳偏移量c = ~70

通常,我要分析的系列中有 4-7 个测量值,因此分析答案似乎比声音分析 (FFT) 更合适。

我考虑过的想法:

但我非常不确定我是否可能错过了声音分析阵营的明显解决方案(自相关、谐波频谱积、DFT,例如https://stackoverflow.com/questions/4716620/algorithm-to-determine-fundamental-frequency-来自潜在谐波)。

所以我转向 SO 的智慧。你将如何最优雅地解决这个问题?库建议很好(C++)。

1个回答

这真的让我想起了音乐信号中的节拍感应问题,在这个问题中,您必须从音符开始测量中推断出潜在的周期性网格。网格是“潜在的”——并不是因为一首曲目的频率为 120 BPM,它严格每 500 毫秒有一个四分音符——作曲家可以选择用二分音符,然后是八分音符来表达旋律......然后是重音(会改变脉冲的强度)和摆动(这会暂时改变它们)......

如果您真的想根据您在问题中描述的内容 - 时间戳列表 - 您需要计算时间增量的直方图,通过高斯窗口对其进行卷积以使其平滑(将彼此接近的增量合并在一起) ,然后评估直方图峰值的可能周期候选整数除数。这在本文的第 4.3 节中进行了描述

虽然它可能适用于您的情况,但我强烈建议您不要检测事件,而是尝试根据您的潜在原始信号估计周期。原因是检测过程丢弃了一些可能有助于周期估计过程的有价值的信息。例如,您在 72.3、185.1、364.2、570.2、679.2、1060.7 处记录“尖峰”……但是 270 处有什么?通知周期性检测系统在事件检测阈值以下的 270 处可能会有一个小尖峰,这将很有用。

我自己在节拍跟踪/感应方面的经验是,它比“检测后”(所有“弱”事件已被阈值化)。