Está en la página 1de 21

1.

INTRODUCCIN

En este trabajo pretendemos realizar una introduccin a las tcnicas de


procesado digital en lo que se refiere a codificacin y decodificacin de seales DTMF.
As como la implementacin de dichos codificadores y decodificadores usando
diferentes tipos de filtros.

En primer lugar, expondremos una breve introduccin sobre qu son las seales
DTMF y cmo se codifican y se descodifican.

Tambin pondremos un ejemplo del funcionamiento de un decodificador


DTMF en concreto: el CI MT8870CE fabricado por MITEL.

Finalmente, comentaremos las tcnicas usadas para la generacin y deteccin


de tonos utilizando el programa MATLAB v6.5 R13. Es decir, explicaremos
detalladamente la implementacin de filtros tanto notch filter como pasa banda de
alta ganancia para detectar las frecuencias contenidas en los tonos telefnicos.

Dichas tcnicas se vern ms detalladamente para el caso de los filtros pasa


banda.

2. CODIFICACIN Y DECODIFICACIN
DTMF

Una seal DTMF vlida 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 armnicos no
se encuentran relacionados y que los productos de su intermodulacin produzcan un
deterioro mnimo en la sealizacin. Este esquema permite 16 combinaciones nicas.
Diez de estos cdigos representan los nmeros del cero al nueve, los seis restantes (*,
#, A, B, C, D) son reservados para sealizacin especial. La mayora de los teclados en
los telfonos contienen diez interruptores de presin numricos mas el asterisco (*) y
el smbolo 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 codificacin DTMF asegura que cada seal contienen uno y solo
un componente de cada uno de los grupos de tonos alto y bajo. Esto simplifica de
manera significativa la decodificacin por que la seal 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 funcin A, B, C y D son extensiones de las teclas (0-9, *, #) y


fueron diseadas con los telfonos 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 podan establecer
comunicacin telefnica con varios grados de prioridad, eliminando otras
conversaciones en la red si era necesario, con la funcin FO siendo la de mayor
prioridad hasta P la de menor prioridad. Estos tonos son ms comnmente referidos
como A, B, C y D respectivamente, todos ellos tienen en comn 1633 Hz como su tono
alto. En estos das, estas teclas de funcin son empleados principalmente en
aplicaciones especiales tales como repetidores de radioaficionados para sus protocolos
de comunicacin, los mdem y circuitos de tonos al tacto (touch tone) tambin tienen
tendencia a incluir los pares de tonos A, B, C, y D. Estos no han sido usados para el
servicio pblico en general, y podra tomar aos antes de que pudieran ser incluidas en
aplicaciones tales como lneas de informacin al cliente.

2.1. Codificacin DTMF.


El esquema de marcado DTMF fue diseado por los laboratorios BELL e
introducido a los Estados Unidos a mediados de los aos 60 como una alternativa para
a la marcacin por pulsos o rotatoria. Ofreciendo incremento en la velocidad de
marcado, mejorando la fiabilidad y la conveniencia de sealizacin de punto a punto.

Muchas aplicaciones en las telecomunicaciones requieren de transmisin de


seales DTMF para el envo de datos y marcado. El estndar DTMF fue diseado
originalmente por los Laboratorios Bell para su uso en los sistemas telefnicos de
AT&T.
Existen varias especificaciones que han sido resultado de el estndar original
las cuales parten de los estndares de AT&T, CEPT, NTT, CCITT y la ITU, etc. Las
variaciones de un estndar a otro son tpicamente tolerancias en las desviaciones de
frecuencia, niveles de energa, diferencia de atenuacin entre dos tonos e inmunidad al
habla.

Tabla 2.1. Pares de frecuencias empleadas para la generacin DTMF.

FRECUENCIA BAJA FRECUENCIA ALTA DGITO


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 estndares CCITT se encuentran localizados en las recomendaciones Q.23


y Q.24 en la seccin 4.3 del libro rojo de la CCITT, volumen VI, fascculo VI.1.

En conclusin, DTMF es el sistema de seales usado en los telfonos para el


marcado por tonos, estos son el resultado de la suma algebraica en tiempo real de dos
senoides de diferentes frecuencias, la relacin de teclas con su correspondiente par de
frecuencias se muestran en la tabla 2.1.

El sistema de seales 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 seal en las largas lneas de conexin con la
central telefnica.

Fig. 2.1. Espectro de las seales DTMF.

2.2. Decodificacin DTMF.


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

Tolerancia a la frecuencia: Un smbolo vlido DTMF debe tener una


desviacin en frecuencia dentro del 1.5% de tolerancia. Los smbolos con una
desviacin en frecuencia mayor al 3.5% debern ser rechazados.
Duracin de la seal: Un smbolo DTMF con una duracin de 40ms debe ser
considerado vlido. La duracin de la seal no debe ser menor de 23ms.
Atenuacin de la seal: El detector debe trabajar con una relacin seal-ruido
(SNR) de 15db y en el peor caso con una atenuacin de 26dB.
Interrupcin de la seal: Una seal DTMF vlida interrumpida por 10ms o
menos no debe ser detectada como dos smbolos distintos.
Pausa en la seal: Una seal DTMF vlida separada por una pausa de tiempo
de al menos 40ms debe ser detectada como dos smbolos distintos.
Fase: El detector debe operar con un mximo de 8dB en fase normal y 4dB en
fase invertida.
Rechazo al habla: El detector debe operar en la presencia del habla rechazando
la voz como un smbolo DTMF vlido.

La divisin de frecuencias en los grupos alto y bajo simplifica el diseo de


receptores DTMF como se muestra en la figura 3.2. Este diseo particular incluye una
aproximacin estndar. Cuando se encuentra conectado a una lnea telefnica, receptor
de radio o cualquier otra fuente de seal DTMF, el receptor filtra el ruido del tono,
separa la seal en los componentes de grupos de alta y baja frecuencia para luego medir
el cruce por cero promediando los periodos para producir la decodificacin de un dgito.
Fig. 2.2. Arquitectura tpica de un receptor DTMF.

Como se muestra en la figura 3.3, la deteccin DTMF se puede ver complicada


por la presencia de ruido de lnea de 50/60 Hz, tonos de varias frecuencias, ruido
aleatorio y otras fuentes de interferencia. Tratar con estos problemas mientras
permanece inmune a la simulacin de tonos por voz presenta el ms grande reto para
los diseadores de receptores DTMF.

La interferencia de lnea tolerable mostrada en la figura es la recomendada por


CEPT y es considerada la meta de diseo por los fabricantes de receptores DTMF de
calidad [2].
Fig. 2.3. Entorno de la sealizacin DTMF.

3. DECODIFICADOR MT8870CE
Los ingenieros de Laboratorios Bell eligieron pares de frecuencias especficas
para evitar armnicos y otros problemas que pudieran presentarse cuando estos tonos
son enviados o recibidos, adems de la dificultad que presentan para ser imitados por
la voz humana y puedan accidentalmente activar el decodificador del otro lado de la
lnea.

Existen varia formas de detectar y decodificar estos tonos, una forma podra
ser; con ocho filtros sintonizados en combinacin con circuitos de deteccin. Resulta
innecesario decir que esto no es prctico 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 codificacin DTMF.

En este caso particular la decodificacin se encuentra a cargo de un circuito


integrado MT8870CE fabricado por MITEL, el cual reconoce los tonos dobles
generados por el teclado de un telfono en modalidad digital, estos tonos son
decodificados y despus convertidos a cantidades binarias de 4 bits que corresponden a
un valor numrico 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 caractersticas; elctricas, disponibilidad e
interfaz de comunicacin 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 mdulos que componen el sistema en donde la
implementacin de un canal de comunicacin de datos virtual es clave en la
manipulacin de la informacin necesaria para atender los requerimientos especficos
de cada uno de los componentes que integran el sistema.

Este decodificador de seales DTMF se encuentra provisto adems de las


caractersticas ya mencionadas, de una terminal que indica si una seal DTMF vlida
ha sido recibida, decodificada y su correspondiente cdigo binario capturado en el
registro de salida, esta terminal es llamada StD y permite llevar a cabo una interaccin
en tiempo real con el sistema de control emplendola para provocar una interrupcin de
manera tal que el controlador atiende este accin prioritaria ejecutando la rutina de
atencin a interrupcin, misma que se limita a leer el cdigo binario presente en el
registro de salida del decodificador DTMF, para que posteriormente el programa
principal le de el tratamiento de comando o dato segn sea el caso y efectuar la accin
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 recepcin tpico. Las especificaciones de British Telecom definen las
seales de entrada menores de -34 dBm como niveles no operativos. Esta condicin
puede ser evitada seleccionando valores adecuados de R1 y R2 para proporcionar una
atenuacin de 3 dB, de tal forma que la seal entrada de -34 dBm corresponder a -37
dBm en la terminal de programacin 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%.

Fig. 2.4. Configuracin de entrada de ganancia unitaria para las


especificaciones BT o CEPT.

4. GENERACIN Y DETECCIN DE TONOS


TELEFNICOS
Como sabemos, las seales DTMF estn formadas por una componente de
frecuencia baja (correspondiente a la frecuencia de la fila en que se haya el dgito
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
correspondern a una frecuencia baja y a otra alta.

En nuestro trabajo nicamente generaremos tonos para los 10 dgitos y para los
smbolos * y #, para que sea ms sencilla la deteccin de los mismos.

Estos tonos tendrn una duracin de 40 ms aadindole al final una pausa de


otros 40 ms, siendo la frecuencia de muestreo de 8192 Hz.

El mtodo de deteccin que utilizaremos ser el empleo de filtros pasa banda


de alta ganancia, aunque tambin introduciremos la forma de realizar la deteccin
mediante notch filter. Haremos pasar nuestra secuencia (el correspondiente tono) por
una serie de filtros (uno para cada frecuencia) que se encargarn de amplificar cada uno
de ellos una frecuencia, eliminando las dems. En total tendremos 7 salidas, de las
cuales 2 sern las que superarn un mnimo de energa que estableceremos (las que dos
salidas que han amplificado una de sus frecuencias).

4.1. Generacin 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 contendrn 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 contendrn 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 dgito deberemos
aadirles el mismo nmero de muestras con un silencio (ser nuestra pausa de 40 ms).
Esto se consigue con la instruccinzeros(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];

Tambin hemos generado muestras para el smbolo E, que ser un smbolo no


vlido al cual asignaremos dos frecuencias de forma aleatoria, siendo ambas frecuencias
bajas o altas para no producir un smbolo vlido.
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 dgito 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 smbolos 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. Deteccin de tonos DTMF.


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

A continuacin, detectaremos seales reales: grabaremos los tonos generados


por un telfono mvil en un archivo de extensin *.wav utilizando una frecuencia de 8
kHz. Extraeremos las muestras del fichero mediante la
instruccin wavread(nombre.wav).

4.2.1. Tipos de filtros empleados.


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

Para la deteccin DTMF se puede utilizar dos tipos de filtros:

Notch filter
Filtros pasa banda de alta ganancia

En los siguientes apartados explicamos cada uno de los mtodos utilizados.

4.2.1.1. Notch filter.

Se trata de eliminar una frecuencia sin modificar las dems, es decir, si la


frecuencia que queremos eliminar es F, la respuesta en frecuencia en mdulo del filtro
debe ser la siguiente:
siendo

Utilizando una demo de MATLAB llegamos a la conclusin de que este tipo de


filtros tiene la siguiente forma:

siendo r el mdulo del polo, el cual no debe ser superior ni igual a 1 pero s debe ser
muy cercano a l. Nosotros elegimos un mdulo 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, seal). Esta instruccin, con los
valores anteriores, elimina la componente de frecuencia F de la seal.

4.2.1.2. Filtros pasa banda de alta ganancia.


Se trata de amplificar una frecuencia eliminando las dems, es decir, si la
frecuencia que queremos amplificar es F, la respuesta en frecuencia en mdulo del filtro
debe ser la siguiente:

siendo

Utilizando de nuevo la demo de MATLAB llegamos a la conclusin de que este


tipo de filtros tiene la siguiente forma:

siendo r el mdulo del polo, el cual no debe ser superior ni igual a 1 pero s debe ser
muy cercano a l. Nosotros elegimos un mdulo 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, seal). Esta instruccin, con los
valores anteriores, amplifica las componentes de frecuencia F de la seal y elimina el
resto.

4.2.2. Deteccin de tonos simulados.


Supongamos ahora que nuestra secuencia generada contiene nicamente un
dgito. 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 harn pasar por tres filtros ms, que eliminarn otra frecuencia:
una frecuencia alta. En total, tendremos 12 salidas: hemos de calcular la energa de cada
una de las salidas.
Poniendo un ejemplo, si la secuencia de entrada perteneciese al dgito 5, las
frecuencias que contendra dicha seal seran Fb = 770 Hz y Fa = 1336 Hz. Por tanto,
de las 12 salidas tendremos secuencias que habrn eliminado 2 frecuencias (solamente
una salida), otras habrn eliminado 1 frecuencia e incluso tendremos secuencias que no
habrn filtrado ninguna frecuencia. Por consiguiente, la salida con menor energa ser
la que haya eliminado las frecuencias de 770 Hz y de 1336 Hz.

Si tenemos los 12 valores de energa ordenados en un vector de forma que el


primer valor corresponda a la energa de la salida al haber eliminado las frecuencias
correspondientes al digito 1, el segundo valor de energa corresponda con la energa
de la salida que haya eliminado las frecuencias del 2 y as sucesivamente, podemos
saber fcilmente el dgito introducido.

El procedimiento utilizando filtros pasa banda es el mismo salvo que la salida


correcta ser aquella que posea mayor energa.

El problema se da cuando la seal de entrada no se corresponde con un dgito


sino con una secuencia de dgitos (como en el caso real, al marcar un nmero de
telfono). En este caso, hemos de descomponer nuestra seal de entrada en segmentos
de 20 ms y trabajar con ellos de forma que, si detectamos el mismo dgito dos o ms
veces consecutivas se trata del mismo nmero, o lo que es lo mismo, si detectamos un
smbolo, no es necesario detectar el siguiente, puesto que se tratar del mismo smbolo;
y esto debe ser as hasta que no se detecte un silencio entre dos dgitos.

Otro problema que encontramos es, cmo detectamos la pausa entre dgitos?
En un silencio las muestras valen 0, por tanto, la energa es igual a 0. Otra forma de
solucionar el problema es estableciendo un mnimo de energa que deber ser superado
cuando se trate de un smbolo (est ser la solucin adoptada, pues cuando utilicemos
los *.wav tendremos ruido incluido en la seal y la energa de los silencios no ser 0
realmente).

A continuacin, 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 fcilmente. Adems, deberemos inicializar
algunos valores como son la frecuencia de muestreo Fm, el valor del mdulo 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 smbolo. Si toma el valor false, el siguiente
smbolo no ser analizado. Esto nos servir para evitar la deteccin del mismo smbolo
dos veces consecutivas (recordemos que cada tono tiene una duracin de 40 ms de
sonido y trabajamos con segmentos de 20 ms), y tambin para evitar la deteccin de un
silencio a continuacin de otro (el silencio tiene una duracin de 40 ms).

En segundo lugar, comenzaremos la ejecucin de un bucle que se repetir tantas


veces como divisiones de 20 ms podamos realizar a la seal de entrada (nuestra
secuencia de smbolos).
for i = 0:1:(length(tono)/Fs*1000/20-1)

En l, lo primero que debemos hacer es escoger el nmero de muestras


correspondientes a una divisin de 20 ms de la secuencia de entrada. Esta divisin es el
contenido del vector parte.
parte = tono(i*163+1:(i+1)*163);

Cuando el contenido de este vector se corresponda con algn smbolo


telefnico, 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 energa de cada
smbolo ser distinta. Si esto ocurre as, no podremos comparar dicha energa con un
valor especfico para saber si el smbolo que estamos tratando es un valor vlido, es un
silencio o es un smbolo 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 seal que ha amplificado nicamente una frecuencia, ya sea baja o
alta, y ha eliminado las dems. En total, obtendremos 7 salidas (7 frecuencias) y
hallaremos su energa.
Si la parte que estamos tratando es un smbolo correcto, dos de las siete salidas
superarn cierto nivel de energa.
Si esta parte es un silencio, la energa de las 7 salidas se aproximar a 0.
Si la parte pertenece al smbolo incorrecto, tambin habr dos salidas que superarn
dicho nivel de energa.
Probando valores, hemos podido hallar un valor mnimo 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 energa superior a esta quiere decir que
contena la frecuencia que hemos amplificado. De este modo, podemos saber el nmero
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 seal de
entrada es voz y seguiremos con la deteccin 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 energas de cada uno de los
smbolos. Es decir, como no sabemos qu smbolo contiene nuestra parte calculamos la
energa suponiendo que se puede corresponder con cualquiera de los 12 dgitos,
combinando las energas obtenidas de forma individual y de dos en dos (una
correspondiente a la energa 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 cul es nuestro smbolo. ste se podr hallar por la posicin
que ocupa este valor mximo en el vector.

En el caso de que hayamos introducido el smbolo E s que superaremos el


mnimo de energa (5000), sin embargo, hemos dicho que el vector energa2 contena
valores de energa para smbolos correctos, es decir, para combinaciones de frecuencias
vlidas. Por tanto, al llegar a la sentencia siguiente:
for i = 1:12
energia2(i) = energia(w1(i)) + energia(w2(i));
end

en ningn momento estamos sumando las energas de las salidas de los filtros cuyas
frecuencias utilizadas eran las frecuencias que contiene el smbolo E, ya que es una
combinacin incorrecta de frecuencias. Por consiguiente, el valor mximo de energia2
se asemejar al mximo valor del vector energia.

Si esto ocurre, el smbolo detectado es X y se contina con la deteccin. Lo


podemos ver en la siguiente instruccin:
if ((max(energia2) > max(energia) - max(energia)*0.15) &&
(max(energia2) < max(energia) + max(energia)*0.15))
siguiente = false;
secuencia = [ secuencia 'X' ]; %Dgito incorrecto

Si por el contrario esta condicin no se cumple, nicamente nos queda


concatenar el valor de la variable digito (contiene la posicin del elemento cuyo valor
es el mximo 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 mximo del vector


energia2 no superar el mnimo establecido de 5000. Si la entrada fuera voz, podra
superar este valor pero tendra ms de dos frecuencias. Estas sern las condiciones para
identificar estos dos valores:
if ((maximo < 5000) && (valores > 3))
siguiente = true;
4.2.3. Deteccin de tonos reales.
La deteccin de tonos reales se basa en el mismo procedimiento descrito
anteriormente. En el fichero genera_real.m podemos ver cmo generamos las
secuencias de tonos reales a partir de una secuencia numrica introducida por teclado.

Simplemente se trata de comprobar el dgito introducido y leer, mediante la


instruccin wavread(fichero.wav), el archivo de sonido correspondiente a dicho
smbolo 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 funcin 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
smbolo detectado sea X (ya que la mayor contribucin en la energa la produce la
componente de frecuencia alta) cuando en realidad se trata de un smbolo vlido.

5. COMANDOS DE MATLAB
A continuacin, describiremos el funcionamiento de algunos de los comandos
utilizados para realizar los scripts y las funciones genera, genera_real y detecta.

zeros (filas, columnas)

Genera una matriz nula de dimensiones filas x columnas.

for i = secuencia end

Bucle que se repite tantas veces como valores pueda tomar i.

if (condicin) else end

Condiciones mltiples: si se cumple la condicin, se ejecutan las sentencias que


siguen a if. Si por el contrario la condicin no se cumple, se ejecutan las
sentencias que siguen a else.

[secuencia, Fs, bits] = wavread (fichero.wav)

Lee un archivo de sonido y guarda sus muestras en la secuencia, su frecuencia


de muestreo en Fs y el nmero de bits usados para la codificacin en bits.

[valor, posicin] = max (vector)

Calcula el mayor elemento del vector y devuelve el valor y la posicin que


ocupa en el vector.

seal_filtrada = filter (B, A, seal_entrada)


Implementa un filtro utilizando los coeficientes B y A que mencionamos
anteriormente por el cual pasamos una seal_entrada y obtenemos la
seal_filtrada.

valor = input (texto)

Muestra el texto por pantalla y espera a que se introduzca un valor por teclado
el cual se asignar a esta variable.

subplot (XYZ)

Sirve para dividir la ventana grfica siendo X, Y y Z:

X: Nmero de divisiones horizontales de la ventana grfica.


Y: Nmero de divisiones verticales de la ventana grfica.
Z: Nmero de divisin dentro de la ventana grfica empezando a contar desde
la esquina superior izquierda.

plot ( puntos, seal, color_dibujo)

Representa los diferentes puntos de la seal en una grfica, indicando el color y


el dibujo empleados.

axis ([ xmn, xmx, ymn, ymx ])

Elegimos el rango representado en la grfica.

xlabel (ttulo) ylabel (ttulo)

Damos un ttulo al eje de abcisas u ordenadas, respectivamente.

title (ttulo)

Damos un ttulo general a la grfica.

disp (texto)

Muestra el texto por pantalla.

longitud = length (secuencia)

Devuelve la longitud de una secuencia.


round (valor_real)

Redondea un valor real.

También podría gustarte