过零次数 - 公式

时间:2012-11-22 00:01:51

标签: math signal-processing equation speech wave

我编写了一个计算信号内零交叉数的算法。通过这个,我的意思是值从+变为 - 的次数,反之亦然。

算法解释如下:

如果有以下要素:

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 ..

现在我想将这个论坛式算法放入一个等式中,以便我可以呈现它。

我问过一个类似的问题,但是真的很困惑,所以就走开了,想一想,然后想出来(我觉得这个等式应该是这样的)..这可能是错的,好吧,可笑的错误。但这是:

enter image description here

现在背后的逻辑:

我传入V(val)

我从计算(Vi * Vi + 1)得到signum总和的绝对值。signum(Vi * Vi + 1)应该产生-1,1,...,值

当且仅当值为-1时(因为我只对零交叉的次数感兴趣,因此,零值。

这看起来是否正确,如果没有,任何人都可以建议改进吗?

谢谢:)!

编辑:

enter image description here

现在这是正确的吗?

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?只有您可以根据问题的具体情况回答这个问题,但无论您的答案是什么,都会相应地调整算法。