1. INTRODUCCIóN


En este trabajo pretendemos realizar una introducción a las técnicas de procesado digital en lo que se refiere a codificación y decodificación de señales DTMF. Así como la implementación de dichos codificadores y decodificadores usando diferentes tipos de filtros.

En primer lugar, expondremos una breve introducción sobre qué son las señales DTMF y cómo se codifican y se descodifican.

También pondremos un ejemplo del funcionamiento de un decodificador DTMF en concreto: el CI MT8870CE fabricado por MITEL.

Finalmente, comentaremos las técnicas usadas para la generación y detección de tonos utilizando el programa MATLAB v6.5 R13. Es decir, explicaremos detalladamente la implementación de filtros tanto “notch filter” como pasa banda de alta ganancia para detectar las frecuencias contenidas en los tonos telefónicos.

Dichas técnicas se verán más detalladamente para el caso de los filtros pasa banda.




2. CODIFICACIóN Y DECODIFICACIóN DTMF


Una señal DTMF válida es la suma de dos tonos, uno de un grupo bajo y el otro de un grupo alto, con cada grupo conteniendo cuatro tonos individuales. Las frecuencias de los tonos fueron cuidadosamente seleccionadas de tal forma que sus armónicos no se encuentran relacionados y que los productos de su intermodulación produzcan un deterioro mínimo en la señalización. Este esquema permite 16 combinaciones únicas. Diez de estos códigos representan los números del cero al nueve, los seis restantes (*, #, A, B, C, D) son reservados para señalización especial. La mayoría de los teclados en los teléfonos contienen diez interruptores de presión numéricos mas el asterisco (*) y el símbolo de numeral (#). Los interruptores se encuentran organizados en una matriz, cada uno selecciona el tono del grupo bajo de su fila respectiva y el tono del grupo alto de su columna correspondiente.

El esquema de codificación DTMF asegura que cada señal contienen uno y solo un componente de cada uno de los grupos de tonos alto y bajo. Esto simplifica de manera significativa la decodificación por que la señal compuesta DTMF puede ser separada con filtros pasa banda en sus dos componentes de frecuencia simples cada uno de los cuales puede ser manipulado de forma individual.

Las teclas de función A, B, C y D son extensiones de las teclas (0-9, *, #) y fueron diseñadas con los teléfonos militares norteamericanos Autovon. Los nombres originales de estas teclas fueron FO (Flash Override), F (Flash), I (Inmediate) y P (Priority) los cuales representaban niveles de prioridad y que podían establecer comunicación telefónica con varios grados de prioridad, eliminando otras conversaciones en la red si era necesario, con la función FO siendo la de mayor prioridad hasta P la de menor prioridad. Estos tonos son más comúnmente referidos como A, B, C y D respectivamente, todos ellos tienen en común 1633 Hz como su tono alto. En estos días, estas teclas de función son empleados principalmente en aplicaciones especiales tales como repetidores de radioaficionados para sus protocolos de comunicación, los módem y circuitos de tonos al tacto (touch tone) también tienen tendencia a incluir los pares de tonos A, B, C, y D. Estos no han sido usados para el servicio público en general, y podría tomar años antes de que pudieran ser incluidas en aplicaciones tales como líneas de información al cliente.


2.1. Codificación DTMF.

El esquema de marcado DTMF fue diseñado por los laboratorios BELL e introducido a los Estados Unidos a mediados de los años 60 como una alternativa para a la marcación por pulsos o rotatoria. Ofreciendo incremento en la velocidad de marcado, mejorando la fiabilidad y la conveniencia de señalización de punto a punto.

Muchas aplicaciones en las telecomunicaciones requieren de transmisión de señales DTMF para el envío de datos y marcado. El estándar DTMF fue diseñado originalmente por los Laboratorios Bell para su uso en los sistemas telefónicos de AT&T.

Existen varias especificaciones que han sido resultado de el estándar original las cuales parten de los estándares de AT&T, CEPT, NTT, CCITT y la ITU, etc. Las variaciones de un estándar a otro son típicamente tolerancias en las desviaciones de frecuencia, niveles de energía, diferencia de atenuación entre dos tonos e inmunidad al habla.

Tabla 2.1. Pares de frecuencias empleadas para la generación DTMF.

FRECUENCIA BAJA FRECUENCIA ALTA DÍGITO
697 1209 1
697 1336 2
697 1477 3
770 1209 4
770 1336 5
770 1477 6
852 1209 7
852 1336 8
852 1477 9
941 1209 *
941 1336 0
941 1477 #
697 1633 A
770 1633 B
852 1633 C
941 1633 D

Los estándares CCITT se encuentran localizados en las recomendaciones Q.23 y Q.24 en la sección 4.3 del libro rojo de la CCITT, volumen VI, fascículo VI.1.

En conclusión, DTMF es el sistema de señales usado en los teléfonos para el marcado por tonos, estos son el resultado de la suma algebraica en tiempo real de dos senoides de diferentes frecuencias, la relación de teclas con su correspondiente par de frecuencias se muestran en la tabla 2.1.

El sistema de señales DTMF son generadas por un codificador, y son la suma algebraica en tiempo real de dos tonos; uno de baja frecuencia y otro de alta, el tono alto normalmente es de + 1.5 % (2db) con respecto del tono bajo (como se muestra en la figura 2.1) para compensar perdidas de señal en las largas líneas de conexión con la central telefónica.

Espectro de las
señales DTMF

Fig. 2.1. Espectro de las señales DTMF.

2.2. Decodificación DTMF.

Las especificaciones ITU Q.24 para la detección DTMF son las siguientes [1]:

La división de frecuencias en los grupos alto y bajo simplifica el diseño de receptores DTMF como se muestra en la figura 3.2. Este diseño particular incluye una aproximación estándar. Cuando se encuentra conectado a una línea telefónica, receptor de radio o cualquier otra fuente de señal DTMF, el receptor filtra el ruido del tono, separa la señal en los componentes de grupos de alta y baja frecuencia para luego medir el cruce por cero promediando los periodos para producir la decodificación de un dígito.

Arquitectura
típica de un receptor DTMF

Fig. 2.2. Arquitectura típica de un receptor DTMF.

Como se muestra en la figura 3.3, la detección DTMF se puede ver complicada por la presencia de ruido de línea de 50/60 Hz, tonos de varias frecuencias, ruido aleatorio y otras fuentes de interferencia. Tratar con estos problemas mientras permanece inmune a la simulación de tonos por voz presenta el más grande reto para los diseñadores de receptores DTMF.

La interferencia de línea tolerable mostrada en la figura es la recomendada por CEPT y es considerada la meta de diseño por los fabricantes de receptores DTMF de calidad [2].

Entorno de la
señalización DTMF

Fig. 2.3. Entorno de la señalización DTMF.




3. DECODIFICADOR MT8870CE

Los ingenieros de Laboratorios Bell eligieron pares de frecuencias específicas para evitar armónicos y otros problemas que pudieran presentarse cuando estos tonos son enviados o recibidos, además de la dificultad que presentan para ser imitados por la voz humana y puedan accidentalmente activar el decodificador del otro lado de la línea.

Existen varia formas de detectar y decodificar estos tonos, una forma podría ser; con ocho filtros sintonizados en combinación con circuitos de detección. Resulta innecesario decir que esto no es práctico considerando la cantidad de circuitos integrados de diferentes fabricantes que hay que conseguir y el complejo ajuste que hay que realizar para sintonizarlos.

Tabla 2.2 Pares de frecuencias empleadas para la codificación DTMF.

Pares de
frecuencias empleadas para la
codificación DTMF

En este caso particular la decodificación se encuentra a cargo de un circuito integrado MT8870CE fabricado por MITEL, el cual reconoce los tonos dobles generados por el teclado de un teléfono en modalidad digital, estos tonos son decodificados y después convertidos a cantidades binarias de 4 bits que corresponden a un valor numérico determinado. Estos valores binarios funcionan como comandos o datos de acuerdo al orden con que son ingresados al sistema de control.

El MT8870CE fue seleccionado de entre una amplia variedad de circuitos integrados debido principalmente a sus características; eléctricas, disponibilidad e interfaz de comunicación paralela con salida de tercer estado que lo hacen óptimo para este proyecto ya que, debido a que los recursos del controlador principal son compartidos por todos los módulos que componen el sistema en donde la implementación de un canal de comunicación de datos virtual es clave en la manipulación de la información necesaria para atender los requerimientos específicos de cada uno de los componentes que integran el sistema.

Este decodificador de señales DTMF se encuentra provisto además de las características ya mencionadas, de una terminal que indica si una señal DTMF válida ha sido recibida, decodificada y su correspondiente código binario capturado en el registro de salida, esta terminal es llamada StD y permite llevar a cabo una interacción en tiempo real con el sistema de control empleándola para provocar una interrupción de manera tal que el controlador atiende este acción prioritaria ejecutando la rutina de atención a interrupción, misma que se limita a leer el código binario presente en el registro de salida del decodificador DTMF, para que posteriormente el programa principal le de el tratamiento de comando o dato según sea el caso y efectuar la acción correspondiente dentro del sistema de control remoto.

El circuito mostrado en la figura 3.4 ilustra el uso de un dispositivo MT8870 en un sistema de recepción típico. Las especificaciones de British Telecom definen las señales de entrada menores de -34 dBm como niveles no operativos. Esta condición puede ser evitada seleccionando valores adecuados de R1 y R2 para proporcionar una atenuación de 3 dB, de tal forma que la señal entrada de -34 dBm corresponderá a -37 dBm en la terminal de programación de ganancia (GS). En el diagrama se muestran los valores de los componentes de R3 y C2 para los requerimientos de tiempo de guarda cuando la tolerancia total de los componentes es del 6%.

Configuración de
entrada de ganancia
unitaria para las especificaciones BT o CEPT

Fig. 2.4. Configuración de entrada de ganancia unitaria para las especificaciones BT o CEPT.




4. GENERACIóN Y DETECCIóN DE TONOS TELEFóNICOS

Como sabemos, las señales DTMF están formadas por una componente de frecuencia baja (correspondiente a la frecuencia de la fila en que se haya el dígito marcado) y otra componente de frecuencia alta (correspondiente a la frecuencia de la columna).

Cada tono estará formado por la suma de dos cosenos cuyas frecuencias corresponderán a una frecuencia baja y a otra alta.

En nuestro trabajo únicamente generaremos tonos para los 10 dígitos y para los símbolos ‘*’ y ‘#’, para que sea más sencilla la detección de los mismos.

Estos tonos tendrán una duración de 40 ms añadiéndole al final una pausa de otros 40 ms, siendo la frecuencia de muestreo de 8192 Hz.

El método de detección que utilizaremos será el empleo de filtros pasa banda de alta ganancia, aunque también introduciremos la forma de realizar la detección mediante “notch filter”. Haremos pasar nuestra secuencia (el correspondiente tono) por una serie de filtros (uno para cada frecuencia) que se encargarán de amplificar cada uno de ellos una frecuencia, eliminando las demás. En total tendremos 7 salidas, de las cuales 2 serán las que superarán un mínimo de energía que estableceremos (las que dos salidas que han amplificado una de sus frecuencias).

4.1. Generación de tonos DTMF.

Para generar dichos tonos, primeramente deberemos generar todas las componentes para cada frecuencia y almacenarlas individualmente. Para ello, tendremos que hallar las muestras existentes en 40 ms para la frecuencia de muestreo que utilizamos.

Fs = 8192;
tiempo = 0.040; % 40 ms
n = 0:round(Fs*tiempo)-1;

Una vez obtenidas dichas muestras, simplemente hemos de generar vectores que almacenen estas muestras para cada una de las frecuencias y, posteriormente, crear un vector distinto para cada una de las combinaciones de frecuencias fila y columna (en total existen 12 combinaciones posibles).

A = 0.5; %Amplitud del tono

%Generamos las muestras que contendrán frecuencias bajas
f1 = A*cos(2*pi*697/Fs.*n);
f2 = A*cos(2*pi*770/Fs.*n);
f3 = A*cos(2*pi*852/Fs.*n);
f4 = A*cos(2*pi*941/Fs.*n);

%Generamos las muestras que contendrán frecuencias altas
c1 = A*cos(2*pi*1209/Fs.*n);
c2 = A*cos(2*pi*1336/Fs.*n);
c3 = A*cos(2*pi*1477/Fs.*n);

Cuando ya tengamos los vectores con las muestras de cada dígito deberemos añadirles el mismo número de muestras con un silencio (será nuestra pausa de 40 ms). Esto se consigue con la instrucción zeros(filas, columnas), que genera una matriz nula (0).

z = zeros(1,round(Fs*tiempo));

s1 = [f1 + c1 z];
s2 = [f1 + c2 z];
s3 = [f1 + c3 z];
s4 = [f2 + c1 z];
s5 = [f2 + c2 z];
s6 = [f2 + c3 z];
s7 = [f3 + c1 z];
s8 = [f3 + c2 z];
s9 = [f3 + c3 z];
s0 = [f4 + c2 z];
sast = [f4 + c1 z];
salm = [f4 + c3 z];

También hemos generado muestras para el símbolo ‘E’, que será un símbolo no válido al cual asignaremos dos frecuencias de forma aleatoria, siendo ambas frecuencias bajas o altas para no producir un símbolo válido.

error = [f1 + f3 z];

Finalmente, guardaremos estos vectores en una columna distinta de una matriz. De esta forma, cuando el usuario introduzca, por ejemplo, el dígito ‘5’ seleccionaremos todos los elementos de la columna 6 (ya que empezamos con el 0 y los índices en MATLAB comienzan con el 1). Para los símbolos especiales ‘*’, ‘#’ y ‘E’ emplearemos las columnas 11, 12 y 13 respectivamente.

vector = [s0' s1' s2' s3' s4' s5' s6' s7' s8' s9' sast' salm' error'];

tono = [ ];
for i = 1:length(digito)
if((digito(i) >= '0') & (digito(i) <= '9'))
tono = [tono vector(:,str2num(digito(i)) + 1)'];
elseif(digito(i) == '*')
tono = [tono vector(:,11)'];
elseif(digito(i) == '#')
tono = [tono vector(:,12)'];
elseif(digito(i) == 'E')
tono = [tono vector(:,13)'];
end
end

Observamos que la variable digito es un vector. Esto así debido a que de esta forma podremos generar cualquier secuencia introducida por teclado usando el bucle for anterior.

Todo esto lo podemos encontrar en el fichero genera.m.

4.2. Detección de tonos DTMF.

En primer lugar, trataremos la detección de tonos simulados, es decir, trataremos de detectar las secuencias generadas mediante el archivo genera.m.

A continuación, detectaremos señales reales: grabaremos los tonos generados por un teléfono móvil en un archivo de extensión *.wav utilizando una frecuencia de 8 kHz. Extraeremos las muestras del fichero mediante la instrucción wavread(‘nombre.wav’).

4.2.1. Tipos de filtros empleados.

Como hemos mencionado anteriormente pasaremos nuestra secuencia por una combinación de filtros, tanto para eliminar frecuencias como para amplificarlas.

Para la detección DTMF se puede utilizar dos tipos de filtros:

En los siguientes apartados explicamos cada uno de los métodos utilizados.

4.2.1.1. “Notch filter”.

Se trata de eliminar una frecuencia sin modificar las demás, es decir, si la frecuencia que queremos eliminar es F, la respuesta en frecuencia en módulo del filtro debe ser la siguiente:

Respuesta en
frecuencia del 'notch filter'

siendo

Frecuencia

Utilizando una demo de MATLAB llegamos a la conclusión de que este tipo de filtros tiene la siguiente forma:

Respuesta en
módulo y en fase del 'notch
filter'

Respuesta en
frecuencia

siendo r el módulo del polo, el cual no debe ser superior ni igual a 1 pero sí debe ser muy cercano a él. Nosotros elegimos un módulo para el polo de r = 0.99.

Los coeficientes b y a son los valores de los vectores B y A respectivamente que utilizaremos en las instrucciones filter(B, A, señal). Esta instrucción, con los valores anteriores, elimina la componente de frecuencia F de la señal.

4.2.1.2. Filtros pasa banda de alta ganancia.

Se trata de amplificar una frecuencia eliminando las demás, es decir, si la frecuencia que queremos amplificar es F, la respuesta en frecuencia en módulo del filtro debe ser la siguiente:

Respuesta en
frecuencia del filtro pasa
banda

siendo

Frecuencia

Utilizando de nuevo la demo de MATLAB llegamos a la conclusión de que este tipo de filtros tiene la siguiente forma:

Respuesta en módulo y en fase del filtro
pasa banda

Respuesta en
frecuencia

siendo r el módulo del polo, el cual no debe ser superior ni igual a 1 pero sí debe ser muy cercano a él. Nosotros elegimos un módulo para el polo de r = 0.99.

Los coeficientes b y a son los valores de los vectores B y A respectivamente que utilizaremos en las instrucciones filter(B, A, señal). Esta instrucción, con los valores anteriores, amplifica las componentes de frecuencia F de la señal y elimina el resto.

4.2.2. Detección de tonos simulados.

Supongamos ahora que nuestra secuencia generada contiene únicamente un dígito. Si empleamos los “notch filter" haremos pasar la secuencia de entrada por cuatro filtros. Cada uno de ellos eliminará una frecuencia: una frecuencia baja. Posteriormente, estas cuatro salidas se harán pasar por tres filtros más, que eliminarán otra frecuencia: una frecuencia alta. En total, tendremos 12 salidas: hemos de calcular la energía de cada una de las salidas.

Poniendo un ejemplo, si la secuencia de entrada perteneciese al dígito ‘5’, las frecuencias que contendría dicha señal serían Fb = 770 Hz y Fa = 1336 Hz. Por tanto, de las 12 salidas tendremos secuencias que habrán eliminado 2 frecuencias (solamente una salida), otras habrán eliminado 1 frecuencia e incluso tendremos secuencias que no habrán filtrado ninguna frecuencia. Por consiguiente, la salida con menor energía será la que haya eliminado las frecuencias de 770 Hz y de 1336 Hz.

Si tenemos los 12 valores de energía ordenados en un vector de forma que el primer valor corresponda a la energía de la salida al haber eliminado las frecuencias correspondientes al digito ‘1’, el segundo valor de energía corresponda con la energía de la salida que haya eliminado las frecuencias del ‘2’ y así sucesivamente, podemos saber fácilmente el dígito introducido.

El procedimiento utilizando filtros pasa banda es el mismo salvo que la salida correcta será aquella que posea mayor energía.

El problema se da cuando la señal de entrada no se corresponde con un dígito sino con una secuencia de dígitos (como en el caso real, al marcar un número de teléfono). En este caso, hemos de descomponer nuestra señal de entrada en segmentos de 20 ms y trabajar con ellos de forma que, si detectamos el mismo dígito dos o más veces consecutivas se trata del mismo número, o lo que es lo mismo, si detectamos un símbolo, no es necesario detectar el siguiente, puesto que se tratará del mismo símbolo; y esto debe ser así hasta que no se detecte un silencio entre dos dígitos.

Otro problema que encontramos es, ¿cómo detectamos la pausa entre dígitos? En un silencio las muestras valen 0, por tanto, la energía es igual a 0. Otra forma de solucionar el problema es estableciendo un mínimo de energía que deberá ser superado cuando se trate de un símbolo (está será la solución adoptada, pues cuando utilicemos los *.wav tendremos ruido incluido en la señal y la energía de los silencios no será 0 realmente).

A continuación, vamos a explicar detenidamente el contenido del fichero detecta.m que, realmente, no emplea exactamente la salida de los filtros como acabamos de indicar:

En primer lugar, deberemos almacenar las frecuencias bajas y altas en un vector, de forma que podamos acceder a ellas fácilmente. Además, deberemos inicializar algunos valores como son la frecuencia de muestreo Fm, el valor del módulo de los polos del sistema r, y los coeficientes de los vectores B y A para los filtros (únicamente aquellos que no dependan de la frecuencia).

Fs = 8192;
frecuencias = [697,770,852,941, 1209,1336,1477] * 2*pi/Fs;

w1= [1,1,1,2,2,2,3,3,3,4,4,4];
w2= [5,6,7,5,6,7,5,6,7,5,6,7];

r = 0.99;
B = [1 0 -1];
A = [1 0 r^2];

secuencia = [];
siguiente = true;

La variable siguiente tomará un valor booleano que nos indicará, si toma el valor true, que podemos analizar el siguiente símbolo. Si toma el valor false, el siguiente símbolo no será analizado. Esto nos servirá para evitar la detección del mismo símbolo dos veces consecutivas (recordemos que cada tono tiene una duración de 40 ms de sonido y trabajamos con segmentos de 20 ms), y también para evitar la detección de un silencio a continuación de otro (el silencio tiene una duración de 40 ms).

En segundo lugar, comenzaremos la ejecución de un bucle que se repetirá tantas veces como divisiones de 20 ms podamos realizar a la señal de entrada (nuestra secuencia de símbolos).

for i = 0:1:(length(tono)/Fs*1000/20-1)

En él, lo primero que debemos hacer es escoger el número de muestras correspondientes a una división de 20 ms de la secuencia de entrada. Esta división es el contenido del vector parte.

parte = tono(i*163+1:(i+1)*163);

Cuando el contenido de este vector se corresponda con algún símbolo telefónico, entonces normalizaremos los elementos de dicho vector a un valor no superior a 0.5. Esto será útil, sobre todo, cuando tratemos con archivos *.wav, donde la amplitud de cada tono almacenado puede ser distinta y, por tanto, la energía de cada símbolo será distinta. Si esto ocurre así, no podremos comparar dicha energía con un valor específico para saber si el símbolo que estamos tratando es un valor válido, es un silencio o es un símbolo incorrecto.

if (max(parte) ~= 0 )
G = 0.5/max(parte);
parte = G * parte;
end

Empezando ahora con el proceso de filtrado de la parte (filtro pasa banda), obtendremos una señal que ha amplificado únicamente una frecuencia, ya sea baja o alta, y ha eliminado las demás. En total, obtendremos 7 salidas (7 frecuencias) y hallaremos su energía.
Si la parte que estamos tratando es un símbolo correcto, dos de las siete salidas superarán cierto nivel de energía.
Si esta parte es un silencio, la energía de las 7 salidas se aproximará a 0.
Si la parte pertenece al símbolo incorrecto, también habrá dos salidas que superarán dicho nivel de energía.
Probando valores, hemos podido hallar un valor mínimo que deberá ser superado por aquellas salidas en las que se ha amplificado la frecuencia determinada por el filtro. Este valor es 2500. La salida que tenga una energía superior a esta quiere decir que contenía la frecuencia que hemos amplificado. De este modo, podemos saber el número de frecuencias que contiene la parte analizada mediante el contenido de la variable valores. Si esta variable llegará a tomar el valor 3 o superior, diremos que la señal de entrada es voz y seguiremos con la detección de la siguiente parte.

energia = zeros(1,7);
energia2 = zeros(1,12);
valores = 0;

for i =1:7
A(2) = -2*r*cos(frecuencias(i));
tmp = filter(B, A, parte);
tmp = tmp.^2;

for k = 1:length(tmp)
energia(i) = energia(i) + tmp(k);
end

if ( energia(i) > 2500)
valores = valores + 1;
end
clear tmp;
end

En el siguiente bucle for anidado tenemos una variable llamada energia2 que se corresponde exactamente con los posibles valores de las energías de cada uno de los símbolos. Es decir, como no sabemos qué símbolo contiene nuestra parte calculamos la energía suponiendo que se puede corresponder con cualquiera de los 12 dígitos, combinando las energías obtenidas de forma individual y de dos en dos (una correspondiente a la energía de la salida al amplificar la frecuencia baja y la otra al amplificar la frecuencia alta). De forma que de los 12 valores del vector energia2, el mayor de todos nos indicará cuál es nuestro símbolo. éste se podrá hallar por la posición que ocupa este valor máximo en el vector.

En el caso de que hayamos introducido el símbolo ‘E’ sí que superaremos el mínimo de energía (5000), sin embargo, hemos dicho que el vector energía2 contenía valores de energía para símbolos correctos, es decir, para combinaciones de frecuencias válidas. Por tanto, al llegar a la sentencia siguiente:

for i = 1:12
energia2(i) = energia(w1(i)) + energia(w2(i));
end

en ningún momento estamos sumando las energías de las salidas de los filtros cuyas frecuencias utilizadas eran las frecuencias que contiene el símbolo ‘E’, ya que es una combinación incorrecta de frecuencias. Por consiguiente, el valor máximo de energia2 se asemejará al máximo valor del vector energia.

Si esto ocurre, el símbolo detectado es ‘X’ y se continúa con la detección. Lo podemos ver en la siguiente instrucción:

if ((max(energia2) > max(energia) - max(energia)*0.15) &&
(max(energia2) < max(energia) + max(energia)*0.15))
siguiente = false;
secuencia = [ secuencia 'X' ]; %Dígito incorrecto

Si por el contrario esta condición no se cumple, únicamente nos queda concatenar el valor de la variable digito (contiene la posición del elemento cuyo valor es el máximo del vector energia2) al vector que contendrá nuestra secuencia detectada:

else
siguiente = false;

if ((digito >= 1) & (digito <= 9))
digito = num2str(digito);
elseif (digito == 10)
digito = '*';
elseif (digito == 11)
digito = '0';
elseif (digito == 12)
digito = '#';
end

secuencia = [ secuencia digito ];
end

En el supuesto de que se esté detectando un silencio, el máximo del vector energia2 no superará el mínimo establecido de 5000. Si la entrada fuera voz, podría superar este valor pero tendría más de dos frecuencias. Estas serán las condiciones para identificar estos dos valores:

if ((maximo < 5000) && (valores > 3))
siguiente = true;

4.2.3. Detección de tonos reales.

La detección de tonos reales se basa en el mismo procedimiento descrito anteriormente. En el fichero genera_real.m podemos ver cómo generamos las secuencias de tonos reales a partir de una secuencia numérica introducida por teclado.

Simplemente se trata de comprobar el dígito introducido y leer, mediante la instrucción wavread(‘fichero.wav’), el archivo de sonido correspondiente a dicho símbolo para concatenar el resultado a nuestro vector tonos que contiene todas las muestras de la secuencia de entrada introducida por teclado.

Este vector tonos será el que pasaremos a la función detecta al igual que hicimos en para detectar una secuencia simulada.

[simbolo0, Fs, NBITS] = WAVREAD ('cero.wav');
[simbolo1, Fs, NBITS] = WAVREAD ('uno.wav');
[simbolo2, Fs, NBITS] = WAVREAD ('dos.wav');
[simbolo3, Fs, NBITS] = WAVREAD ('tres.wav');
[simbolo4, Fs, NBITS] = WAVREAD ('cuatro.wav');
[simbolo5, Fs, NBITS] = WAVREAD ('cinco.wav');
[simbolo6, Fs, NBITS] = WAVREAD ('seis.wav');
[simbolo7, Fs, NBITS] = WAVREAD ('siete.wav');
[simbolo8, Fs, NBITS] = WAVREAD ('ocho.wav');
[simbolo9, Fs, NBITS] = WAVREAD ('nueve.wav');
[simboloR, Fs, NBITS] = WAVREAD ('r.wav');
[simboloT, Fs, NBITS] = WAVREAD ('t.wav');

tonos = [ ];

for i = 1:length(secuencia)
if(secuencia(i) == '0')
tonos = [tonos simbolo0'];
elseif(secuencia(i) == '1')
tonos = [tonos simbolo1'];
elseif(secuencia(i) == '2')
tonos = [tonos simbolo2'];
elseif(secuencia(i) == '3')
tonos = [tonos simbolo3'];
elseif(secuencia(i) == '4')
tonos = [tonos simbolo4'];
elseif(secuencia(i) == '5')
tonos = [tonos simbolo5'];
elseif(secuencia(i) == '6')
tonos = [tonos simbolo6'];
elseif(secuencia(i) == '7')
tonos = [tonos simbolo7'];
elseif(secuencia(i) == '8')
tonos = [tonos simbolo8'];
elseif(secuencia(i) == '9')
tonos = [tonos simbolo9'];
elseif(secuencia(i) == '*')
tonos = [tonos simboloR'];
elseif(secuencia(i) == '#')
tonos = [tonos simboloT'];
end
end

Hemos de destacar que los archivos de audio generados han sido ligeramente modificados. Se ha amplificado la componente de frecuencia baja. Esto evita que el símbolo detectado sea ‘X’ (ya que la mayor contribución en la energía la produce la componente de frecuencia alta) cuando en realidad se trata de un símbolo válido.


5. COMANDOS DE MATLAB

A continuación, describiremos el funcionamiento de algunos de los comandos utilizados para realizar los scripts y las funciones genera, genera_real y detecta.


6. BIBLIOGRAFíA

1.- CONTROL REMOTO UNIVERSAL A DISTANCIA DTMF POR LíNEA TELEFÓNICA
http://www.plazacolima.com/tecnoplaza/rformas/Articulo01/pagina1.htm

2.- INTRODUCCIÓN AL PROCESADO DIGITAL DE SEÑALES
Marcelino Martínez, José V. Francés, Javier Calpe -- Universidad de Valencia – ITT SE
Curso 2003 - 2004

7. ARCHIVOS

1.- Ficheros de código Matlab

2.- Sonidos DTMF de los 12 dígitos