緊急地震速報検出プログラムの解説 †仕事のほうも少し落ち着いたので,この前公開した緊急地震速報検出プログラムの解説. 相互相関 †検出の原理は相互相関です. Wikipedia の説明を読んでも「なんのこっちゃ」みたいなところも多いので,大雑把に説明すると
という感じかな. プログラムの公開が難しかった言い訳 †緊急警報放送のチャイム音を検出する場合,上記の「見つけたい信号」にチャイム音がそのまま入ることになります. が,このチャイム音の再配布には NHK の許可が必要なので「めんどくさいなぁ」と思っていたわけです. 1ビット量子化 †で,上記の相互相関の計算を1サンプルごとに行うわけなのだけど,この計算を速くするためにサンプル信号の量子化ビット数を1ビットとしています. このアイディアは,日本キャステム社の緊急告知受信モジュールから拝借しました. このモジュールの解説記事にそのようなことが書いてあったのだけど,URL どこだったかな. 積和演算 †積和演算とは乗算した結果を足し合わせる計算で,相互相関で書いた「掛け算の合計」のことです. 相互相関に限らず様々な信号処理では多く出てくるので,専用命令がある CPU も多いですね. x86 の MMX や SSE,ARM なら DSP 命令セットなどにあります. 乗算 †で,1ビット量子化した信号の場合
ことになります. 1ビット量子化した信号の掛け算と XOR 演算を比べると
…使えそうですね. (XOR 演算の場合は -1 を 0 と読み替えて計算します) 足し算 †で,足し算のほうは
ことで実現しています. 「ビットを数える・探すアルゴリズム」のバージョン5にある,謎の演算をすることによって,32ビットのビット列の中で立っているビットの数を数えることができます. (ただ,素直にテーブルルックアップを使ったほうが計算は速いようです) まとめ †緊急警報放送検出プログラムでは
相互相関とディジタルフィルタ †相互相関について,少し突っ込んだ話を. 緊急地震速報音の検出に使った相互相関ですが,処理を図にするとこのようになります. →+→+→+→+→+→+→+→+→+→ 相関値 ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐ │ち│ゃ│ら│〜│ん│ち│ゃ│ら│〜│ん│ 見つけたい信号 └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘ │ │ │ │ │ │ │ │ │ │ × × × × × × × × × × │ │ │ │ │ │ │ │ │ │ ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐ 見つけたい信号が埋もれている信号 │●│□│▲│○│■│△│●│□│▲│○│←●□▲○■△… └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘ ↓ 捨てる なんとこれはトランスバーサルフィルターという,ディジタルフィルタと同じ処理になっています. そこで,相互相関処理をトランスバーサルフィルタとして見てみると
と見ることができます. 実際,相関値を音声として再生してみると
というように聴こえます. こういう,紙の上の理屈を音声として体験するというのも面白いものです. お試しあれ. |