DTMF的原理:为什么选择这些频率?
Posted 卓晴
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DTMF的原理:为什么选择这些频率?相关的知识,希望对你有一定的参考价值。
简 介: 通过一个简单的实验来验证一下为什么DTMF的频率选取这些数值的频率。它们的存在使得低频频的二倍频与高频频率的差异达到最小。具体原因可以通过Bell实验室的报告进行检索,回答为什么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】之间,对于下面三个频率 f 1 ≤ f 2 ≤ f 3 f_1 \\le f_2 \\le f_3 f1≤f2≤f3 ,且 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这样选择频率。
■ 相关文献链接:
- 检测DTMF信号中的时间间隔
- 检测DTMF信号质量
- Lakhovskys MultiWave Oscillator (MWO) Another Perspective by Ed Wahler
- GENERATING DTMF WITH SOX
- The history of DTMF in contact centers
● 相关图表链接:
#!/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期