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 distincte pour chaque client, et s'il vous plaît ne l'écoutez pas, ce n'est pas poli. C'était dans la capitale de la Caroline du Nord, 90 000 personnes. En quelques années, elle était la dernière sur la ligne partagée, mais The Phone Company devait continuer à offrir le tarif de la ligne partagée aux 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 avec beaucoup de zéros étaient particulièrement lents à composer. Les touches sont rapides.
Les tonalités sont DTMF (Dual Tone Multi-Frequency) signaux constitués de deux ondes sinusoïdales simultanées dans la gamme de la parole humaine afin que les systèmes téléphoniques puissent facilement les transmettre. Il y a huit tonalités disponibles, disposées dans une grille 4 x 4. Vous n'avez probablement jamais vu la quatrième colonne.
| |
1209 hertz |
1336 hertz |
1477 hertz |
1633Hz |
| 697 hertz |
1 |
2 |
3 |
UN |
| 770Hz |
4 |
5 |
6 |
B |
| 852Hz |
sept |
8 |
9 |
C |
| 941Hz |
* |
0 |
# |
ré |
(Hz est l'unité qui a remplacé SCS en 1960.)
À la fin de cet article, un fichier DTMF3.wav est joint ; il a été réalisé avec un microphone d'ordinateur appuyé 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 fonction 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 qui étaient particulièrement fortes pendant le créneau horaire. Les points supplémentaires en bas à gauche proviennent probablement du tapotement du microphone sur l'écouteur ; les clics aigus 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 voulez 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 : la JSL est restaurée après n'avoir pas survécu à la conversion de l'ancien format de blog. Essayez à nouveau 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 les fichiers WAV ; l'exemple dans Travailler avec des fichiers WAV est beaucoup plus rapide et plus susceptible de faire ce dont vous avez 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 groupe de grand-mère, qui indiquait qui était appelé, et les sonneries d'aujourd'hui, qui pouvaient indiquer qui appelait.
J'ai toujours une ligne fixe.