1960년경, 우편번호가 생기기 전, 쇼핑몰이 생기기 전, 할머니는 회선에서 여러 사람과 전화 연결을 공유했습니다. 전화 회사는 고객마다 다른 벨소리를 울리며, 예의에 어긋나니 듣지 마세요. 이것은 90,000명의 인구가 있는 노스캐롤라이나의 수도였습니다. 몇 년 안에 그녀는 회선의 마지막 사람이 되었지만 The Phone Company는 기존 고객에게 회선 요금을 계속 제공해야 했습니다. 몇 년 후 The Telephone Company는 원형 로터리 다이얼(틱틱틱틱틱틱...틱틱틱틱...)을 대체하기 위해 터치톤 다이얼링을 제공하기 시작했지만 몇 년 동안 아버지는 더 빠른 다이얼링을 위해 $3.00의 추가 요금을 지불하지 않아도 됩니다. 0이 많은 숫자는 특히 전화 걸기가 느렸습니다. 터치 톤이 빠릅니다.
터치톤은 디티엠에프 (Dual Tone Multi-Frequency) 전화 시스템에서 쉽게 전송할 수 있도록 인간의 음성 범위에서 두 개의 동시 사인파로 만든 신호입니다. 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는 작은 회사의 무리 자신의 전화를 소유하는 것이 합법화되었습니다.
누구에게 전화가 왔는지 알려주는 할머니의 일행 특유의 벨소리와 누가 전화를 했는지 알 수 있는 오늘날의 벨소리 사이의 이상한 관계에 주목하십시오.
아직 유선 전화가 있습니다.