Vers 1960, avant les codes postaux, avant les centres commerciaux, grand-mère partageait une connexion téléphonique avec plusieurs autres personnes sur une ligne partagée. La compagnie de téléphone a fourni un sonnerie distinctive pour chaque client, et s'il vous plaît, n'écoutez pas, ce n'est pas poli. C'était dans la capitale de la Caroline du Nord, avec 90 000 habitants. Quelques années plus tard, elle était la dernière à rejoindre la ligne partagée, mais The Phone Company a dû continuer à proposer le tarif de la ligne partagée à ses clients existants. Quelques années plus tard, The Telephone Company a commencé à proposer la numérotation Touch-Tone pour remplacer le cadran rotatif rond (tic-tic-tic-tic-tic....tic-tic-tic...), mais pendant des années, papa a gardé le téléphones à cadran afin qu'il n'ait pas à payer le supplément de 3,00 $ pour une numérotation plus rapide. Les numéros contenant beaucoup de zéros étaient particulièrement lents à composer. Les tonalités tactiles sont rapides.
Les tonalités tactiles sont DTMF (Dual Tone Multi-Frequency) signaux fabriqués à partir de deux ondes sinusoïdales simultanées dans la plage de la parole humaine afin que les systèmes téléphoniques puissent les transmettre facilement. Il y a huit tons disponibles, disposés dans une grille 4 x 4. Vous n'avez probablement jamais vu la quatrième colonne.
| |
1209 Hz |
1336 Hz |
1477 Hz |
1633 Hz |
| 697 Hz |
1 |
2 |
3 |
UN |
| 770 Hz |
4 |
5 |
6 |
B |
| 852 Hz |
7 |
8 |
9 |
C |
| 941 Hz |
* |
0 |
# |
D |
(Hz est l'unité qui a remplacé CPS en 1960.)
À la fin de cet article, un fichier DTMF3.wav est joint ; il a été réalisé avec un microphone d'ordinateur pressé contre un combiné téléphonique et est un peu silencieux. Téléchargez-le pour le script qui suit ; montez un peu vos haut-parleurs pour l'entendre.
Le script récupère les pressions sur les touches du fichier wav en chargeant une matrice d'échantillons dans le dans le domaine temporel à partir du fichier, puis en exécutant JMP FFT fonctionner sur de courtes sections des données du domaine temporel pour les convertir en domaine fréquentiel . Dans ce graphique, chaque colonne verticale de points représente les fréquences particulièrement fortes pendant la tranche horaire. Les points supplémentaires en bas à gauche proviennent probablement du fait d'appuyer sur le microphone de l'écouteur ; les clics brusques ont beaucoup de fréquences.

Le premier chiffre a beaucoup d’énergie à 1477 Hz et beaucoup d’énergie à 852 Hz. C'est un 9. Si vous souhaitez vérifier votre travail sur le reste des chiffres, comparez votre réponse au JMP US numéro d'assistance technique .
Mise à jour du 20 décembre 2016 : le JSL est restauré après n'avoir pas survécu à la conversion de l'ancien format de blog. Réessayez si vous avez un tableau vide et aucun graphique au cours des derniers mois. De plus, ce n’est pas un excellent modèle pour lire des fichiers WAV ; l'exemple dans Travailler avec des fichiers WAV est beaucoup plus rapide et plus susceptible de faire ce dont vous aurez besoin à l'avenir.
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" )
);
Au début des années 1980, The Phone Company s'est scindée en une groupe de petites entreprises et il est devenu légal de posséder son propre téléphone.
Remarquez la relation étrange entre la sonnerie distinctive de la ligne de grand-mère, qui indique qui est appelé, et les sonneries d'aujourd'hui, qui permettent de savoir qui appelle.
J'ai toujours une ligne fixe.