我正在阅读here中的一段代码:
def freq_from_ZCR(sig, fs):
# Find all indices right before a rising-edge zero crossing
indices = find((sig[1:] >= 0) & (sig[:-1] < 0))
crossings = interpolate(indices, sig)
return fs / np.mean(np.diff(crossings))
我想检查一下我对此的理解,因为我现在没有意义。根据mlab文档,find
&#34;返回某些条件为真的索引&#34;。我想解释一下这是如何工作的。正如我现在看到的那样,(sig[1:] >= 0) & (sig[:-1] < 0)
是一个真或假的陈述。另外,为什么有一个按位&
而不是and
?
最后,如果我假设第一行在上升沿零交叉之前返回索引数组。然后我们会有(例如):
indices = [1, 4, 7, 11, 15]
然后找到np.mean(np.diff(indices))
是有道理的。为什么我们需要interpolate
函数以及它来自何处?从快速搜索中我找不到任何东西。
答案 0 :(得分:1)
它是按位and
,因为它在布尔值列表上运行。
(sig[1:] >= 0)
从第二个元素到最终元素返回一系列布尔值:第一个元素被截断,将值移到一个位置。
(sig[:-1] < 0)
返回一个类似的序列,但在x轴下方,并没有移位,但最后一个元素被截断。
这给出了两个序列的列表:(1)是下一个非负值; (2)当前值为负。两个中的and
中的True
在函数超出轴的每个位置都会给出import
。
这能解释得好吗?
我忘记了插入:
SicPy有一个可爱的interpolation support;我希望这是代码使用的。没有=CONCATENATE(REPT($E$1,COUNTIF(A1,"*"&$D$1&"*")),REPT($E$2,COUNTIF(A1,"*"&$D$2&"*")),REPT($E$3,COUNTIF(A1,"*"&$D$3&"*")))
上下文(未包含在您引用的页面中),我无法确定,但SciPy和NumPy是为这些功能下注的方式。我们的想法是找到信号穿过0的“分数指数”。它假设指数是等间距的x坐标,并插入正确的交叉点。