如何使用PyAudio流数据计算零交叉率

时间:2017-06-02 01:13:04

标签: python numpy signal-processing

我正在尝试制作一些语音检测代码。我试图用过零率做到这一点。我做了一些研究,发现当有人说话时,过零率应该是一个中等的值,不要太高而不能太低,但是当我对着麦克风讲话时,零交叉率会比只有背景时更高。噪音(几乎没有)这就是我现在正在做的计算。

((audioData[:-1] * audioData[1:]) < 0).sum()

audioData是一个numpy表,它的内容是pyAudioStream.read()的结果可以有人告诉我正确的计算方法吗?感谢

1 个答案:

答案 0 :(得分:2)

这是很多不必要的增殖。使用布尔比较并通过np.diff运行它可能会更快:

zero_crosses = np.nonzero(np.diff(audioData > 0)))[0]

这是做什么的:

  1. 创建一个布尔数组,其中信号高于0(audioData > 0
  2. 做成对差异(np.diff)所以过零点的位置变为1(上升)和-1(下降)
  3. 选择那些非零值为(np.nonzero)的数组的索引。
  4. 然后,如果您想要交叉次数,可以zero_crosses.size

    作为奖励,您可以获得所有十字架的时间,以便您可以执行直方图等操作,以显示您的时间历史中发生更多交叉的位置。