1960년경, 우편번호가 생기기 전, 쇼핑몰이 생기기 전, 할머니는 회선에서 다른 여러 사람과 전화 연결을 공유했습니다. 전화 회사는 다음을 제공했습니다. 고객별로 벨소리를 다르게 지정할 수 있으니, 예의에 어긋나니 듣지 마세요. 이것은 인구 90,000명의 주도인 노스캐롤라이나의 도시였습니다. 몇 년 안에 그녀는 파티 회선의 마지막 사람이 되었지만 The Phone Company는 기존 고객에게 파티 회선 요금을 계속 제공해야 했습니다. 몇 년 후 The Telephone Company는 원형 회전식 다이얼을 대체하기 위해 터치톤 다이얼링(틱-틱-틱-틱-틱....틱-틱-틱...)을 제공하기 시작했지만 아버지는 수년 동안 이 다이얼링을 유지하셨습니다. 더 빠른 전화를 걸기 위해 3달러의 추가 요금을 지불할 필요가 없도록 회전식 전화기를 사용했습니다. 0이 많은 번호는 특히 전화 걸기가 느렸습니다. 터치톤이 빠릅니다.
터치톤은 DTMF (이중 톤 다중 주파수) 신호는 사람의 음성 범위에서 두 개의 동시 사인파로 생성되므로 전화 시스템에서 쉽게 전송할 수 있습니다. 4 x 4 그리드로 배열된 8개의 톤을 사용할 수 있습니다. 아마도 네 번째 열을 본 적이 없을 것입니다.
| |
1209Hz |
1336Hz |
1477Hz |
1633Hz |
| 697Hz |
1 |
2 |
삼 |
ㅏ |
| 770Hz |
4 |
5 |
6 |
비 |
| 852Hz |
7 |
8 |
9 |
씨 |
| 941Hz |
* |
0 |
# |
디 |
(Hz는 대체된 단위입니다. CPS 1960년에.)
이 게시물 끝에 DTMF3.wav 파일이 첨부되어 있습니다. 컴퓨터 마이크를 전화기 송수화기에 대고 눌러 만든 것으로 약간 조용합니다. 다음 스크립트를 위해 다운로드하세요. 스피커를 조금 높여서 들어보세요.
스크립트는 샘플 매트릭스를 로드하여 wav 파일에서 키 누름을 복구합니다. 시간 영역 파일에서 JMP를 실행합니다. FFT 시간 영역 데이터의 짧은 부분에 대해 함수를 사용하여 변환합니다. 주파수 영역 . 이 그래프에서 각 수직 점 열은 해당 시간 동안 특히 큰 주파수가 무엇인지 나타냅니다. 왼쪽 하단에 있는 추가 점은 아마도 이어피스의 마이크를 탭했을 때 발생했을 것입니다. 날카로운 클릭에는 많은 빈도가 있습니다.

첫 번째 숫자에는 1477Hz 에너지가 많고 852Hz 에너지가 많이 있습니다. 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는 여러 회사로 분할되었습니다. 소규모 회사의 무리 그리고 자신의 전화기를 소유하는 것이 합법화되었습니다.
누가 전화를 받았는지 알려주는 할머니의 파티 라인 고유 벨소리와 누가 전화하고 있는지 알려주는 오늘의 벨소리 사이의 이상한 관계에 주목하세요.
아직 유선전화가 있어요.