1960 年頃、郵便番号もショッピング モールも登場する前、祖母はパーティー ラインで他の数人と電話接続を共有していました。電話会社は、顧客ごとに異なる呼び出し音を鳴らします。それは礼儀正しくありませんので、聞かないでください。 これは人口9万人のノースカロライナ州の州都でした。 数年以内に、彼女はパーティーラインの最後の人になりましたが、電話会社は既存の顧客にパーティーライン料金を提供し続ける必要がありました。 数年後、The Telephone Company は丸い回転式ダイヤル (カチカチカチカチカチカチカチカチカチカチカチカチカチカチカチカチ...) に代わるタッチトーン ダイヤルの提供を開始しましたが、父親は何年もの間、そのダイヤルを使い続けていました。ロータリー電話を利用できるため、より高速にダイヤルするために 3 ドルの追加料金を支払う必要はありません。 ゼロが多く含まれる番号はダイヤルするのに特に時間がかかりました。 タッチトーンは速いです。
タッチトーンはDTMF人間の音声範囲内の 2 つの同時正弦波から作成された (デュアル トーン多重周波数) 信号により、電話システムが簡単に送信できます。 4 x 4 のグリッドに配置された 8 つのトーンが利用可能です。 おそらく 4 番目の列を見たことがないでしょう。
| |
1209Hz |
1336Hz |
1477Hz |
1633Hz |
| 697Hz |
1 |
2 |
3 |
あ |
| 770Hz |
4 |
5 |
6 |
B |
| 852Hz |
7 |
8 |
9 |
C |
| 941Hz |
* |
0 |
# |
D |
(Hzは置き換えられた単位です) CPS 1960年に。)
この投稿の最後に DTMF3.wav ファイルが添付されています。コンピューターのマイクを電話の受話器に押し当てて作られたもので、少し静かです。 これをダウンロードして、次のスクリプトを実行します。スピーカーの音量を少し上げて聞いてください。
スクリプトは、サンプルのマトリックスを wav ファイルからロードすることにより、キーの押下を復元します。タイムドメインファイルから取得し、JMP を実行します。 FFT時間領域データの短いセクションに対する関数を使用して、データを次のように変換します。周波数領域。 このグラフでは、ドットの各縦列は、タイムスロット中にどの周波数が特にうるさかったかを表しています。 左下の余分な点は、おそらくイヤホンのマイクをタップしたことによるものと思われます。鋭いクリックには多くの周波数があります。

最初の桁には、1477 Hz のエネルギーと 852 Hz のエネルギーが多く含まれています。 9です。 残りの桁の結果を確認したい場合は、答えを JMP US と比較してください。テクニカルサポート番号。
2016 年 12 月 20 日更新: 古いブログ形式からの変換で生き残れなかった JSL が復元されました。 過去数か月間に空のテーブルとグラフが表示された場合は、もう一度試してください。 また、これは WAV ファイルを読み取るための優れたモデルではありません。の例WAV ファイルの操作はるかに高速で、将来必要なことを実行できる可能性が高くなります。
x = Load Text File( "$DESKTOP/DTMF3.wav", blob ); // this file must be 22050 16 bit 1 channel
// because the following code makes zero effort to handle anything else
x = Hex( x ); // doubles the size of the data, but the hex characters are easy to parse
If( Pat Match( x, Hex( "RIFF" ) + Pat Arb() + Hex( "data" ), "" ), // found the data chunk
grab = 2048; // samples per timeslice
period = grab / 22050; // seconds
binwidth = 1 / period; // 1 cycle in the bin's width is the lowest frequency the bins resolve
timeslice = 0; // count through the time slices
dt = New Table("sound",New Column("time"),New Column("frequency"),New Column("amp"));
dt << begin data update; // load the table without updating each time
While( Length( x ) > (grab) * 2 * 2, // grab samples * 2 bytesPerSample * 2 hexCharsPerByte
samples = J( grab, 1, 0 ); // an array to hold the samples; will be sent to the fft below
nsamples = 0; // grab counter
timeslice++; // each time we grab samples is a new time slice
Pat Match( x, // scan the hex data for pairs of hex digits
Pat Repeat(
Pat Len( 2 ) >> left1 + Pat Len( 2 ) >> left2 + // two pairs
// the following Expr evaluates to PatFence(), eventually, so it can be
// concatenated onto the preceding match. But before it does that, it
// stores the preceding match into the samples[ ] matrix
Expr( nsamples++; // index into the sample array
q = Hex To Number( left2 || left1 ); // build the 16 bit integer
If( q > 32767, q = q - 65536 ); // make it signed, +/-32K
samples[ Nsamples ] = q; // keep it
Pat Fence(); ), // make matching faster by fencing off completed work
grab, grab // min,max number of repeats
), "" // replace everything matched for this grab with nothing
);
freq = FFT( {samples} ); // run the fft. freq is a list: { real, imag }
amplitude = Sqrt( freq[1] :*</img> freq[1] + freq[2] :*</img> freq[2] ); // just the amplitude
For( f = 1, f < grab / 2, f++, // write data table
// throw out small amplitude responses and out-of-interest frequencies
// a different file might need some tweaking of these values
If( amplitude[F] > 10000 & f > 50 & f < 150, // roughly 500 to 1500 Hz
dt << addrows( 1 );
dt:time = timeslice * period;
dt:frequency = (f - 1) * binwidth; // bin 1 is really frequency 0, DC
dt:amp = amplitude[F];
)
);
);
dt << end data update;
// the pretty picture
dt << Graph Builder( Size( 664, 470 ), Show Control Panel( 0 ),
Variables( X( :time ), Y( :frequency ) ), Elements( Points( X, Y, Legend( 5 ) ) ),
SendToReport(
Dispatch( {}, "time", ScaleBox, {Min( 0.5 ), Max( 9 ), Inc( 1 ),
Minor Ticks( 1 ), Label Row Nesting( 1 )} ),
Dispatch( {}, "frequency", ScaleBox,
{Min( 250 ), Max( 1750 ), Inc( 2000 ), Minor Ticks( 0 ), Label Row Nesting( 1 ),
Add Ref Line( 697, "Solid", "Black", "697Hz", 1 ),
Add Ref Line( 770, "Solid", "Black", "770Hz", 1 ),
Add Ref Line( 852, "Solid", "Black", "852Hz", 1 ),
Add Ref Line( 941, "Solid", "Black", "941Hz", 1 ),
Add Ref Line( 1209, "Solid", "Black", "1209Hz", 1 ),
Add Ref Line( 1336, "Solid", "Black", "1336Hz", 1 ),
Add Ref Line( 1477, "Solid", "Black", "1477Hz", 1 ),
Add Ref Line( 1633, "Solid", "Black", "1633Hz", 1 )}
),
Dispatch( {}, "graph title", TextEditBox, {Set Text( "DTMF Analyzer" )} )
)
);
, // else...
Print( "not a wav file" )
);
1980 年代初頭、The Phone Company は次の会社に分割されました。中小企業の集まりそして自分の電話を所有することが合法になりました。
誰に電話がかかっているかを知らせる祖母の党派特有の着信音と、誰が電話をかけているかを知らせる今日の着信音との間の奇妙な関係に注目してください。
固定電話はまだあります。