| 株式会社ユアネーム エンターテインメント・教育 |
以下のプログラムは資料です。このプログラムは、NTT東日本のナンバーディスプレイ®の仕様書に準拠して書かれていますので、他社の回線や日本国外の回線では正常に機能しない場合がございます。また、ナンバーディスプレイ®を利用するには、事前に NTT との契約が必要です。ナンバーディスプレイ®はNTTの登録商標です。サービスを利用するには、対応する電話機・ターミナルアダプタなどが必要です。詳しくは、電話局(NTTの場合は、局番なしの116)にお問い合わせください。
![]()
第十回 発信者番号通知(Caller ID)取得
汎用 perl、C言語を使用 ソースコードのみ提供 約 3KB ダウンロード (Vector)
一昔前まではモデムというものは高価なものでしたが、今の固定電話にはほとんどの機種についています。 といっても、1200bpsの信号を復調するのみです。そうです。発信者番号通知は、あのピーガラガラという音で送られてきます。
このプログラムは、その発信者番号通知情報が記録されたオーディオファイルから、発信者番号を取り出すサンプルプログラムです。 FSKについては、(ソフトウェアでなく回路設計の)教科書どおりに実装していますが、発信者番号通知情報に特化していますので、一部、手を抜いています。 エラーのチェックはパリティのみを見ています。バックワード・チャネルは無視します。
オーディオ系の処理は SoX というプログラムを利用しています。 SoX には、Windows版もありますが、パイプ処理を多用しているため、このプログラムと一緒に使うことはできないかもしれません。 cygwin を使うとよいかも知れませんが、Windowsでの動作確認はしていません。 以下は SoX のインストール方法の一例です。
FreeBSD
# cd /usr/ports/audio/sox
# make build; make install
Debian ubuntu vine
$ sudo apt-get install sox
fedora CentOS
# yum install sox
MacOS
SoXのホームページからバイナリファイルを取り寄せてください。
発信者番号通知情報は、ファイルの先頭から、3.1秒〜7.1秒の間に送られてくるものとしていますが、 そのあたりは、オーディオファイルにあわせて調整してください。 以下は実際の波型です。横軸が時間です。縦軸は信号レベルです。
0.4秒あたりから 2.9秒のあたりまでに、短い呼び出し(20Hz弱・レベルいっぱいの矩形波)が3回あります。 4回のときもあります。 0.5秒鳴、0.5秒止は、発信者番号情報を送る前の合図です。 3.8秒から4.3秒くらいにかけてのほんの短い信号(レベル低め)が発信者番号通知情報です。 5.8秒以降は通常の長い呼び出し(20Hz弱・レベルいっぱいの矩形波)、1.0秒鳴、2.0秒止です。 0.5秒ほどの短い信号ですが、実際に発信者番号通知情報として使われているのは、国内の電話番号ならそのうちの 0.2秒程度で、残りはマークビットです。0.2秒の中にはヘッダ情報などが含まれていますので、電話番号の部分はさらに短く 0.1秒(1バイトあたり10ビットのため、12桁に相当します)程度です。
方式はFSK、ラジオでいうFMのデジタル版です。周波数を変えて信号を伝えます。(周波数偏移変調) 1300Hz(マーク)と、2100Hz(スペース)が交互に鳴りますが、 1秒間に最大、1200回も入れ変わるのです。 最初と最後のマークビット、1300Hzは聴こえても、2100Hzが交互に入ってくると人間の耳には雑音にしか聴こえません。 以下は 3.97秒から4.00秒あたりを拡大したものです。 ちょうどヘッダ情報(情報の先頭につくお決まりの記号です。下の図をいくら眺めても、電話番号は見えません)が送られてくるあたりです。 間隔のやや広い波(低音)と、狭い波(高音)が交互に波打っているのがわかるかと思います。
![]()
下の画像は、上の画像をさらに拡大したものです。リサンプルという処理を入れています。 上の画像は8000Hzのサンプリングレートです。波が少々、角ばっています。三角の波は正確な情報ではありません。信号のレベルも不規則です。 元データのサンプリングレートが低くても、高いサンプリングレートにリサンプルすると、下の図のように、なめらかなサイン波が得られます。 リサンプルにも、いろいろと、やり方があるようですが、SoX は、処理に時間を要するものの、かなり丁寧にリサンプルしてくれます。 このプログラムでは、内部でサンプリングレートを1200bpsの 16倍にしています。
それでも、低い音に比べ、高い音の信号レベルが低いのはおそらく、機器や回線の周波数特性によるものでしょう。 バンドパスフィルタで、高い音と低い音に分離して、ノーマライズ処理を行うと均等なレベルになります。 また、バンドパスフィルタは DC 成分(直流成分、波の中心レベル、正常時は 0 = 接地レベル)を除去してくれます。
これ以降の信号処理については perl プログラムのコメントに細かく書かれていますので、ご覧になってください。 発信者番号通知情報に関しての処理は perl で行っています。 C言語の部分は、たいした処理をしておらず、1バイトで処理していますので、ビックエンディアンでも、リトルエンディアンでも構いません。 compile.shを実行してコンパイルできます。perlと C言語、全部あわせても 200行程度のシンプルなものです。
入力はWAVファイルでも、AIFFでも構いませんが、不可逆圧縮(MP3、AAC、OGGなど)をかけたファイルを入力すると正確に復調できません。 人間の耳には雑音にしか聴こえないので当然です。 サンプリングレートは 8000Hz(モノラル)程度で十分です。もともと、電話のバンド幅は4000Hz程度までしかありません。 NTT固定電話網の資料によると「概ね 4000Hz 程度までの帯域」と書かれています。 ISDN網でも、デジタル携帯電話でも、サンプリングレートを 8000Hzにしていますので、それより大きいと不都合なファイルができてしまいます。 なお、厳密に 8000Hz というのは、今の技術では作れず、パソコンと回線共にサンプリングレートに若干の誤差はあります。
ここまでご覧になって、なんでこんな野暮ったい処理をしているのか疑問になった方もいらっしゃるでしょう。 確かに、ソフトウェアでFSKを実装する場合は、この例よりも、波の周期をひとつずつ測ることによって、もっと効率的に処理できる方法もあります。フーリエ変換をするものもあります。 しかし、この例は、ハードウェアの構成のシュミレーションでして、 他の信号やノイズが混ざってるなど、悪条件の場合にも比較的正確に復調でき、機器の特性に左右されにくいなどの利点があります。
![]() Copyright © 2000-2009 Yourname, Inc. All Rights Reserved. |