3

将黑色波转换为红色信号。

在此处输入图像描述

4

2 回答 2

3

继续 Jesse Craig 的回答和 dukeling 关于发现增加和减少之间切换的评论确实会产生一个解决方案,至少在没有噪音的简单情况下是这样。

例如用这个输入信号

在此处输入图像描述

如果您计算 y 的连续值之间的差异(下面的代码在 R 中,因此对向量进行操作)

diffs = y[2:length(y)] - y[1:length(y)-1]

然后是差异的迹象

dir = sign(diffs)

假设没有值是相等的(我们在差异中没有零),您可以通过查找符号不同的位置来发现方向变化

dir_change = dir[2:length(dir)] != dir[1:length(dir)-1]
# no change of direction for first two positions
dir_change = c(FALSE, FALSE, dir_change)

这确定了最大值和最小值,(其中dir_changeTRUE

在此处输入图像描述

方波可以像 Jesse Craig 建议的那样,通过取最大值和最小值之间的中点来计算。

到目前为止,一切都很好。我不确定 OP 的信号是否包含噪音。假设确实如此,我尝试了一些技术来尝试识别存在噪声的最大值和最小值,但我发现这非常困难(我花了至少 10 倍的时间来尝试获得一个对噪声具有鲁棒性的算法,就像我做的那样在上面的代码上)。我尝试了移动平均线和一些简单的阈值,但我无法让任何一种技术直接工作。这似乎证实了处理噪音并非易事!如果有人可以发表评论,我会很感兴趣(或者我可以搜索或询问关于此的 SO 问题)。

编辑在这个答案中有一个很好的峰值检测方法总结。

于 2013-05-31T22:12:28.637 回答
2

您需要使用像爬山这样的局部搜索技术来识别所有局部最小值和最大值。这将为您提供方波中的所有水平线。然后找到相邻局部最大值和最小值之间的中点(X 的值是 Y 的平均值),这将告诉您在您的方波中找到边缘(垂直线)的位置。

于 2013-05-31T13:12:44.473 回答