- ohne FFT und Goertzel-Algorithmus!
- Analyse der Interferenzmuster
- 16-bit Frequenzzähler
Einleitung
Das sog. MVF (Mehrfrequenzverfahren) oder auch DTMF (Dual Tone Multiple Frequency) wird bei der Telefonvermittlungstechnik genutzt. Es wird gebildet durch eine Überlagerung von zwei sinusförmigen Tonsignalen. Bei der Dekodierung gilt es, die beiden Frequenzbestandteile zu erkennen, um daraus die zugehörigen Tastencodes zu identifizieren:
Weitere Informationen sind zum Beispiel bei Wikipedia zu finden.
Zur
Dekodierung werden meist spezielle Rechenoperationen verwendet: Die
sog. Fast-Fourier-Transformation (FFT) oder der Goertzel-Algorithmus.
Hiermit kann präzise Frequenzanalyse betrieben werden. Sie erfordern
jedoch sehr viel Speicherplatz. Außerdem werden Kenntnisse in höherer
Mathematik benötigt. Mein Interesse bestand darin, für einen
Mikrocontroller der Tiny-Klasse, hier den ATtiny26, einen alternativen
Weg zu finden, um DTMF-Codes zu entschlüsseln. Es werden dabei
Ausschnitte der Interferenzmuster der beiden sich überlappenden
Frequenzen analysiert. Ausgabe erfolgt mit einer Sieben-Segment-Anzeige.
Durch das spezielle Vorgehen kann auf ein Quarz verzichtet werden. Es
reicht die voreingestellte Taktfrequenz von nur 1 MHz aus. Somit kann
auch einfach mit dem Lernpaket Mikrocontroller programmiert werden! Für
das Electret-Kondensator-Mikrofon wird kein zusätzlicher
Operationsverstärker benötigt, die Verstärkung erfolgt über ein sog.
Differential ADC Channel Pair with gain (x20) des ATtiny26.
Fazit: Ein DTMF-Decoder wird auf diese Weise realisierbar. Die Schaltung benötigt jedoch ein längeres Signal zur
Analyse (ca. 500 ms). Vielleicht interessiert Sie aber auch einfach nur der ungewöhnliche Lösungsweg?
Auf die Funktionsfähigkeit eines Nachbaues wird keine Gewährleistung gegeben!
Anleitung
Programmierung
Der
ATtiny26 kann z.B. mit dem Programmiermodul des Lernpaket
Mikrocontroller von Franzis programmiert werden. Das Vorgehen ist an
anderer Stelle beschrieben. Die Fuses müssen dabei nicht verändert
werden.
Elektronik
Es werden nur sehr wenig externe Bauelemente benötigt. Electret-Kondensator-Mikrofone enthalten bereits einen schwachen, für diese Zwecke ausreichenden Vorverstärker. Als Betriebsspannung sollen ca. 9 V angelegt werden. Diese Spannung wird durch den Spannungsregler auf stabilisierte 5 V heruntergeregelt. Die LED dient zur optimalen Arbeitspunkteinstellung. Zunächst wird ein lautes akustisches Signal auf das Mikrofon gerichtet. Wird der Trimmer weit nach rechts oder links gedreht, leuchtet die LED auf. Der Trimmer ist so zu justieren, dass die LED nicht leuchtet und vom rechten und linken Leuchtbeginn gleich weit entfernt ist.Leuchtet die LED auch in Mittelstellung, so ist das Signal zu stark!
Programmbeschreibung
Die
Idee: Das DTMF-Signal besteht aus zwei sich überlappenden Sinus-Wellen
bekannter Frequenzen. Erzeugt man diese Signale und betrachtet sie mit
dem Oszilloskop, so kann man erkennen, dass durch Addition der beiden
Signale ein für jeden Code typisches Frequenzmuster entsteht.
Dabei ist zu erkennen, dass die höhere der beiden Frequenzen als Welligkeit im Signal stets erhalten bleibt, wenn auch mit zum Teil stark schwankender Amplitude. Die sichtbare Wellenlänge variiert durch die Interferenz geringfügig. Im Mittel über mehrere Perioden kann die höhere Frequenz aber gut bestimmt werden.
Die Erkennung der
niedrigeren der beiden Frequenzen ist etwas schwieriger. Nach og.
Tabelle sind jeder der drei hohen Frequenzen (1209Hz, 1336Hz, 1477Hz)
jeweils vier niedrige Frequenzen zugeordnet die unterschieden werden
müssen.
Aus dem eingehenden Signal werden hierfür die ADCWerte
von 30 Wellenbergen und 29 Wellentälern gespeichert. Diese 59 Werte (8
bit) reichen zur Bestimmung aus. Nach entsprechender Aufbereitung werden
die Werte mit den im Programm gespeicherten Mittelwerten verglichen.
Sie sind mit DTMF_EXCEL_OUT.asm, hier ebenfalls beiliegend, erstellt
worden.
Bei ausreichender Übereinstimmung erfolgt die Ausgabe via
7-Segment-LED-Anzeige. Der kodierte Tastenwert wird zudem in der
Variable TASTE gespeichert.
Für eigene Experimente sind hier sämtliche DTMFSignale als mp3-Datei angehängt. Kleiner Tipp: Als Abspielgerät eignet sich ein Mobiltelefon! Im folgenden werden die einzelnen Programmsegmente dargestellt.
Hauptprogramm
Nach den üblichen Konstanten- und Variablendefinitionen werden die beiden benötigten Interrupts (ITR's) festgelegt:
TIM0_OVF:
Der
ATtiny26 besitzt nur einen 8-bit-Zähler. Dieser reicht für die
Frequenzanalyse nicht aus. Der 16-bit-Zähler wird deswegen als
Software-Lösung gebildet: Mit jedem Overflow des 8-bit-Zählers wird ein
ITR ausgelöst und die Variable uSec_H_ITR (als High-Byte) inkrementiert.
ADC_COMPLETE:
Der ADC-Wandler arbeitet im schnellen
free-runningmode. Nach jeder fertigen Messung wird ein ITR ausgelöst.
Das eigentliche Hauptprogramm ist nur eine Endlosschleife. ADC_START
Initialisierung des ADC-Wandlers: Das Ergebnis ist left-adjusted (8
bit). Wegen der geringen Auflösung kann der ADC-Takt auf 250 kHhz erhöht
werden. Als Eingang wird ein Differential ADC Channel Pair mit
20-facher Verstärkung verwendet. ADC_COMPLETE Dies ist die wichtigste
Routine. Sie wird via Interrupt immer dann aufgerufen, wenn eine
ADC-Messung beendet ist. Nach dem Auslesen des 16bit-Timers
[uSec_H:uSec_L] werden ITR's sofort wieder ermöglicht (sei), um den
Timer nicht zu stören.
Die sog. „Berge" bzw. „Täler" der
Schallwellen werden erkannt, wenn eine ansteigende Welle plötzlich
wieder abfällt bzw. eine abfallende Welle wieder ansteigt. Es werden 30
Berge und 29 Täler im SRAM gespeichert. Ebenso wird der kleinste und
größte ADC-Wert in den Variablen Min und Max gespeichert. Sind 59
Messwerte abgezählt, wird der Zähler gestoppt und die Auswertung kann
beginnnen.
Die Suche der höheren Frequenzen erfolgt in der
Routine FREQ_CHECK. Die zum Vergleich zuvor eingespeicherten Werte
[F1209_H:F1209_L], [F1336_H:F1336_L] und [F1477_H:F1477_L] wurden mit
der folgender Formel
berechnet:
Wurde keine Frequenz gefunden, beginnt das Programm von vorne: Es werden neue ADC-Werte gespeichert usw...
War die Frequenzsuche erfolgreich, kommt es zur Analyse der unteren Frequenz.
TIM0_OVF
Wie bereits beschrieben: Kurze ITR-Routine zum Inkrementieren von uSEC_H_ITR. Ziel: Bestimmung der Zeit (in μs), die zum Durchlaufen von 30 Wellenbergen notwendig ist.
RESTART_uSec
Reset und Initalisierungen für den Neustart
FREQ_CHECK
Für die höheren Frequenzen sind Referenzwerte für die benötigte Zeit im Programm hinterlegt. Der gemessene Wert muss innerhalb des aus Referenzwert [ZH:ZL] und Toleranzwert [Toleranz_H:Toleranz_L] gebildeten Intervalls liegen, um als eine der drei Frequenzen erkannt zu werden. Das Ergebnis wird in der Variable High_Freq gespeichert.
SIGNAL_CHECK
Routine, um die gespeicherten 59 Berg- und Talwerte für die weitere Analyse vorzubereiten:
1.
Entfernung des Gleichstromanteils: Während der Messwertaufnahme wurde
der kleinste Tal-Wert in Min gespeichert. Dieser Wert wird von allen
Bergen und Tälern subtrahiert.
2. Werte „aufweiten": Alle Berge und Täler sollen so angepasst werden, das der kleinste Wert etwa bei 1 und der grösste bei
255
liegt. Dies soll durch Multiplikation mit einem sog. Faktor erfolgen.
Damit dieser Faktor nur aus acht Bit bestehen kann, werden die Werte
ggf. zuvor mehrfach mit zwei multipliziert. Für ausreichende Genauigkeit
müßte eigentlich eine Division mit mindestens zwei Nachkommastellen im
Ergebnis durchgeführt werden:
hier hilft ein Trick:
DTMF_EXCEL_OUT
Allgemeines: Kann das Terminal von Lpmikros.exe aus dem Lernpaket Mikrocontroller verwendet werden, so lassen sich
hier
mithilfe der Routine WrCOM diverse Werte an den Computer übertragen.
Eigentlich ist dieses Programm eine Vorversion des fertigen
DTMF-Decoders ohne Erkennung der tieferen Frequenz.
Hiermit wurden die Referenzwertreihen ermittelt:
1. Terminal von Lpmikros.exe starten abspielen.
3. Taste an PA5 zur Werteaufnahme zweimal drücken.
4. Die 2 x 59 Werte aus dem Terminal kopieren und für EXCEL vorbereiten.
5. Tabellen und Grafiken mit EXCEL erstellen.
6. Wiederkehrende Ausschnitte von Interferenzmustern aus den Grafiken optisch ausfindig machen.
7. Die zugehörigen Tabellenwerte selektieren und für mehrere Ausschnitte Mittelwerte errechnen lassen.
Wertaufnahme durch das Terminal mit WrCOM
Import nach EXCEL und Mittelwerte berechnen
Darstellung der wiederkehrenden Muster
Downloads: