いぬおさんのおもしろ数学実験室

おいしい紅茶でも飲みながら数学、物理、工学、プログラミング、そして読書を楽しみましょう

プッシュボタンを押さずに電話をかける

 プッシュホンでは、受話器を上げて発信音を確認し、697Hzの音と1209Hzの音を同時に送話器の近くで鳴らせば「1」をプッシュしたことになります。ウィキペディアには「DTMF(英: Dual-Tone Multi-Frequency)は、0から9までの数字と、*、#、A、B、C、Dの記号の計16種類の符号を、低群・高群の2つの音声周波数帯域の合成信号音で送信する方法である」と説明されています。「DTMF」で検索すればすぐ表が見つかるでしょう。これを見れば、例えば「7」なら852Hzと1209Hz、と分かります。
 コナン君の映画でこれを使ったものがありました。面白い映画でした。

離れたところにある電話機の受話器にコナン君がサッカーボールを当てて外し、2人が決まった高さの声を出して警察に電話をかける、という場面です。確かそういうグッズ(かけたい番号を選ぶとその番号を表す音が鳴り、電話かかかる)も売っていたような……。ただ、回線がプッシュ回線ならよいのですがどうやらダイヤル回線だとダメみたいな書き込みがネットにあります。すみません、今は原理を理解しないで書いているのでハッキリしません。それでもとりあえず実験! 前にこのブログで「指定の高さの音を鳴らすwavファイルを作る」というのを記事にしました。
www.omoshiro-suugaku.com
音の高さを変えるだけでこれを使えます。以下のようにすればOK。「1」をプッシュするwavファイルが作れます。

#========================================================
#waveファイルを作る。1をプッシュ。
#
import sys
import numpy as np
import wave
pi = np.pi
fs = 22050      #サンプリング周波数
s  = 20         #20秒の長さのwaveファイルを作る
#s秒分のサウンドデータを作るには、fs*sフレームが必要。
N  = fs * s     #フレーム数(サウンドデータ数。左右で1フレーム)
t = np.arange(0, s, 1/fs)   #横軸
#sin(2π*□*t) の周波数は□の部分。16ビットで録音するので、
#-32768~32767がデータの範囲であることに注意。
#この範囲の外に出ると音が潰れる。
#----------------------
ldata = 15000 * np.sin(2*pi*697*t) #697の部分を852に書き換えると「7」になる
rdata = 15000 * np.sin(2*pi*1209*t) #1209は1,7で共通
#----------------------
sounddata = np.zeros(N * 2, dtype= "int16") #左右のデータ分が必要
sounddata[0::2] = ldata
sounddata[1::2] = rdata
writewave = wave.Wave_write("keshitene.wav") #保存先ファイル
#setparamの引数は
#(nchannels, sampwidth, framerate, nframes, comptype, compname)
#先頭から順にステレオ、サンプルのサイズ2バイト、
#サンプリング周波数fs、フレーム数N。
writewave.setparams((2, 2, fs, N, 'NONE', 'NONE'))
writewave.writeframes(sounddata) #編集したサウンドデータを保存
writewave.close()
sys.exit()
#========================================================

これを実行してできあがったwavファイルを再生して、送話器に聞かせるのです。これで「1」をプッシュしたことに。続けて「7」をプッシュするwavファイルを2回再生すれば「177」をプッシュしたことになる……はずです。実際に職場の電話で実験してみました。しかし、ダイヤル回線らしく、何度試しても反応なし。「#」を先に押すとかネットには色々書いてあるのですが、ダメでした。どこかでプッシュホンを探して試します。うまくいったらまた記事にします。