ESP8266で指パッチン検出器を作る①

最近私生活がバタバタしていたので久しぶりの投稿です。ちょっと前から考えていた指パッチンで何かアクションを起こすデバイスが試行錯誤を重ねようやく完成したので、作り方をご紹介しようと思います。

今回の目標

今回の目標は「指パッチンしたら何か起こる」デバイスを作ることです。

  • 指パッチン「だけ」を検出して何かアクションを起こす。手を叩いたり何かがぶつかる音では反応しない。
  • できるだけ誤作動(指パッチンしていないのにアクション)しない。
  • コストと消費電力を抑えるため、ラズパイではなくESP8266を使う。そのため、C++でプログラムを書き、しかもコード量を減らす必要がある。

家に帰ってきたら指を鳴らしてカッコよく電気をつけたい。そんな要望に当システムがお応えします。

指パッチンの音を解析する

指パッチンの音の特徴は?

指パッチンだけを検出するためには、指パッチンの音の特徴を捉える必要があります。マイクで取った音の信号だけでは、データがバラバラすぎて判定できません。

フーリエ変換してみる

指パッチンの音と手を叩く音は、同じ単発音ですが、人間の耳には音色の違いがはっきり分かります。その理由は音に含まれる周波数の配合が異なるためです。

そこでフーリエ変換を使って周波数分析を行います。周波数分析とは一定時間の音の時系列データの中に、各周波数成分がどのくらい入っているかを調べる手法です(ざっくり)。フーリエ変換を行うと、時系列データ(横軸が時間、縦軸が振幅)が周波数成分に変換されて、横軸が周波数、縦軸がパワースペクトルになります。

周波数分析を使えば指パッチンと手を叩く音で異なる結果が得られるはずです。
指パッチン、手を叩く、金属をぶつけるの3種類の音を周波数分析した結果がこちらです。

3種類の音をフーリエ変換した結果。指パッチン同士はなんとなく似てそう。

なんとなく指パッチンは似ている波形が出ています。逆にそれ以外は全く違う周波数的特徴を持っていることがわかります。次はこの指パッチンとそれ以外のデータを分類する判定アルゴリズムを作っていきます。

指パッチンの判定

周波数分析が出来たとして、どういう波形なら指パッチンと判断するかを決める必要があります。そのためには指パッチンに近いかどうかを定量的に評価する指標が必要です。評価の方法としては色々ありますが、相関係数を使う方法とサポートベクターマシンを使う方法を思いついたのでやってみました。

相関係数を使って判定

得られたデータがどれくらい指パッチンに似ているか定量的にわかればいいので、まず相関係数を使う方法を思いつきました。相関係数は2つのデータ(ベクトル)が似ているかどうかを数値で表すことが出来ます。

まず指パッチンを何回か録音して、指パッチンの平均的なデータを求めておきます。実際に判定するときは、この平均データと新たに得られたデータを比較することによって、得られたデータがどのくらい指パッチンに似ているか判定します。

指パッチンを20回録音して得られた平均データがこちらです。

指パッチン20回の平均データ。これを基準に相関係数を求める。

これと新たに得られたデータを比較して、相関係数が高ければ指パッチンと判定します。以下は指パッチンの平均データをx軸、新たに得られたデータをy軸にとった散布図です。教科書で見たことあるようなきれいなグラフになりました笑。

平均をデータに近い=相関が強い

相関係数はデータが似ているほど1に近くなります。逆に全く相関がなければ0になります。指パッチンと指パッチン以外の約100回のデータで実際に判定を行ってみたところ、次のようになりました。

約100回のデータに対して相関係数を計算。指パッチンはちゃんと相関係数が大きくなっている。

これを見ると、指パッチンのときはだいたい0.4以上の相関係数が出ていることがわかります。

これをトリガーにすれば実用的な判定システムが作れそうです。

長くなってきたので今回はここまでにします。
次回に続きます。

次回→相関係数で判定するデメリットとSVM(サポートベクターマシン)

コメントを残す

メールアドレスが公開されることはありません。