Decodificador de tonos _ Matlab

1 DECODIFICADOR DTMF Luis Nicolalde, Joshua Reyes Departamento de Eléctrica y Electrónica Universidad de la Fuerzas Arm

Views 85 Downloads 1 File size 150KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

1

DECODIFICADOR DTMF Luis Nicolalde, Joshua Reyes Departamento de Eléctrica y Electrónica Universidad de la Fuerzas Armadas ESPE Sangolquí,Ecuador e-mail: [email protected],[email protected]

Resumen: Diseño de un decodificador de mensajes codificados en el sistema de marcación por tonos, también llamado sistema multifrecuencial o DTMF, utilizando filtros analógicos en Matlab. Palabras Clave — Filtros analógicos, decodificador, tonos DTMF , Matlab .

I.

I NTRODUCCIÓN

Se ah dispuesto realizar un decodificador de mensajes a partir de tonos DTMF utilizando solo filtros analógicos, de donde tenemos de antemano la siguiente información: TABLA I FRECUENCIAS DE LAS SEÑALES SEGÚN EL TECLADO TELEFÓNICO Hz

1209

1336

1477

697

1

2(ABC)

3(DEF)

770

4(GHI)

5(JKL)

6(MNO)

852

7(PQRS)

8(TUV)

9(WXYZ)

941

*

0

#

Para todos los filtros establecimos que el rizo de la banda pasante tendría 3 decibelios (Rp = 3) y para la atenuación de la stopband,es decir el numero de decibelios que de la stopband ha bajado de la banda de paso, la establecimos en 60 (Rs = 60) y finalmente escogimos filtros analógicos de tipo chebyshev I de orden 10. Estos parámetros se los estableció en base a pruebas que realizamos con diferentes valores con los diferentes tipos de filtros que disponemos y los que nos dieron mejores resultados fueron los anteriores mencionados. III.

LÓGICA PARA LA IDENTIFICACIÓN DE LAS SEÑALES

Al ingresar la señal de entrada logramos identificar que cada tono con una frecuencia de 4kHz poseía 2000 muestras con datos y las siguientes 1000 muestras no poseían nada hasta empezar el siguiente tono y esto se repetía con los demás. Con esa información decidimos localizar donde iniciará el primer tono para luego formar un vector con el número de la muestra donde inicia cada tono. aux=1;

Como se puede observar en la tabla para que nuestro mensaje codificado posea un 2 debería tener una señal sinusoidal de 1336 Hz mas otra sinusoidal de 697 Hz. Además de las frecuencias de las señales también sabemos que la letra A esta codificada como un 21, la B como 22, la C como 23 y así sucesivamente con todas las letras que posee el teclado telefónico pero en el caso que deseemos el numero en vez de la letra sabemos que se codifico como # mas el numero como por ejemplo si nuestro mensaje posee un 1 lo veríamos codificado como #1. Ya con la información de la codificación bien establecida se procedió a realizar el decodificador. II.

DISEÑO DE LOS FILTROS

Para la resolución se diseño 7 filtros analógicos donde los clasificamos: en 4 filtros para las frecuencias ubicadas en las filas de la TABLA I, y 3 filtros para las frecuencias ubicadas en las columnas de la TABLA I.

while(canal1(aux)==0) aux=aux+1; end x=aux:3000:length(canal1);

En el código anterior, localizamos en que muestra comienza el primer tono y creamos un vector con pasos de 3000 para eliminar los silencios de nuestra señal, logrando asi el total de tonos en la señal. Para analizar como se relacionan la señal de entrada con la numeración del teclado telefónico, teniendo en cuenta que cada numero posee dos señales sinusoidales de diferente frecuencia, decidimos analizar los números como matrices donde tendrán su frecuencia de fila y su frecuencia de columna, entonces primero se le hizo pasar por cada filtro columna a la señal de entrada y después a la misma señal por cada filtro fila, para luego observar la salida de cada uno en el tiempo donde concluimos que se debe analizar en cada muestra que determina el vector x con un intervalo de 2000 haciendo referencia que ahí existe un tono, y si la magnitud mayor en todo ese intervalo es mayor a 0.4 la señal de entrada se encuentra en ese filtro de lo contrario se elimino. for i=1:length(x)

2

if(max(salida1(x(i):x(i)+2000))>=0.4) f1(i)= 1; else f1(i)= 0; end

.

if(max(salida2(x(i):x(i)+2000))>=0.4) f2(i)= 1; else f2(i)= 0; end

if f2(i)==1 && f7(i)==1 codigo(num)= ’0’; end

if f1(i)==1 && f7(i)==1 codigo(num)= ’*’; end

if f3(i)==1 && f7(i)==1 codigo(num)= ’#’; end

. . .

num=num+1; end

if(max(salida5(x(i):x(i)+2000))>=0.4) f5(i)= 1; else f5(i)= 0; end if(max(salida6(x(i):x(i)+2000))>=0.4) f6(i)= 1; else f6(i)= 0; end if(max(salida7(x(i):x(i)+2000))>=0.4) f7(i)= 1; else f7(i)= 0; end end

El código de arriba se compara que si en todo el intervalo de 2000 muestras hay una que supere el 0.4 y se colocar un 1 para referenciar que justo en ese intervalo si hay un tono de la señal de entrada de lo contrario un 0 porque el filtro elimino el tono en ese intervalo Con esto tendremos 7 vectores correspondientes a nuestros 7 filtros con los cuales tendremos las posiciones de todos los tonos que pasaron por dichos filtros basados en la longitud del vector x que tiene el total de tonos. IV.

ASIGNACIÓN DE NUMERACIÓN DE LAS SEÑALES

Para poder identificar las señales que están relacionadas para poder asignarles su respectivo numero, debemos recordar que en el mismo tiempo van a estar las dos señales por lo tanto en nuestros vectores de posiciones si estan relacionadas deberian estar en las mismas posiciones. num=1; for i=1:length(x) if f1(i)==1 && f4(i)==1 codigo(num)= ’1’; end if f2(i)==1 && f4(i)==1 codigo(num)= ’2’; end if f3(i)==1 && f4(i)==1 codigo(num)= ’3’; end . . .

Como se puede observar analizamos todas las combinaciones posibles entre filas y columnas y en el caso de ser cierto le asignamos su respectiva codificación. V.

DECODIFICACIÓN MENSAJE

Como ya poseemos el mensaje codificado para su decodificación utilizamos Phyton para agregarle un diccionario y así determinar que nos dice nuestro mensaje. Nuestro diccionario: order = py.dict(pyargs(’00’,’+’,’21’, ’A’,’22’,’B’,’23’,’C’,’31’,’D’,’32’, ’E’,’33’,’F’,’41’,’G’,’42’,’H’,’43’, ’I’,’51’,’J’,’52’,’K’,’53’,’L’,’61’, ’M’,’62’,’N’,’63’,’O’,’71’,’P’,’72’, ’Q’,’73’,’R’,’74’,’S’,’81’,’T’,’82’, ’U’,’83’,’V’,’91’,’W’,’92’,’X’,’93’, ’Y’,’94’,’Z’,’1#’,’1’,’2#’,’2’,’3#’, ’3’,’4#’,’4’,’5#’,’5’,’6#’,’6’,’7#’, ’7’,’8#’,’8’,’9#’,’9’,’0#’,’0’,’10’,’ ’));

Una ves ya definido nuestro diccionario procedemos a tomar de dos en dos nuestro mensaje codificado para que analice nuestro diccionario y nos de finalmente el mensaje listo para leer. for i=1:2:length(codigo) c1=codigo(i); c2=codigo(i+1); d=order{strcat(c1,c2)}; clave=clave+d; end clave

VI.

FUNCIONAMIENTO