Matlab DTMF
Matlab DTMF
Matlab DTMF
INTRODUCCIN
En primer lugar, expondremos una breve introduccin sobre qu son las seales
DTMF y cmo se codifican y se descodifican.
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.
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.
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.
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];
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
Notch filter
Filtros pasa banda de alta ganancia
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.
siendo
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.
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).
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;
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
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 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.
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.
Muestra el texto por pantalla y espera a que se introduzca un valor por teclado
el cual se asignar a esta variable.
subplot (XYZ)
title (ttulo)
disp (texto)