Detección de tonos DTMF usando el algoritmo de Goertzel

Resumen. El proyecto consiste en realizar un detector DTMF que esté de acuerdo a la norma Q.24 DTMF de la ITU. Como todos saben un tono DMTF está compuesto por la suma de dos señales senoidales, una de frecuencia baja y otra de frecuencia alta. El objetivo de este proyecto es detectar señales reales telefónicas, las cuales se encuentran grabadas en un archivo. Así el programa recibe como entrada dicho archivo y mediante la implementación recursiva del algoritmo de Goertzel se logra decodificar satisfactoriamente las señales DTMF sin importar si la grabación de las mismas ha sido realizada dentro de un ambiente con ruido, por ejemplo música o personas hablando.Nuestro trabajo cumple los requerimientos básicos de la recomendación ITU: válida frecuencia, válida tiempo, válida energía.

Generación de un tono DTMF.

La generación de tonos es simple, basta guiarse del siguiente cuadro para saber que frecuencias son las que corresponden a cada dígito.

Por ejemplo si se desea generar el tono DMTF para el digito 5 se debe sumar dos señales senoidales, una con frecuencia 770Hz y la otra con frecuencia 1336Hz. Se creo un programa en Matlab que implementará esto de forma sencilla. Descargue los siguientes archivos: gdtmf.m y genera.m. El archivo principal es gdtmf.m, vea el help de cada archivo para mayor detalle.

Especificaciones ITU

La ITU exige que la duración del tono DTMF sea de 40ms es por eso que se eligió una duración de 10ms por ventana. Además se exige que la desvicación de frecuencia aceptada sea de +/-1.5% mientras que una frecuencia es rechazad si presenta una desviación de +/-3.5%.  

Algoritmo de Goertzel. Este algoritmo consiste en un filtro IIR recursivo con un par de polos conjugados. Su función de transferencia está dado por la siguiente ecuación:

 

donde:

 

Fdtmf es la frecuencia correspondientes a cada tono, Fsample es la frecuencia de muestreo y N son el número de muestras por ventanas, que en nuestro caso será de 80, pues cada ventana es de 10ms y usaremos una frecuencia de muestreo de 8000Hz.

Diagrama del filtro

Diseñando el detector.

Primero se planteo la necesidad de poder detectar cualquier tono DMTF sin importar bajo que medio se encuentre. Para esto se utiliza un filtro que nos deje solamente el rango de frecuencias bajas y altas en donde puedan existir posibles tonos DTMF, tal como se muestra en el siguiente gráfico:

Se les da el código del filtro que hace esto: filtro que deja solamente rango de frecuencias de tonos DTMF.

 Ahora para el proceso de detección de los tonos DTMF se hará uso de ventanas de 10ms de duración, cada ventana equivale a 80 muestras teniendo en cuenta que la frecuencia de muestreo es de 8Khz. Además el algoritmo esta implementado para considerar los casos de pausa prolongada o de una breve interrupción de la señal. Durante cada ventana lo que se calcula es la energía presente en cada grupo de frecuencias (bajas y altas) mediante el uso de la siguiente ecuación:

Donde se considera las siguientes condiciones iniciales:

 

Este valor de energía se calcula para cada frecuencia DTMF y se almacena en una matriz para luego ser comparada con un valor umbral, sin embargo antes de realizar esta comparación se determine el máximo valor de frecuencia para cada datos tomados en cada ventana. Se da por detectado un tono válido cuando la energía de una frecuencia se cumple para 3 o más ventanas de 10ms cada una, esto es lo que permite a nuestro algoritmo considerar posibles interrupciones breves de la señal. Luego de esto se espera por el período de pausa, es decir, no interesa que el tono siga estando presente (dedo presionando largo tiempo tecla de teléfono) ya que dicho tono ya fue detectado. Durante el período de pausa la energía disminuye preparándose para la detección del siguiente tono. Este período de pausa es el llamado bucle de espera, en este bucle se esta esperando por un determinado tiempo, si durante este tiempo de espera no vuelve a aparecer otro tono DTMF se da por concluido la detección. Durante cada detección de un tono válido se muestra en pantalla el respectivo digito marcado.

Lo particular de esta implementación es que nos permite variar el valor de k a voluntad para así poder sintonizar adecuadamente el filtro de goertzel a las respectivas frecuencias DTMF de acuerdo al siguiente cuadro.

El código del programa completo que implementa esta detección se encuentra disponible para su análisis mediante los siguientes links: dtmf.m comparacion.m frecuencias.m tabla.m El programa principal es dtmf.m

Algunas observaciones.

·         Las frecuencias bajas son 2dB menos que las altas.

·         Se tuvo problemas en la determinación exacta del umbral a ser utilizado por nuestro algoritmo.

·         Se dedujo que la medición de la energía depende mucho de la cercanía de la fuente hacia el detector.

·         Hay la posibilidad de hacer ventanas deslizante tradeoff entre longitud de ventanas y precisión de frecuencias.

Conclusiones.

Este algoritmo cumple bastante bien las especificaciones requeridas y debido a la implementación del algoritmo de Goertzel en forma recursiva es que se da la posibilidad de desarrollar este proyecto en cualquier Procesador Digital de Señales (DSP),lo cual lamentablemente no se pudo implementar debido a la falta de tiempo.

Links de interés.

Efficient Dual-Tone Multi-Frequency Detection Using the Non-Uniform Discrete Fourier Transform, de Matthew D. Felder, James C. Mason, y Brian L. Evans.

Efficient Dual-Tone Multi-Frequency Detection Using the Non-Uniform Discrete Fourier Transform, de Matthew D. Felder, James C. Mason, y Brian L. Evans.

Detection of Multi-tone Signals Based on Energy Operators, Edgar. F. Velez


View My Guestbook
Sign My Guestbook