* 緊急地震速報検出プログラムの解説 [#pe6602ba] 仕事のほうも少し落ち着いたので,この前公開した[[緊急地震速報検出プログラム>日記/2017-01-04/緊急地震速報音検出プログラム]]の解説. ** 相互相関 [#s8fa42e2] 検出の原理は[[相互相関>https://ja.wikipedia.org/wiki/%E7%9B%B8%E4%BA%92%E7%9B%B8%E9%96%A2%E9%96%A2%E6%95%B0]]です. Wikipedia の説明を読んでも「なんのこっちゃ」みたいなところも多いので,大雑把に説明すると - 「見つけたい信号」と「見つけたい信号が埋もれている信号」をサンプル値ごとに掛け算し,合計する - 「見つけたい信号が埋もれている信号」のなかに「見つけたい信号」があるときは,掛け算の合計の結果が大きくなる という感じかな. ** 1ビット量子化 [#l44afdd4] で,上記の相互相関の計算を1サンプルごとに行うわけなのだけど,この計算を速くするためにサンプル信号の量子化ビット数を1ビットとしています. このアイディアは,日本キャステム社の[[緊急告知受信モジュール>http://www.kyastem.co.jp/products/ER-4334-FM-outline.html]]から拝借しました. このモジュールの解説記事にそのようなことが書いてあったのだけど,URL どこだったかな. ** 積和演算 [#wa9c58fb] 積和演算とは乗算した結果を足し合わせる計算で,相互相関で書いた「掛け算の合計」のことです. *** 乗算 [#a8fd9410] で,1ビット量子化した信号の場合 > XOR 演算で掛け算が実現できる ことになります. 1ビット量子化した信号の掛け算と XOR 演算を比べると |項1|項2|乗算|XOR|h |1|1|1|0| |1|-1|-1|1| |-1|1|-1|1| |-1|-1|1|0| …使えそうですね. (XOR 演算の場合は -1 を 0 と読み替えて計算します) *** 足し算 [#wcfc168f] で,足し算のほうは > XOR 演算結果のビット列で立っているビットを数える ことで実現しています. 「[[ビットを数える・探すアルゴリズム>http://www.nminoru.jp/~nminoru/programming/bitcount.html]]」のバージョン5にある,謎の演算をすることによって,32ビットのビット列の中で立っているビットの数を数えることができます. (ただ,素直にテーブルルックアップを使ったほうが計算は速いようです)