はじめに
ピッチ検出は、ノイズが少ない環境ではうまく動作しますが、スパイク状のノイズが混ざると急激に崩れることがあります。
特に、電気的なノイズや瞬間的な外れ値が含まれる環境では、一部の手法はほとんど検出できなくなるケースもあります。
本記事では、この「スパイクノイズによる崩れ方」に注目し、一般的な手法(pYIN)と、提案している手法を比較しながら、どの程度耐性があるのかを簡単なシミュレーションで検証します。
なお、スパイクノイズへの対策としては、HPSS(Harmonic-Percussive Source Separation)などの前処理を用いる方法も考えられます。
ただし、リアルタイム処理や低遅延が求められる場面では、こうした前処理を十分に適用できないケースもあり、アルゴリズム自体のロバスト性が重要になる場合があります。
本記事では、前処理を行わない条件での挙動に注目し、手法単体の耐性を比較します。
また、本記事で扱う提案手法は筆者が考案したものです。
シミュレーション
少し揺らぎを持った信号にホワイトノイズを少し加えた信号に対し、ランダムにスパイクノイズを付加して信号を生成しました。
スパイクノイズは、瞬間的に大きな値が入る外れ値として付加しています。
検出結果の図と共に、生成した信号もプロットするのでイメージがつかめるかと思います。
今回は、スパイクノイズの発生割合のみ変化させて、検出率がどう変化していくか見ていきます。
結果
スパイクノイズ発生割合50の時
スパイクノイズのを1秒あたり、50回程度発生させた場合です。
たまたま、ノイズが集中しているあたりでYINが間違えたりしていますが、全ての手法で基本的に周波数は取得できています。
スパイクノイズ発生割750の時
スパイクノイズのを1秒あたり、750回程度発生させた場合です。
YINが誤検出を連発し、拡大するとpYINでピッチが検出できなくなっている事が確認できます。
一方で提案手法のbedcmmでは、安定してピッチが取得できている事がわかります。
YINが誤検出を連発し、拡大するとpYINでピッチが検出できなくなっている事が確認できます。
これは、スパイク状の外れ値によって周期性の評価が大きく乱されているためと考えられます。
一方で提案手法のbedcmmでは、こうした外れ値の影響を受けにくく、安定してピッチが取得できている事がわかります。
スパイクノイズ発生割4000の時
スパイクノイズのを1秒あたり、4000回程度発生させた場合です。
どの手法でもピッチがあまり取得できていない事が確認できます。
スパイクノイズ発生割合とピッチ検出率
ピッチ検出で200[Hz]から240[Hz]が検出できた場合検出したと数え、全ての計測回数を分母として、検出率としました。
縦軸が検出率、横軸がスパイクノイズ割合となっています。
pYINはスパイクノイズの増加に伴い急激に検出率が低下しているのに対し、
提案手法(bedcmm)は比較的緩やかに低下していることが分かります。
これは、pYINが一定以上のノイズで急激に破綻するのに対し、
提案手法は外れ値が増加しても段階的に性能が劣化する特性を持っているためと考えられます。
まとめ
スパイクノイズが多い条件において、pYINでは検出が困難になるケースでも、
提案手法では比較的安定してピッチ検出が可能であることを確認しました。
おわりに
このような「スパイク状の外れ値に対する耐性」は、
ピッチ検出に限らず、異音検出や設備の異常検知のような分野でも重要になります。
特に、瞬間的なノイズや欠損が混ざるデータに対して、
アルゴリズムがどのように崩れるか(あるいは崩れないか)は、
実運用における安定性に直結します。
応用できそうなケースがあれば、ぜひコメントなどで教えていただけると嬉しいです。
Github
解析手法とスパイクノイズの生成シミュレータが公開されています。






