Um 1960, vor Postleitzahlen, vor Einkaufszentren, teilte sich Großmutter einen Telefonanschluss mit mehreren anderen Personen auf einer Partyline. Die Telefongesellschaft lieferte a unverwechselbares Klingeln für jeden Kunden, und bitte hören Sie nicht zu, das ist nicht höflich. Das waren in der Hauptstadt von North Carolina 90.000 Menschen. Innerhalb weniger Jahre war sie die letzte an der Partyline, aber The Phone Company musste bestehenden Kunden weiterhin den Partyline-Tarif anbieten. Ein paar Jahre später begann The Telephone Company damit, Tonwahlverfahren anzubieten, um die runde Wählscheibe zu ersetzen (Tick-Tick-Tick-Tick-Tick….Tick-Tick-Tick…), aber Vater behielt das jahrelang Telefone mit Wählscheibe, damit er nicht den Aufpreis von 3,00 $ für schnelleres Wählen zahlen muss. Nummern mit vielen Nullen waren besonders langsam zu wählen. Touch-Töne sind schnell.
Tasttöne sind DTMF (Dual Tone Multi-Frequency) Signale, die aus zwei simultanen Sinuswellen im menschlichen Sprachbereich bestehen, sodass Telefonsysteme sie problemlos übertragen können. Es stehen acht Töne zur Verfügung, die in einem 4 x 4-Raster angeordnet sind. Wahrscheinlich haben Sie die vierte Spalte noch nie gesehen.
| |
1209 Hertz |
1336 Hertz |
1477 Hertz |
1633 Hertz |
| 697 Hertz |
1 |
2 |
3 |
A |
| 770 Hertz |
4 |
5 |
6 |
B |
| 852 Hertz |
7 |
8 |
9 |
C |
| 941 Hertz |
* |
0 |
# |
D |
(Hz ist die ersetzte Einheit CPS 1960.)
Am Ende dieses Beitrags ist eine DTMF3.wav-Datei angehängt; Es wurde mit einem Computermikrofon aufgenommen, das gegen einen Telefonhörer gedrückt wurde, und ist etwas leise. Laden Sie es für das folgende Skript herunter; Drehen Sie Ihre Lautsprecher etwas auf, um es zu hören.
Das Skript stellt die Tastendrücke aus der WAV-Datei wieder her, indem es eine Matrix von Samples in die lädt Zeitbereich aus der Datei und führen Sie dann JMPs aus FFT Funktion auf kurzen Abschnitten der Zeitbereichsdaten, um sie zu konvertieren Frequenzbereich . In diesem Diagramm stellt jede vertikale Punktsäule dar, welche Frequenzen während des Zeitfensters besonders laut waren. Die zusätzlichen Punkte unten links stammen wahrscheinlich vom Klopfen des Mikrofons auf die Hörmuschel; Die scharfen Klicks haben viele Frequenzen.

Die erste Ziffer hat viel 1477-Hz-Energie und viel 852-Hz-Energie. Es ist eine 9. Wenn Sie Ihre Arbeit mit den restlichen Ziffern überprüfen möchten, vergleichen Sie Ihre Antwort mit JMP US Nummer des technischen Supports .
Update 20.12.2016: Die JSL wird wiederhergestellt, nachdem sie die Konvertierung vom alten Blogformat nicht überstanden hat. Versuchen Sie es erneut, wenn Sie in den letzten Monaten eine leere Tabelle und kein Diagramm erhalten haben. Außerdem ist dies kein großartiges Modell zum Lesen von WAV-Dateien; das Beispiel in Arbeiten mit WAV-Dateien ist viel schneller und erledigt in Zukunft mit größerer Wahrscheinlichkeit das, was Sie brauchen.
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" )
);
In den frühen 1980er Jahren spaltete sich The Phone Company in a eine Reihe kleinerer Unternehmen und es wurde legal, ein eigenes Telefon zu besitzen.
Beachten Sie die seltsame Beziehung zwischen dem unverwechselbaren Klingelton der Großmutter, der anzeigt, wer angerufen wurde, und den heutigen Klingeltönen, die erkennen können, wer anruft.
Ich habe noch einen Festnetzanschluss.