我用啥算法来转换这个
Posted
技术标签:
【中文标题】我用啥算法来转换这个【英文标题】:What algorithm do I use to convert this我用什么算法来转换这个 【发布时间】:2013-05-31 13:06:14 【问题描述】:将黑波转换为红波。
【问题讨论】:
蓝线代表什么? Quantization. 很明显,黑线是一些信号,红线是局部最小值/最大值。但在我看来,红色壁垒曲线并没有保留该区域,@Fabricio 需要在任何人回答之前更多地指定此任务。我讨厌这样说,但是@Fabricio,您尝试了什么? 请改进您的标题,以便其他有相同问题的人可以找到此问题。 这不是量化问题。量化不仅仅量化极值,它还对信号的所有部分进行数字化。 【参考方案1】:采纳 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_change
是TRUE
)
可以按照 Jesse Craig 的建议,通过取最大值和最小值之间的中点来计算方波。
到目前为止一切顺利。我不确定 OP 的信号是否包含噪音。假设确实如此,我尝试了一些技术来尝试识别存在噪声的最大值和最小值,但我发现这非常困难(我花了至少 10 倍的时间试图获得一个对噪声具有鲁棒性的算法,就像我做的那样在上面的代码上)。我尝试了移动平均线和一些简单的阈值,但我无法让这两种技术直接工作。这似乎证实了处理噪音并非易事!如果有人可以发表评论,我会很感兴趣(或者我可以搜索或询问关于此的 SO 问题)。
编辑this answer 中有一个很好的峰值检测方法总结。
【讨论】:
【参考方案2】:您需要使用像Hill Climbing 这样的本地搜索技术来识别所有local minimums and maximums。这将为您提供方波中的所有水平线。然后找到相邻局部最大值和最小值之间的中点(X 的值是 Y 的平均值),这将告诉您在哪里找到方波中的边缘(垂直线)。
【讨论】:
Fabricio 的垂直行业似乎不在中点。他还没有回答他对壁垒曲线的要求是什么,也没有告诉我们他尝试了什么,所以你不应该这么急切地回答他。我知道你想要更多的声望,但我会为你的其他作品投票。现在感觉好点了吗? @Fabricio:太好了。所以我们有关于问题表述的第一个提示。 @Fabricio:你说的是 Kinect。所以你需要某种实时流处理。 如果“黑波”是点流,而不是更复杂的东西,你甚至不需要像使用爬山一样复杂 - 只需记录它在增加和减少,这很容易做到。不过,无论哪种情况,如果有噪音,您都需要进行一些修改,以免造成混乱。 @Dukeling 同意了。除非你有噪音,否则它看起来相当简单。我有兴趣看到一个建议如何处理噪声的答案(可能使用某种容差,或平滑或曲线拟合,但曲线拟合由于它似乎是一个流而不是有限的事实而变得复杂点集)。以上是关于我用啥算法来转换这个的主要内容,如果未能解决你的问题,请参考以下文章