マイコン工作実験日記

Microcontroller を用いての工作、実験記録

miniDSPを用いたトーンの生成

2011-04-08 23:29:51 | Weblog
HFPでの着信時の着信音はヘッドセット側で鳴らすことにしたので、その仕組みを用意しなければなりません。また、発信時にも呼出音(RBT)を生成してやる必要があります。これらの機能もCODECのminiDSP機能を用いて実現することにしました。PurePath Studio(PPS)が提供する部品には、トーン・ジェネレータも用意されているので、これを用います。PPSの画面をコピペしたいところですが、それは許されていないので、似たようなブロック図を描いておくことにします。



上図はHFPまたはW-SIMでの通話時に使用するminiDSPコードのブロック図です。PCM信号で受けた音声信号はu-Lawデコーダにより伸長されて出力されます。出力段にはセレクタが入っており、u-Lawデコーダからの入力あるいはトーン・ジェネレータのいずれかを選択するようにしています。着信や発信時にはトーン・ジェネレータを選択することで希望するトーンをユーザに聞かせ、通話が確立した時点で入力をu-Lawデコーダに切り替えるという仕掛けです。トーン・ジェネレータが生成するのはサイン波であり、1つだけでは単調な音になってしまうので2つ使って、和音を出すようにしています。生成する周波数やトーンのオン・オフはI2Cのレジスタで制御できます。

送信側は基本的に受信側と対称な構成ですが、トーン生成の必要がないのでよりシンプルになっています。PCM信号のサンプリング周期は8000Hzであり、4000Hzまでの周波数成分しか送れません。そこで、あらかじめ不要な高周波成分はローパス・フィルタを使って除去しておきます。

HFP接続での呼の状態はcallならびにcallsetup通知で知ることができますので、これを使って上述したI2Cレジスタを操作してやります。callsetupが1になると着信を示しますので、セレクタをトーンジェネレータ側に切り替えて、着信音の周波数設定ならびにオン/オフを周期的に行います。実際にはトーン生成タスクを作成して、この周期処理を担当させています。応答するとcallが1になってcallsetupは0になりますので、トーン生成タスクを終了させて、セレクタをu-Lawデコーダ側に切り替えます。

発信の際には相手側で呼出が始まるとcallsetupが3になりますので、呼出音を生成してやりますが、これも同じトーン生成タスクに担当させています。

こんな仕掛けでようやくと計画したとおりに動作するようになってきました。じつは、ここに至るまでに、重要なことを見逃していたためにしばらくトーン生成が動作せずに悩んでいました。それは通話が始らないとPCM信号は流れてこないということです。CODECが動作するためにはマスタクロックだけでなく、PCM信号のビットクロックとサンプル周波数を表現するフレーム同期信号が必要です。これらの信号は相手との通話が確立されれば、WT32側から流れてきますが、通話確立前の着信時や発信呼出時にはPCMクロックが流れてきません。そのためにトーン・ジェネレータが動作できないのです。この問題に気が付いてあわてて通話確立前にはホストCPUであるSAM7からクロックを供給してやり、通話が確立したらクロック供給源を切り替えるようにハードを変更しましました。PCM信号についてはこの記事で説明したように74HC157で供給源を切り替えるようにしてあったのですが、これに加えてSAM7を供給源として選択する必要が生じたのです。74HC157は2入力ですが、幸いなことにG端子を使って出力をHZ状態にすることができます。そこでSAM7からクロックを供給したい場合には、この機能を使って74HC157を無効化してやります。W-SIMあるいはWT32から信号を供給する場合には74HC157を有効にして、SAM7側のクロック出力端子のコンフィグをGPIO入力に変更してしまうことで、こちら側をHZにしてやることで問題を回避しています。