【问题标题】:How to calculate Zero Crossing Rate with PyAudio stream data如何使用 PyAudio 流数据计算过零率
【发布时间】:2017-06-02 01:13:03
【问题描述】:
我正在尝试制作一些语音检测代码。我正在尝试以过零率来做到这一点。我做了一些研究,发现当有人说话时,过零率应该是一个中等的值,不太高也不太低,但是当我对着麦克风说话时,过零率变得比只有背景的时候高噪音(几乎没有)这是我现在正在做的计算。
((audioData[:-1] * audioData[1:]) < 0).sum()
audioData 是一个 numpy 表,它的内容是 pyAudioStream.read() 的结果,谁能告诉我正确的计算方法?谢谢
【问题讨论】:
标签:
python
numpy
signal-processing
【解决方案1】:
这是很多不必要的乘法。使用布尔比较并通过np.diff 运行它可能会更快:
zero_crosses = np.nonzero(np.diff(audioData > 0)))[0]
这是在做什么:
- 创建一个布尔数组,其中信号高于 0 (
audioData > 0)
- 进行成对差分 (
np.diff),因此过零位置变为 1(上升)和 -1(下降)
- 选择那些非零值所在的数组的索引 (
np.nonzero)。
那么如果你想要穿越的数量,你可以直接取zero_crosses.size。
作为奖励,您有所有交叉的时间,因此您可以执行直方图之类的操作,显示您的时间历史中更多交叉发生的位置。