-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdtmf.py
60 lines (55 loc) · 2.01 KB
/
dtmf.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
from wave import struct
from math import sin, pi
#cette classe est utilisée afin de créer notre propre type d'erreur
#ce type est utilisé uniquement lorsqu'un caractère non-valide est donné
class DTMFError(Exception): pass
#variable qui associe un chiffre/une lettre à deux fréquences
dtmf = {
'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),
}
blank = ('+','-','.') #caractères à ignorer
def genWave(j, freq0, freq1, freq2, amp):
"""
Génération du signal pour un échantillon en suivant l'exemple donné sur Wikipédia
(https://fr.wikipedia.org/wiki/Code_DTMF)
"""
#ux = 2 * pi * (freqx/freq0)
u1 = 2 * pi * (freq1/freq0)
u2 = 2 * pi * (freq2/freq0)
#résultat = amplitude + 63*sin(u1*j) + 63*sin(u2*j)
return int(amp + 63*sin(u1*j) + 63*sin(u2*j))
def convertDTMF(number, freq, duree, amp):
"""
Conversion du numéro donné en liste d'échantillons à écrire dans un fichier
"""
finalSND = [] #les samples seront placés dedans
splTon = duree*len(number)*freq #nombre total de samples pour les tonalités
splPoz = (duree/2*freq)*len(number) #nombre total de samples pour les pauses
spl = int(splTon+splPoz) #duree totale en samples
for i in number: #pour chaque chiffre
if i in dtmf:
for j in range(0,int(duree*freq)): #pour chaque sample
freq1 = dtmf[i][0] #on prend la première valeur associée au chiffre
freq2 = dtmf[i][1] #et la seconde
res = genWave(j, freq, freq1, freq2, amp) #on génère le signal avec la fonction définie ci-dessus
finalSND.append(struct.pack("B",res)) #et on l'ajoute à la liste qui sera retournée
for k in range(0,int(duree/2*freq)): #pour chaque sample de la pause
finalSND.append(struct.pack("B",0)) #on ajoute des 0
elif not i in blank:
raise DTMFError("Unknown character \""+i+"\"")
return finalSND, spl