【问题标题】:Check if discrete signal is periodic (or close to), given discrete event times给定离散事件时间,检查离散信号是否是周期性(或接近)
【发布时间】:2015-06-14 19:35:59
【问题描述】:

所以我有一个特定事件发生时的 Z 时间列表(见下文)。我怎样才能看到这个信号有多接近周期性? 我想,我可以找到串行事件之间的成对时间差,看看它是否是一个近似稳定的数量,但是有没有一种 Pythonic 方法可以做到这一点?

Z = [7.72, 10.9, 13.9, 16.69, 19.5, 22.31, 25.0, 27.69...]

【问题讨论】:

  • 你可以做Fourier analysis; Numpy 有 various Fourier tools,但你需要学习一些理论才能有效地使用它们。
  • 我建议对集合进行一些基本统计。根据您的需要,诸如连续差异的方差之类的东西可能是您需要计算的唯一数字。如果它低于某个阈值,那么您的样本间隔非常均匀,并且偶尔的异常值不会使整个集合声明为非周期性的。我会用一些好的基于统计的方法来写一个答案,但我不会说 Python。
  • 好的,确实方差似乎是一个很好的衡量标准。谢谢你。如果您有其他想法,请随时分享(即使我已经有足够的答案来获得令人满意的答案)。 :)

标签: python matplotlib signal-processing discrete-mathematics


【解决方案1】:

您的问题似乎更多是关于分析信号的算法,但要获得 Python 中连续对之间的差异,您可以使用以下代码:

>>> Z = [7.72, 10.9, 13.9, 16.69, 19.5, 22.31, 25.0, 27.69]
>>> diffs = [a-b for a, b in zip(Z, Z[1:])]
>>> diffs
[-3.1800000000000006, -3.0, -2.790000000000001, -2.8099999999999987, -2.8099999999999987, -2.6900000000000013, -2.6900000000000013]

使用它,您可以定义一个函数来将差异与给定值和容差进行比较:

def is_periodic(samples, value, tolerance=0):
    diffs = [a-b for a, b in zip(samples, samples[1:])]
    return all(d-tolerance <= value <= d+tolerance for d in diffs)

>>> is_periodic(Z, -3, 1)
True
>>> is_periodic(Z, -3, 0.5)
True
>>> is_periodic(Z, -3, 0.25)
False

【讨论】:

  • 我要添加的一个更改是使用平均值或中值差异来确定比率,因为 OP 没有提到指定周期是已知的。
  • 是的,我同意 Katie 的概括性评论。 @mhawke 谢谢你的回答。 (根据 Katie 的说法,如果我理解正确,我们会从函数中删除“值”参数;然后在返回部分用 numpy.mean(diffs) 替换另一个“值”)
  • 似乎有一个来自 numpy 的名为“diff”的函数可以完成这项工作:)
【解决方案2】:

我能想到的最简单的是:-

>>> Z = [7.72, 10.9, 13.9, 16.69, 19.5, 22.31, 25.0, 27.69]
>>> iterate_till = len(Z)-1
>>> [(Z[i+1] - val) for i, val in enumerate(Z) if i<iterate_till]
[3.1800000000000006, 3.0, 2.7900000000000009, 2.8099999999999987, 2.8099999999999987, 2.6900000000000013, 2.6900000000000013]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多