简 介: 通过一个简单的实验来验证一下为什么DTMF的频率选取这些数值的频率。它们的存在使得低频频的二倍频与高频频率的差异达到最小。具体原因可以通过Bell实验室的报告进行检索,回答为什么DTMF这样选择频率。

关键词DTMF谐波

#mermaid-svg-txH0zMUXcmkiCIv3 .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-txH0zMUXcmkiCIv3 .label text{fill:#333}#mermaid-svg-txH0zMUXcmkiCIv3 .node rect,#mermaid-svg-txH0zMUXcmkiCIv3 .node circle,#mermaid-svg-txH0zMUXcmkiCIv3 .node ellipse,#mermaid-svg-txH0zMUXcmkiCIv3 .node polygon,#mermaid-svg-txH0zMUXcmkiCIv3 .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-txH0zMUXcmkiCIv3 .node .label{text-align:center;fill:#333}#mermaid-svg-txH0zMUXcmkiCIv3 .node.clickable{cursor:pointer}#mermaid-svg-txH0zMUXcmkiCIv3 .arrowheadPath{fill:#333}#mermaid-svg-txH0zMUXcmkiCIv3 .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-txH0zMUXcmkiCIv3 .flowchart-link{stroke:#333;fill:none}#mermaid-svg-txH0zMUXcmkiCIv3 .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-txH0zMUXcmkiCIv3 .edgeLabel rect{opacity:0.9}#mermaid-svg-txH0zMUXcmkiCIv3 .edgeLabel span{color:#333}#mermaid-svg-txH0zMUXcmkiCIv3 .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-txH0zMUXcmkiCIv3 .cluster text{fill:#333}#mermaid-svg-txH0zMUXcmkiCIv3 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-txH0zMUXcmkiCIv3 .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-txH0zMUXcmkiCIv3 text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-txH0zMUXcmkiCIv3 .actor-line{stroke:grey}#mermaid-svg-txH0zMUXcmkiCIv3 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-txH0zMUXcmkiCIv3 .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-txH0zMUXcmkiCIv3 #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-txH0zMUXcmkiCIv3 .sequenceNumber{fill:#fff}#mermaid-svg-txH0zMUXcmkiCIv3 #sequencenumber{fill:#333}#mermaid-svg-txH0zMUXcmkiCIv3 #crosshead path{fill:#333;stroke:#333}#mermaid-svg-txH0zMUXcmkiCIv3 .messageText{fill:#333;stroke:#333}#mermaid-svg-txH0zMUXcmkiCIv3 .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-txH0zMUXcmkiCIv3 .labelText,#mermaid-svg-txH0zMUXcmkiCIv3 .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-txH0zMUXcmkiCIv3 .loopText,#mermaid-svg-txH0zMUXcmkiCIv3 .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-txH0zMUXcmkiCIv3 .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-txH0zMUXcmkiCIv3 .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-txH0zMUXcmkiCIv3 .noteText,#mermaid-svg-txH0zMUXcmkiCIv3 .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-txH0zMUXcmkiCIv3 .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-txH0zMUXcmkiCIv3 .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-txH0zMUXcmkiCIv3 .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-txH0zMUXcmkiCIv3 .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-txH0zMUXcmkiCIv3 .section{stroke:none;opacity:0.2}#mermaid-svg-txH0zMUXcmkiCIv3 .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-txH0zMUXcmkiCIv3 .section2{fill:#fff400}#mermaid-svg-txH0zMUXcmkiCIv3 .section1,#mermaid-svg-txH0zMUXcmkiCIv3 .section3{fill:#fff;opacity:0.2}#mermaid-svg-txH0zMUXcmkiCIv3 .sectionTitle0{fill:#333}#mermaid-svg-txH0zMUXcmkiCIv3 .sectionTitle1{fill:#333}#mermaid-svg-txH0zMUXcmkiCIv3 .sectionTitle2{fill:#333}#mermaid-svg-txH0zMUXcmkiCIv3 .sectionTitle3{fill:#333}#mermaid-svg-txH0zMUXcmkiCIv3 .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-txH0zMUXcmkiCIv3 .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-txH0zMUXcmkiCIv3 .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-txH0zMUXcmkiCIv3 .grid path{stroke-width:0}#mermaid-svg-txH0zMUXcmkiCIv3 .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-txH0zMUXcmkiCIv3 .task{stroke-width:2}#mermaid-svg-txH0zMUXcmkiCIv3 .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-txH0zMUXcmkiCIv3 .taskText:not([font-size]){font-size:11px}#mermaid-svg-txH0zMUXcmkiCIv3 .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-txH0zMUXcmkiCIv3 .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-txH0zMUXcmkiCIv3 .task.clickable{cursor:pointer}#mermaid-svg-txH0zMUXcmkiCIv3 .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-txH0zMUXcmkiCIv3 .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-txH0zMUXcmkiCIv3 .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-txH0zMUXcmkiCIv3 .taskText0,#mermaid-svg-txH0zMUXcmkiCIv3 .taskText1,#mermaid-svg-txH0zMUXcmkiCIv3 .taskText2,#mermaid-svg-txH0zMUXcmkiCIv3 .taskText3{fill:#fff}#mermaid-svg-txH0zMUXcmkiCIv3 .task0,#mermaid-svg-txH0zMUXcmkiCIv3 .task1,#mermaid-svg-txH0zMUXcmkiCIv3 .task2,#mermaid-svg-txH0zMUXcmkiCIv3 .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-txH0zMUXcmkiCIv3 .taskTextOutside0,#mermaid-svg-txH0zMUXcmkiCIv3 .taskTextOutside2{fill:#000}#mermaid-svg-txH0zMUXcmkiCIv3 .taskTextOutside1,#mermaid-svg-txH0zMUXcmkiCIv3 .taskTextOutside3{fill:#000}#mermaid-svg-txH0zMUXcmkiCIv3 .active0,#mermaid-svg-txH0zMUXcmkiCIv3 .active1,#mermaid-svg-txH0zMUXcmkiCIv3 .active2,#mermaid-svg-txH0zMUXcmkiCIv3 .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-txH0zMUXcmkiCIv3 .activeText0,#mermaid-svg-txH0zMUXcmkiCIv3 .activeText1,#mermaid-svg-txH0zMUXcmkiCIv3 .activeText2,#mermaid-svg-txH0zMUXcmkiCIv3 .activeText3{fill:#000 !important}#mermaid-svg-txH0zMUXcmkiCIv3 .done0,#mermaid-svg-txH0zMUXcmkiCIv3 .done1,#mermaid-svg-txH0zMUXcmkiCIv3 .done2,#mermaid-svg-txH0zMUXcmkiCIv3 .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-txH0zMUXcmkiCIv3 .doneText0,#mermaid-svg-txH0zMUXcmkiCIv3 .doneText1,#mermaid-svg-txH0zMUXcmkiCIv3 .doneText2,#mermaid-svg-txH0zMUXcmkiCIv3 .doneText3{fill:#000 !important}#mermaid-svg-txH0zMUXcmkiCIv3 .crit0,#mermaid-svg-txH0zMUXcmkiCIv3 .crit1,#mermaid-svg-txH0zMUXcmkiCIv3 .crit2,#mermaid-svg-txH0zMUXcmkiCIv3 .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-txH0zMUXcmkiCIv3 .activeCrit0,#mermaid-svg-txH0zMUXcmkiCIv3 .activeCrit1,#mermaid-svg-txH0zMUXcmkiCIv3 .activeCrit2,#mermaid-svg-txH0zMUXcmkiCIv3 .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-txH0zMUXcmkiCIv3 .doneCrit0,#mermaid-svg-txH0zMUXcmkiCIv3 .doneCrit1,#mermaid-svg-txH0zMUXcmkiCIv3 .doneCrit2,#mermaid-svg-txH0zMUXcmkiCIv3 .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-txH0zMUXcmkiCIv3 .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-txH0zMUXcmkiCIv3 .milestoneText{font-style:italic}#mermaid-svg-txH0zMUXcmkiCIv3 .doneCritText0,#mermaid-svg-txH0zMUXcmkiCIv3 .doneCritText1,#mermaid-svg-txH0zMUXcmkiCIv3 .doneCritText2,#mermaid-svg-txH0zMUXcmkiCIv3 .doneCritText3{fill:#000 !important}#mermaid-svg-txH0zMUXcmkiCIv3 .activeCritText0,#mermaid-svg-txH0zMUXcmkiCIv3 .activeCritText1,#mermaid-svg-txH0zMUXcmkiCIv3 .activeCritText2,#mermaid-svg-txH0zMUXcmkiCIv3 .activeCritText3{fill:#000 !important}#mermaid-svg-txH0zMUXcmkiCIv3 .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-txH0zMUXcmkiCIv3 g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-txH0zMUXcmkiCIv3 g.classGroup text .title{font-weight:bolder}#mermaid-svg-txH0zMUXcmkiCIv3 g.clickable{cursor:pointer}#mermaid-svg-txH0zMUXcmkiCIv3 g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-txH0zMUXcmkiCIv3 g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-txH0zMUXcmkiCIv3 .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-txH0zMUXcmkiCIv3 .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-txH0zMUXcmkiCIv3 .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-txH0zMUXcmkiCIv3 .dashed-line{stroke-dasharray:3}#mermaid-svg-txH0zMUXcmkiCIv3 #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-txH0zMUXcmkiCIv3 #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-txH0zMUXcmkiCIv3 #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-txH0zMUXcmkiCIv3 #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-txH0zMUXcmkiCIv3 #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-txH0zMUXcmkiCIv3 #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-txH0zMUXcmkiCIv3 #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-txH0zMUXcmkiCIv3 #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-txH0zMUXcmkiCIv3 .commit-id,#mermaid-svg-txH0zMUXcmkiCIv3 .commit-msg,#mermaid-svg-txH0zMUXcmkiCIv3 .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-txH0zMUXcmkiCIv3 .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-txH0zMUXcmkiCIv3 .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-txH0zMUXcmkiCIv3 g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-txH0zMUXcmkiCIv3 g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-txH0zMUXcmkiCIv3 g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-txH0zMUXcmkiCIv3 g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-txH0zMUXcmkiCIv3 g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-txH0zMUXcmkiCIv3 g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-txH0zMUXcmkiCIv3 .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-txH0zMUXcmkiCIv3 .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-txH0zMUXcmkiCIv3 .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-txH0zMUXcmkiCIv3 .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-txH0zMUXcmkiCIv3 .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-txH0zMUXcmkiCIv3 .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-txH0zMUXcmkiCIv3 .edgeLabel text{fill:#333}#mermaid-svg-txH0zMUXcmkiCIv3 .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-txH0zMUXcmkiCIv3 .node circle.state-start{fill:black;stroke:black}#mermaid-svg-txH0zMUXcmkiCIv3 .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-txH0zMUXcmkiCIv3 #statediagram-barbEnd{fill:#9370db}#mermaid-svg-txH0zMUXcmkiCIv3 .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-txH0zMUXcmkiCIv3 .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-txH0zMUXcmkiCIv3 .statediagram-state .divider{stroke:#9370db}#mermaid-svg-txH0zMUXcmkiCIv3 .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-txH0zMUXcmkiCIv3 .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-txH0zMUXcmkiCIv3 .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-txH0zMUXcmkiCIv3 .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-txH0zMUXcmkiCIv3 .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-txH0zMUXcmkiCIv3 .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-txH0zMUXcmkiCIv3 .note-edge{stroke-dasharray:5}#mermaid-svg-txH0zMUXcmkiCIv3 .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-txH0zMUXcmkiCIv3 .error-icon{fill:#522}#mermaid-svg-txH0zMUXcmkiCIv3 .error-text{fill:#522;stroke:#522}#mermaid-svg-txH0zMUXcmkiCIv3 .edge-thickness-normal{stroke-width:2px}#mermaid-svg-txH0zMUXcmkiCIv3 .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-txH0zMUXcmkiCIv3 .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-txH0zMUXcmkiCIv3 .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-txH0zMUXcmkiCIv3 .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-txH0zMUXcmkiCIv3 .marker{fill:#333}#mermaid-svg-txH0zMUXcmkiCIv3 .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-txH0zMUXcmkiCIv3 {color: rgba(0, 0, 0, 0.75);font: ;}

DTMF频率
目 录
Contents
DTMF频谱分布
DTMF频率序列差
低频与高频之间的关系
优化低频
优化低频算法
分析总结

§01 DTMF频率


  在检测DTMF信号中的时间间隔检测DTMF信号质量对于双音频电话拨号的波形质量与检测进行测试。那么遗留下一个问题,一直希望能够弄清楚:

  • 为什么DTMF频率选择这些频率呢?

1.1 DTMF频谱分布

  下表格中给出了DTMF高频组与低频组各自的频率 以及他们组合对应的电话号码。

【表1-1 DTMF频率定义意向组合定义】
Key Row Frequencies Column Frequencies Q1 Q2 Q3 Q4
1 697 1209 0 0 0 1
2 697 1336 0 0 1 0
3 697 1477 0 0 1 1
4 770 1209 0 1 0 0
5 770 1336 0 1 0 1
6 770 1477 0 1 1 0
7 852 1209 0 1 1 1
8 852 1336 1 0 0 0
9 852 1477 1 0 0 1
0 941 1336 1 0 1 0
* 941 1209 1 0 1 1
# 941 1477 1 1 0 0

  实际上对于低频组合高频组的频率都总共有四个,可以参见下图所示。

▲ 图1.1.1 DTMF频率

  • Lakhovskys MultiWave Oscillator (MWO) Another Perspective by Ed Wahler
  • GENERATING DTMF WITH SOX
  • The history of DTMF in contact centers

1.2 DTMF频率序列差

  求低频组合高频组的频率差对应的情况。

import sys,os,math,time
import matplotlib.pyplot as plt
from numpy import *lowfreq = [697, 770, 852, 941]
highfreq = [1209, 1336, 1477, 1633]dellowf = [f1-f2 for f1,f2 in zip(lowfreq[1:], lowfreq[:-1])]
delhighf = [f1-f2 for f1,f2 in zip(highfreq[1:], highfreq[:-1])]print("dellowf: {}".format(dellowf), "delhighf: {}".format(delhighf))
dellowf: [73, 82, 89] delhighf: [127, 141, 156]

1.3 低频与高频之间的关系

  下面给出了低频的二倍频的数值与高频之间的关系。

array(lowfreq)*2: [1394 1540 1704 1882]
array(highfreq): [1209 1336 1477 1633]

  求取这些频率对应的最小的频率差值:

low2f = list(array(lowfreq)*2)
low2f.extend(highfreq)
low2f = sorted(low2f)deltf = [f1-f2 for f1,f2 in zip(low2f[1:], low2f[:-1])]
print(deltf)
[127, 58, 83, 63, 93, 71, 178]

  可以看到低频二次谐波与高频之间的最小的频率差为58。对比前面,各个低频组之间的差值最小为73。

§02 优化低频


  假若高频的四个频率固定,那么对于低频四个频率应该如何选择可以使得这四个频率及其它们的二倍频与高频之间的频率都相差都很大。

2.1 优化低频算法

2.1.1 优化条件

  假设低频的取值范围【650, 941】之间,对于下面三个频率 f1≤f2≤f3f_1 \le f_2 \le f_3f1​≤f2​≤f3​ ,且 f1,2,3∈[650,941]f_{1,2,3} \in \left[ {650,941} \right]f1,2,3​∈[650,941] ,使得这三个四个低频频率与它们的二倍频与高频之间的最小频率差达到最小。

2.1.2 优化代码

def deltaValue(f1,f2,f3):lowf = sorted([f1,f2,f3,941])delfreq = [f1-f2 for f1,f2 in zip(lowf[1:], lowf[:-1])]minlow = min(delfreq)highf = sorted([f1*2,f2*2,f3*2,941*2,1209,1336,1447,1633])delfreq = [f1-f2 for f1,f2 in zip(highf[1:], highf[:-1])]minhigh = min(delfreq)if minlow < minhigh: return minlowelse: return minhighmaxvalue = 0
maxf123 = []for f1 in range(650, 941):for f2 in range(f1, 941):for f3 in range(f2, 941):delval = deltaValue(f1,f2,f3)if delval > maxvalue:maxvalue = delvalmaxf123 = [f1,f2,f3]print("maxvalue: {}".format(maxvalue))
print("maxf123: {}".format(maxf123))
maxvalue: 55
maxf123: [696, 751, 844]

  通过上面的求解,可以看到所选择的DTMF频率值与最优的之间的差异比较较小。

※ 分析总结 ※


  通过一个简单的实验来验证一下为什么DTMF的频率选取这些数值的频率。它们的存在使得低频频的二倍频与高频频率的差异达到最小。

  具体原因可以通过Bell实验室的报告进行检索,回答为什么DTMF这样选择频率。


■ 相关文献链接:

  • 检测DTMF信号中的时间间隔
  • 检测DTMF信号质量
  • Lakhovskys MultiWave Oscillator (MWO) Another Perspective by Ed Wahler
  • GENERATING DTMF WITH SOX
  • The history of DTMF in contact centers

● 相关图表链接:

  • 表1-1 DTMF频率定义意向组合定义
  • 图1.1.1 DTMF频率
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST1.PY                     -- by Dr. ZhuoQing 2022-02-03
#
# Note:
#============================================================from headm import *                 # =#------------------------------------------------------------
lowfreq = [697, 770, 852, 941]
highfreq = [1209, 1336, 1477, 1633]#printt(lowfreq:, highfreq:)dellowf = [f1-f2 for f1,f2 in zip(lowfreq[1:], lowfreq[:-1])]
delhighf = [f1-f2 for f1,f2 in zip(highfreq[1:], highfreq[:-1])]printt(dellowf:, delhighf:)#------------------------------------------------------------printt(array(lowfreq)*2:)
printt(array(highfreq):)#------------------------------------------------------------
low2f = list(array(lowfreq)*2)
low2f.extend(highfreq)
low2f = sorted(low2f)deltf = [f1-f2 for f1,f2 in zip(low2f[1:], low2f[:-1])]
printt(deltf)#------------------------------------------------------------
def deltaValue(f1,f2,f3):lowf = sorted([f1,f2,f3,941])delfreq = [f1-f2 for f1,f2 in zip(lowf[1:], lowf[:-1])]minlow = min(delfreq)highf = sorted([f1*2,f2*2,f3*2,1209,1336,1447,1633])delfreq = [f1-f2 for f1,f2 in zip(highf[1:], highf[:-1])]minhigh = min(delfreq)if minlow < minhigh: return minlowelse: return minhighmaxvalue = 0
maxf123 = []for f1 in range(650, 941):for f2 in range(f1, 941):for f3 in range(f2, 941):delval = deltaValue(f1,f2,f3)if delval > maxvalue:maxvalue = delvalmaxf123 = [f1,f2,f3]printt(maxvalue:)
printt(maxf123:)#------------------------------------------------------------printt(deltaValue(697,770,852))#------------------------------------------------------------
#        END OF FILE : TEST1.PY
#============================================================

DTMF的原理:为什么选择这些频率?相关推荐

  1. 双音多频 DTMF原理

    双音多频 DTMF(Dual Tone Multi Frequency),双音多频,由高频群和低频群组成,高低频群各包含4个频率.一个高频信号和一个低频信号叠加组成一个组合信号,代表一个数字.DTMF ...

  2. 基于DTMF技术与射频技术的远程控制的实现

    摘 要:介绍了以 AT89S52 单片机 为控制核心,利用DTMF发送/接收一体芯片 MT8880 和公共电话网以及全球移动通信网( GSM ),并加上ASk方式的无线射频收发技术实现远程控制. 公共 ...

  3. 使用C语言编写DTMF检测程序,DSP课程设计---DTMF信号的产生及检测.doc

    DSP课程设计---DTMF信号的产生及检测 DSP课程设计 实 验 报 告 DTMF信号的产生及检测 院(系): 电子信息工程学院通信工程专业 设计人员:宋佳阳 学号目录 一.设计任务书- 3 - ...

  4. 自己动手修改龙邱信标灯固件FM频率

    作者:佟超 更新时间:2020-08-06 Thursday 在 第十五届全国大学生智能汽车竞赛竞赛 中增加了信标组的比赛.其中按照 声音信标规格说明 2020-5-25 中的说明,其中的FM发送频率 ...

  5. MFCC梅尔频率倒谱系数

    MFCC梅尔频率倒谱系数原理及python实现 文章目录 MFCC梅尔频率倒谱系数原理及python实现 MFCC梅尔频率倒谱系数的原理 计算MFCC的步骤 1.音频信号文件读取及预加重 2.信号分帧 ...

  6. matlab 双音频信号的检测,双音频(DTMF)信号的产生与检测.doc

    双音频(DTMF)信号的产生与检测 XXXXXXX大学 毕 业 论 文 (设 计) 题目:双音频(DTMF)信号的产生与检测 学生姓名 学 号 专 业电子信息工程 班 级2008级1班 指导教师 学 ...

  7. bmp180气压传感器工作原理_37张传感器工作原理动图,张张经典

    37张传感器工作原理动图来袭, 让你大饱眼福! 1.布料张力测量及控制原理 2.直滑式电位器控制气缸活塞行程 3.压阻式传感器测量液位的工作原理 4.MQN型气敏电阻结构及测量电路 5.气泡式水平仪的 ...

  8. 【数字信号】基于matlab GUI DTMF电话模拟系统(频谱图+时域图+语谱图)【含Matlab源码 2092期】

    ⛄一.DTMF简介 1 含义 双音多频 DTMF(Dual Tone Multi Frequency),双音多频,由高频群和低频群组成,高低频群各包含4个频率.一个高频信号和一个低频信号叠加组成一个组 ...

  9. 【数字信号】基于matlab GUI DTMF双音多频信号仿真演示系统(戈泽尔算法)【含Matlab源码 016期】

    ⛄一.DTMF简介 1 含义 双音多频 DTMF(Dual Tone Multi Frequency),双音多频,由高频群和低频群组成,高低频群各包含4个频率.一个高频信号和一个低频信号叠加组成一个组 ...

最新文章

  1. Debian Linux下安装配置 Pure-ftpd
  2. django源码分析 LazySetting对象
  3. 字体--Ubuntu手记之系统配置
  4. 移动端禁止页面缩放问题
  5. Bootstrap 表格的可选样式
  6. UI设计案例|文件管理App界面设计灵感
  7. linux系统下安装游戏,在Linux系统下安装GameHub来管理所有游戏
  8. Executor框架(转载)
  9. window下从python开始安装科学计算环境
  10. PHP配置问题(找不到指定模块)解决办法
  11. 中国射频前端产业现状分析
  12. 小滴课堂-学习笔记:(1)JAVASE课程
  13. 组态王bitset用法_组态王使用问题解答8
  14. HttpClient在Android新API上的java.lang.NoSuchFieldError: No static field INSTANCE问题
  15. 软件工程的可行性分析
  16. java在控制台打印心形图案
  17. oracle remap schema,oracle 10g DATA PUMP 的REMAP_SCHEMA和REMAP_TABLESPACE的功能
  18. 软件界面交互式设计注意事项
  19. 视频任意截取某一处图片怎么操作
  20. 一个SAPer的网络日志-连载一-看,内部订单都能用来干啥

热门文章

  1. cmake:gcc-stack-protector
  2. matlab图像去噪最好方法,基于MATLAB软件的图像去噪方法比较_王姣斐
  3. 已解决-您没有权限打开应用程序“xf-adesk2018.app”
  4. MS-Celeb-1M 数据
  5. 基于nodejs+vue的社区医院管理服务系统
  6. NLP文本预处理:步骤、示例 | 附github源码
  7. 从原理上“训练”一个神经网络(下)
  8. 曾想亲手解析未知化合物晶体结构
  9. 心流理论(mental flow)(我的)
  10. 【Ruby on Rails】2021 OWASP TOP 10 的安全加固建议