Zero-crossing rate(ZCR)の説明と実装(Python3)

概要

zero crossing rate(以下ZCR)とは、信号の中で正の値と負の値がどれくらい切り替わっているかを示す指標です。 英語版のwikipediaには、パーカッシブな音声を分類するのにつかわれると書いてあります。
また、ノイズがどれくらい入ってるかの指標として使われることもあるらしいのですが、体感的にはあまりわからないですね。

定義

数式的には例えば次のようにして、定義できます。(本当は指示関数で表したかったですが、はてなブログで書くのがめんどくさいので断念しました。)

\displaystyle{
zcr = \frac{1}{T-1}\sum_{t=1}^{T-1} (s_{t-1}s_t-1)*(-0.5)
}

ただし、Tは信号の長さ,s_ii番目の信号の正負を表します。(正なら+1、負なら-1)。

実装

# python 3.6
#zcr 
def zcr(data):
    count = 0
    for i in range(len(data)-1):
        if data[i]*data[i+1] < 0:
            count += 1
    zcr = count/(len(data))
    return zcr
#show zcr graph
def show_zcr(data,sr,window_sec=1):
    split =int(len(data) / sr / window_sec)
    zcr_list = []
    for i in range(split):
        s = int(sr * window_sec * i)
        e = int(s + sr * window_sec)
        split_data = data[s:e]
        zcr_list.append(zcr(split_data))
        
    plt.plot(np.arange(0,(split*window_sec),window_sec),zcr_list)

参考

en.wikipedia.org