It should work…

Cuando cualquier trasto es útil

It should work… header image 2

Llamando por teléfono con Matlab

January 15th, 2009 · 19 Comments · programming

Mañana tengo examen de laboratorio de tratamiento digital de la señal y cuando ya no tienes ganas de estudiar sólo tienes ganas de hacer el melón. Así que aquí tenéis un script de Matlab al cual le pasas un número telefónico y te genera y reproduce un wav con los tonos DTMF para hacer la llamada. Descolgáis el teléfono, lo acercáis a los altavoces y ejecutáis “ring(numero)”.

Lo quería hacer en Octave (por aquello del software libre y tal) pero es una _censored_ patata pinchada en un palo y me he cansado de sus pejiguerías.

¿En qué se basa esto? A cada número se le asigna una pareja de tonos según la tabla siguiente y se envía la suma de éstos, el nombre es bastante explicativo: Dual Tone Multi Frequency.

dtmf1

En mi portátil no funciona porque mis altavoces están cascadísimos y no reproducen como deberían xDDD En el portátil de Rafa sí que iba.

Aquí está el código:

function y = ring(x)
 
number = x;
numberstr = int2str(number);
 
% Sampling Frequency
fs = 8000;
% initializing arrays, 1200 samples
digit = 0:1199;
silence = zeros(1,1200);
 
disp('Calculating DTMF tones...');
 
% row sinusoids
sin697 = sin(2*pi*697*digit/fs);
sin770 = sin(2*pi*770*digit/fs);
sin852 = sin(2*pi*852*digit/fs);
sin941 = sin(2*pi*941*digit/fs);
% column sinusoids
sin1209 = sin(2*pi*1209*digit/fs);
sin1336 = sin(2*pi*1336*digit/fs);
sin1477 = sin(2*pi*1477*digit/fs);
 
% numbers
num1 = (sin1209+sin697)/2;
num2 = (sin1336+sin697)/2;
num3 = (sin1477+sin697)/2;
num4 = (sin1209+sin770)/2;
num5 = (sin1336+sin770)/2;
num6 = (sin1477+sin770)/2;
num7 = (sin1209+sin852)/2;
num8 = (sin1336+sin852)/2;
num9 = (sin1477+sin852)/2;
num0 = (sin1336+sin941)/2;
% an asterisk would be: (sin1336+sin941)/2);
% a pad would be: (sin1477+sin941)/2);
 
% insert a silence in the begining
y = zeros(1, 1200);
% fill the rest
for i = 1:length(numberstr)
	num = str2num(numberstr(i));
	switch num
		case 0
			dtmf = num0;
		case 1
			dtmf = num1;
		case 2
			dtmf = num2;
		case 3
			dtmf = num3;
		case 4
			dtmf = num4;
		case 5
			dtmf = num5;
		case 6
			dtmf = num6;
		case 7
			dtmf = num7;
		case 8
			dtmf = num8;
		case 9
			dtmf = num9;
		otherwise
			disp('O_o');
    end
    % insert the number samples
    y = [y dtmf];
    % insert the silence samples
    y = [y silence];
end
 
wavwrite(y,fs,'ring.wav');
 
disp('Ringing number:');
disp(numberstr);
 
% play it
wavplay(y,fs);
 
disp('Happy talking');




Fuente original en http://vierito.es/wordpress

Similar Posts:

Tags: ··

19 responses so far ↓

  • 1 Rafa // Jan 15, 2009 at 2:53 am

    Sólo por la hazaña de llamar por teléfono con Matlab deberían darnos matrícula de honor :D

    PD: esta es una de las aplicaciones absurdas de lo que se aprende en la ETSIT

  • 2 vierito5 // Jan 15, 2009 at 12:40 pm

    Quita quita, a mí con que me aprueben me basta, que no las tengo conmigo.

  • 3 Death_Master // Jan 15, 2009 at 7:02 pm

    Jajajaja… qué pedazo de frikada. Me encanta. :D

  • 4 Kraladriel // Jan 15, 2009 at 8:28 pm

    Qué frikis….^^

  • 5 Gololo // Jan 16, 2009 at 11:11 am

    Como mola… me voy a instalar el Matlab sólo para hacerme unos cuantos tonos para el móvil! xDDD

  • 6 vierito5 // Jan 16, 2009 at 12:03 pm

    Ese iba a ser el siguiente script cabrón!!
    Me has quitado la idea, hacer uno que aceptase nota y duración y devolviera el politono! Envía politono Gunther!

  • 7 Zurdo // Apr 17, 2009 at 6:00 pm

    Está muy bueno el Script, soy estudiante principiante del matlab, trate de correrlo pero no pude, me podeis explicar por favor paso a paso como se hace???, como se carga,?? ya que me bota error de funcion y algo asi como que no esta permitido,,, Agradezco tu ayuda..Salud

  • 8 vierito5 // Apr 17, 2009 at 10:58 pm

    @Zurdo: Graba el código como ring.m y puedes o cambiar el directorio de trabajo de Matlab a donde esté el fichero o lo copiarlo a tu directorio de trabajo actual. Luego desde el intérprete de órdenes de Matlab ejecuta ring(x) siendo x el número al que quieres llamar., por ejemplo: ring(123456789)

  • 9 magoirlandes // Sep 11, 2009 at 6:22 pm

    Muy interesante. ¿Y al contrario? Osea, recibir los tonos y decodificarlos, para saber que nos envían.

    Esto me parece también muy interesante

  • 10 vierito5 // Sep 11, 2009 at 9:01 pm

    @magoirlandes: pues lo tengo implementado por ahí, así que visto el interés lo busco y publicaré un post con el código ;)

  • 11 magoirlandes // Sep 12, 2009 at 9:53 am

    Pues muchas gracias. Si puedo lo usaré. Es curioso pero no he encontrado ningun sofware que haga esto (libre claro).

    Un saludo

  • 12 david ruxo // Nov 10, 2009 at 11:16 am

    ey vierito5 pues podrias subir el caso conttrario que tengo que hacerlo y estoy super perdido!!gracias

  • 13 vierito5 // Nov 10, 2009 at 12:47 pm

    ¡Se me había pasado totalmente! Lo busco o si no lo hago de nuevo. Será el próximo post.

  • 14 Descodificar tonos DTMF usando Matlab | It should work... // Nov 25, 2009 at 2:16 am

    [...] vimos como crear tonos DTMF usando Matlab y han pedido en un par de comentarios cómo se haría a la inversa, así que aquí [...]

  • 15 vierito5 // Nov 25, 2009 at 2:22 am

    @(david ruxo), @magoirlandes: después de mucho tiempo pero ahí lo tenéis, un saludo!

  • 16 Roland // May 29, 2010 at 11:58 am

    Hay un error el numero cero no tiene asignadas las frecuencias adecuadas.

  • 17 vierito5 // May 29, 2010 at 12:04 pm

    Cierto!! Muchas gracias Roland! Arreglado :D

  • 18 Roland // May 29, 2010 at 2:45 pm

    Nada, lo estuve probando y no entendía porque me decía que el número no existía, llegué a pensar que me cortaron la línea, jaja

  • 19 vierito5 // May 29, 2010 at 2:47 pm

    xDD no me di cuenta de que me colé de columna porque todo lo probé con números sin ceros :P

Leave a Comment