我用什么算法来转换它

时间:2013-05-31 13:06:14

标签: algorithm

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

enter image description here

2 个答案:

答案 0 :(得分:3)

提出杰西·克雷格的答案,并且dukeling关于发现增加和减少之间切换的评论确实产生了一个解决方案,至少在没有噪音的简单情况下。

E.g。使用此输入信号

enter image description here

如果计算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

enter image description here

和方波可以按照Jesse Craig建议的方式计算,取最大值和最小值之间的中点。

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

编辑 this answer中有一个很好的峰值检测方法摘要。

答案 1 :(得分:2)

您需要使用Hill Climbing之类的本地搜索技术来识别所有local minimums and maximums。这将为您提供方波中的所有水平线。然后找到相邻局部最大值和最小值之间的中点(X的平均值为X),这将告诉您方波中的边(垂直线)的位置。