我编写了一个计算信号内零交叉数的算法。通过这个,我的意思是值从+变为 - 的次数,反之亦然。
算法解释如下:
如果有以下要素:
v1 = {90, -4, -3, 1, 3}
然后将该值乘以旁边的值。 (i * i + 1)
然后取符号值符号(val)确定这是正面还是负面。例如:
e1 = {90 * -4} = -360 -> sigum(e1) = -1
e2 = {-4 * -3} = 12 -> signum(e2) = 1
e3 = {-3 * 1} = -3 -> signum(e3) = -1
e4 = {1 * 3} = 3 -> signum(e4) = 1
因此,值的总数从负变为正是= 2 ..
现在我想将这个论坛式算法放入一个等式中,以便我可以呈现它。
我问过一个类似的问题,但是真的很困惑,所以就走开了,想一想,然后想出来(我觉得这个等式应该是这样的)..这可能是错的,好吧,可笑的错误。但这是:
现在背后的逻辑:
我传入V(val)
我从计算(Vi * Vi + 1)得到signum总和的绝对值。signum(Vi * Vi + 1)应该产生-1,1,...,值
当且仅当值为-1时(因为我只对零交叉的次数感兴趣,因此,零值。
这看起来是否正确,如果没有,任何人都可以建议改进吗?
谢谢:)!
编辑:
现在这是正确的吗?
答案 0 :(得分:2)
你在这里做的是正确的,但你的等式是错误的,因为你只想在相邻元素为负时计算相邻元素乘积的符号。不要总结产品的标志,因为应该忽略正号产品。因此,明确的数学公式很棘手,因为应忽略相邻元素之间的正积。你想要的是一个带有2个参数的函数,当它们的乘积为负时评估为1,当非负值时评估为0
f(x,y) = 1 if xy < 0
= 0 otherwise
然后你的交叉点数量由
给出sum(f(v1[i],v1[i+1])) for i = 0 to i = n-1
其中n
是向量/数组v1
的长度(使用基于零索引的C样式数组访问表示法)。您还必须考虑边缘条件,例如4个连续点{-1,0,0,1} - 您是否要将此视为一个零交叉或2?只有您可以根据问题的具体情况回答这个问题,但无论您的答案是什么,都会相应地调整算法。