Tweet

緊急地震速報検出プログラムの解説

仕事のほうも少し落ち着いたので,この前公開した緊急地震速報検出プログラムの解説.

相互相関

検出の原理は相互相関です. Wikipedia の説明を読んでも「なんのこっちゃ」みたいなところも多いので,大雑把に説明すると

  • 「見つけたい信号」と「見つけたい信号が埋もれている信号」をサンプル値ごとに掛け算し,合計する
  • 「見つけたい信号が埋もれている信号」のなかに「見つけたい信号」があるときは,掛け算の合計の結果が大きくなる

という感じかな.

プログラムの公開が難しかった言い訳

緊急警報放送のチャイム音を検出する場合,上記の「見つけたい信号」にチャイム音がそのまま入ることになります. が,このチャイム音の再配布には NHK の許可が必要なので「めんどくさいなぁ」と思っていたわけです.

1ビット量子化

で,上記の相互相関の計算を1サンプルごとに行うわけなのだけど,この計算を速くするためにサンプル信号の量子化ビット数を1ビットとしています. このアイディアは,日本キャステム社の緊急告知受信モジュールから拝借しました. このモジュールの解説記事にそのようなことが書いてあったのだけど,URL どこだったかな.

積和演算

積和演算とは乗算した結果を足し合わせる計算で,相互相関で書いた「掛け算の合計」のことです.

相互相関に限らず様々な信号処理では多く出てくるので,専用命令がある CPU も多いですね. x86 の MMX や SSE,ARM なら DSP 命令セットなどにあります.

乗算

で,1ビット量子化した信号の場合

XOR 演算で掛け算が実現できる

ことになります.

1ビット量子化した信号の掛け算と XOR 演算を比べると

項1項2乗算XOR
1110
1-1-11
-11-11
-1-110

…使えそうですね. (XOR 演算の場合は -1 を 0 と読み替えて計算します)

足し算

で,足し算のほうは

XOR 演算結果のビット列で立っているビットを数える

ことで実現しています.

ビットを数える・探すアルゴリズム」のバージョン5にある,謎の演算をすることによって,32ビットのビット列の中で立っているビットの数を数えることができます.

(ただ,素直にテーブルルックアップを使ったほうが計算は速いようです)

まとめ

緊急警報放送検出プログラムでは

  • 相互相関の原理で警報音を検出
  • 処理速度を上げる小細工としては,以下のテクニックを使用
    • 1ビット量子化
    • XOR 演算
    • ビット数を数える演算(実はあまり意味がなかった)

相互相関とディジタルフィルタ

相互相関について,少し突っ込んだ話を.

緊急地震速報音の検出に使った相互相関ですが,処理を図にするとこのようになります.

  →+→+→+→+→+→+→+→+→+→ 相関値
 ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑
┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
│ち│ゃ│ら│〜│ん│ち│ゃ│ら│〜│ん│ 見つけたい信号
└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘
 │ │ │ │ │ │ │ │ │ │
 × × × × × × × × × ×
 │ │ │ │ │ │ │ │ │ │
┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐ 見つけたい信号が埋もれている信号
│●│□│▲│○│■│△│●│□│▲│○│←●□▲○■△…
└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘
 ↓
 捨てる

なんとこれはトランスバーサルフィルターという,ディジタルフィルタと同じ処理になっています.

そこで,相互相関処理をトランスバーサルフィルタとして見てみると

「ちゃら〜んちゃら〜ん」をフーリエ変換したのと同じ周波数特性を持つフィルタ

と見ることができます.

実際,相関値を音声として再生してみると

  • 普段は入力音声が小さくなってもぞもぞとした音が出力
  • チャイムが鳴り始めると徐々に大きな音が出力される

というように聴こえます.

こういう,紙の上の理屈を音声として体験するというのも面白いものです.

お試しあれ.


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-01-27 (金) 07:57:54 (1086d)