DTMF的原理:为什么选择这些频率?

Posted 卓晴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DTMF的原理:为什么选择这些频率?相关的知识,希望对你有一定的参考价值。

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

关键词 DTMF谐波

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

 

§01 DTMF频率


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

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

1.1 DTMF频谱分布

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

【表1-1 DTMF频率定义意向组合定义】

KeyRow FrequenciesColumn FrequenciesQ1Q2Q3Q4
169712090001
269713360010
369714770011
477012090100
577013360101
677014770110
785212090111
885213361000
985214771001
094113361010
*94112091011
#94114771100

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

▲ 图1.1.1 DTMF频率

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】之间,对于下面三个频率 f 1 ≤ f 2 ≤ f 3 f_1 \\le f_2 \\le f_3 f1f2f3 ,且 f 1 , 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 minlow
    else: return minhigh

maxvalue = 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 = delval
                maxf123 = [f1,f2,f3]

print("maxvalue: ".format(maxvalue))
print("maxf123: ".format(maxf123))
maxvalue: 55
maxf123: [696, 751, 844]

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

 

析总结 ※


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

  具体原因可以通过Bell实验室的报告进行检索,回答为什么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 minlow
    else: return minhigh


maxvalue = 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 = delval
                maxf123 = [f1,f2,f3]

printt(maxvalue:)
printt(maxf123:)

#------------------------------------------------------------

printt(deltaValue(697,770,852))


#------------------------------------------------------------
#        END OF FILE : TEST1.PY
#============================================================

以上是关于DTMF的原理:为什么选择这些频率?的主要内容,如果未能解决你的问题,请参考以下文章

数字信号基于matlab DTMF电话拨号音识别含Matlab源码 218期

数字信号基于matlab GUI DTMF信号生成与检测(带按键音)含Matlab源码 1086期

数字信号基于matlab GUI多音双频(DTMF)拨号音频解码仿真系统含Matlab源码 1084期

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

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

数字信号基于matlab GUI DTMF双音多频手机拨号仿真系统含Matlab源码 1085期