首先先说明一下 DTMF 的定义:Dual-Tone Multi-Frequency, 常见的应用就是电话按键的编码及解码. 如电话按键 4 * 4 的矩阵对应表.
由一组低频与一组高频的 SINE 波形相加组成.
我们可以函数来表示:
def sine_sine_wave(f1, f2, length, rate):
s1=sine_wave(f1,length,rate)
s2=sine_wave(f2,length,rate)
ss=s1+s2
sa=numpy.divide(ss, 2.0)
return sa
其中 f1, f2, 分别表示两个频率, length 表示这个 tone 波形的时间, rate 表示采样率(每秒采样的样本点数量)
而 sin_wave 的波形节点可以如下表达:
def sine_wave(frequency, length, rate):
length = int(length * rate)
factor = float(frequency) * (math.pi * 2) / rate
return numpy.sin(numpy.arange(length) * factor)
如 sine_wave(690, 0.2, 44100) 就会得到 8820 个 sine 波形节点.
要生成 tone 的 wave 资料, 建立 digits 对应表 -
dtmf_freqs = {'1': (1209,697), '2': (1336, 697), '3': (1477, 697), 'A': (1633, 697),
'4': (1209,770), '5': (1336, 770), '6': (1477, 770), 'B': (1633, 770),
'7': (1209,852), '8': (1336, 852), '9': (1477, 852), 'C': (1633, 852),
'*': (1209,941), '0': (1336, 941), '#': (1477, 941), 'D': (1633, 941)}
dtmf_digits = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '*', '0', '#', 'A', 'B', 'C', 'D']
以下的函数用于表达一个 tone 集合所产生的波形资料, 每个 tone 产生 0.2 秒, tone与tone 间隔 0.2 秒.
def play_dtmf_tone(stream, digits, length=0.20, rate=44100):
dtmf_freqs = {'1': (1209,697), '2': (1336, 697), '3': (1477, 697), 'A': (1633, 697),
'4': (1209,770), '5': (1336, 770), '6&