Décodeur DTMF
Quand une touche de téléphone est pressée, l'appareil émet la somme de deux sinusoïdes de fréquences connues, une par ligne du clavier, une par colonne : c'est le code DTMF (dual-tone multi-frequency), toujours utilisé par les serveurs vocaux. Décoder un numéro composé, c'est répondre à deux questions en boucle : quand une tonalité est-elle présente, et laquelle des seize touches a produit chaque tonalité. La première est un problème de détection à seuil, la seconde une décision multi-hypothèses par banque de filtres adaptés : ce projet fait construire le décodeur complet, du signal audio au numéro de téléphone.
| 1209 Hz | 1336 Hz | 1477 Hz | 1633 Hz | |
|---|---|---|---|---|
| 697 Hz | 1 | 2 | 3 | A |
| 770 Hz | 4 | 5 | 6 | B |
| 852 Hz | 7 | 8 | 9 | C |
| 941 Hz | * | 0 | # | D |
1. Lien avec le cours
Le projet est le capstone du chapitre 3 : un détecteur à seuil dont le seuil est calibré pour un budget
2. Structure du code
Le modèle est une chaîne de transmission en trois classes : l'encodeur et le canal fabriquent le monde physique, le décodeur est l'endroit exact où les algorithmes du cours s'insèrent, une méthode par algorithme.
class DTMFEncoder:
"""Keys to waveform: two known frequencies per key, tones and silences."""
def __init__(self, fs=8000, tone=0.08, silence=0.08, amplitude=1.0):
...
def encode(self, keys):
"""'0612...' -> waveform s[n]."""
...
class AWGNChannel:
"""Additive white Gaussian noise channel."""
def __init__(self, sigma):
self.sigma = sigma
def transmit(self, s, rng):
"""x = s + w, with w ~ N(0, sigma^2)."""
...
class DTMFDecoder:
"""Waveform to keys: every course algorithm lives in one method."""
def __init__(self, fs=8000, window=0.04, gamma=None):
...
def segment(self, x):
"""Sliding-window energy detector: tone-present intervals."""
...
def correlate(self, frame):
"""Correlator bank on the 8 known frequencies (both quadratures)."""
...
def decode(self, x):
"""Full chain: segment, correlate, decide -> '0612...'."""
...Tests imposés. L'aller-retour sans bruit, decode(encode(keys)) == keys, sur les seize touches ; la
3. Travail demandé
- L'encodeur. Implémenter
DTMFEncoder.encode: pour chaque touche, la somme des deux sinusoïdes de la table, suivie d'un silence. Écouter le résultat (IPython.display.Audio) : un numéro composé doit sonner comme un téléphone. - Le canal. Implémenter
AWGNChannel.transmitet définir proprement le SNR utilisé dans tout le projet, le rapport entre la puissance d'une tonalité et, en dB. Écouter le numéro à , et dB. - La segmentation. Implémenter
segment: l'énergiesur une fenêtre glissante, comparée à un seuil . Calibrer sous : simuler du bruit seul, prendre le quantile empirique correspondant à par fenêtre, puis vérifier cette calibration sur de nouveaux tirages. Fusionner les fenêtres contiguës en intervalles de tonalité, en imposant une durée minimale. - La banque de corrélateurs. Implémenter
correlate: pour un segment donné, corréler avec les gabaritset de chacune des fréquences, et sommer les deux carrés, la phase à l'entrée d'un segment étant inconnue, exactement la séparation des variables linéaires du projet d'analyse spectrale. Décider la touche par la ligne et la colonne les plus fortes. - La performance. Estimer par Monte-Carlo la matrice de confusion
à SNR fixé, puis l'exactitude en fonction du SNR de à dB. Où sont les confusions : entre touches d'une même ligne, d'une même colonne, au hasard ? - Le compromis de fenêtrage. Refaire l'étape 5 à SNR fixé pour des fenêtres de
, , et ms. Expliquer les deux régimes avec les outils du cours : fenêtre courte, les colonnes des fréquences voisines deviennent quasi colinéaires et la matrice de Gram se dégrade, les lignes voisines se confondent ; fenêtre longue, la résolution est excellente mais les tonalités courtes ou rapprochées ne sont plus séparées par le segmenteur. Proposer et justifier une longueur de fenêtre. - Bout en bout. Décoder un numéro complet de dix chiffres à plusieurs SNR : à partir de quel SNR le numéro passe-t-il sans erreur ? Bonus : enregistrer un vrai clavier DTMF (une application de numérotation) avec un microphone, et décoder l'enregistrement.
4. Livrables
Le notebook reproductible des modalités communes, avec les écoutes aux étapes 1 et 2, la vérification de calibration de l'étape 3, la matrice de confusion et la courbe exactitude/SNR, l'étude de fenêtrage commentée, et le verdict du décodage bout en bout.
