ラズパイpicoでDTMFデコーダを作った

プログラミング

 DTMFというのは、電話でおなじみのダイヤルトーンのことです。アマチュア無線の電波を利用してリモートコントロールする方法の一つとして押さえておきたいと以前からずっと思っていましたが、Geminiとチャットしながら、そこそこ使えそうなものができました。昔は、DTMF用の受信用ICとか送信用ICというものがありましたが、今では博物館行きです。身近なマイコンで製作できればと思って今回はラズパイpicoで製作しました。Geminiに次のように要求仕様を入力しました。

  • DTMF信号を解読するプログラムを次の仕様で作ってください。
  • ターゲットおよび開発環境と言語
  • ラズパイpico ArduinoIDE(Earlphilhower) C++モドキ言語
  • Goertzelアルゴリズムを用いること
  • DTMFを含む音声信号は、ラズパイpicoのアナログ入力端子から入力される
  • AD変換は10ビット8kspsで行うこと
  • DTMF信号は最低でも0.3秒間継続されることとする
  • 同一のDTMF信号が3秒以上継続した場合は、3秒経過した時点で一つのトーンと見做す

 この要求を受けてGeminiが作ってくれたプログラムを試しましたが、1,4,7,*がうまくデコードできませんでした。A/D変換後の低群に比べ高群の振幅が小さかったことが原因だったので、低群と高群のスレッショルドを別々に設定し、タイマー割込みを使って正確に8kspsでサンプリングするようにしたところ改善されました。

 本来の目的はVHF帯用リグでDTMFを送信して、それを受信してデコードするというものですが、実際に無線機に接続するのは面倒だったので、デバッグのためにパソコンでDTMFを発生して、それをラズパイpicoで受信してArduinoIDEのシリアルモニタに表示させました。DTMF信号を発生させるアプリは、Geminiにお願いしてWebアプリとしてHTML+JavaScriptで作って貰いました。

コメント