Robots de combate




TIPOS DE ROBOTS Y EJEMPLOS

Realmente no existe una clasificación formal en cuanto a robots de combate se refiere. Podríamos empezar hablando de robots de combate activos y pasivos. Los activos se caracterizan por ser robots armados y los pasivos por desarmados. Puede parecer no tener sentido la construcción de un robot de combate pasivo pero, dependiendo de las normas de competición, puede que sí; por ejemplo si dan como ganador al último robot que permanezca en pie. Los primeros son más agresivos y de choque mientras que los segundos resultan más escurridizos. Un ejemplo de robot pasivo puede ser el King Buxton, el cual tiene un radio de giro de cero grados y funciona igual panza arriba, siendo muy compacto.

Según los expertos, el 90% de las armas no sirven para nada, pues las armas cortantes como las sierras y los discos abrasivos son ideales para el cartón y la madera, pero no para el cuerpo metálico de otro contrincante. Otros parámetros importantes a la hora del diseño son la sencillez y la robustez. Pasemos a ver varios ejemplos concretos de robots de combate de distinto tipo para indagar en estas cuestiones.

Razer

Razer es un robot activo inclasificable que pesa 79.2kg, cuyas dimensiones son de 51x125x60cm, que utiliza dos motores de carro de golf como planta motriz y cuyo arma es un aplastador hidráulico muy efectivo.

Obtuvo un premio como uno de los mejores diseños de la Guerra de los Robots británica y ha ganado varias competiciones. Alcanza los 18km/h y tiene una muy buena aceleración de 5m/s2. El arma, a diferencia de las comentadas, es tremendamente efectiva, pues utiliza un sistema hidráulico que a diferencia de los neumáticos, es incompresible. Además, concentra toda la fuerza en una superficie muy pequeña, por lo que presión del pico equivale a una fuerza de 3 toneladas capaz de atravesar a cualquier adversario. Además posee un sistema de incorporación parecido al de un gato elevador, lo que hizo sobrepasar los límites en cuanto a las normas de peso de la competición. Recortando algunos trozos de metal del chasis se consiguió solucionar el problema. Se invirtieron 1650 horas de trabajo y 1600 libras esterlinas en su construcción.

Nightmare

Nightmare es un robot activo tipo pesado y con ruedas que pesa 95kg, cuyas dimensiones son de 1.8x1.5x1.5m, que utiliza dos motores de 24V como planta motriz y cuyo arma es un disco con dos dientes rotatorios.

El disco de ataque no es un disco de ataque en sí, pues es completamente liso, ya que posee dos trozos de acero inoxidable que giran a 480km/h haciéndole ganar en 1999 el premio al robot más agresivo. Está controlado por un radiorreceptor Futaba de 6 y otro de 9 canales. El creador trabajaba como animador infográfico de storyboards para Industrial Light and Magic (la empresa que realizó los efectos especiales de las películas La Guerra de las Galaxias, Indiana Jones y Parque Jurásico) y se inspiró para la creación de este robot en una draga rueda de cangilones (empleada en Kazajstán).

Behemoth

Behemoth, que en hebreo quiere decir “bestia gigantesca”, es un robot de combate activo tipo dirección de patín controlada mediante PCM (modulación de pulsos codificados) que pesa 100kg, cuyas dimensiones son 115x63.5x53cm, que utiliza dos motores Bosch de 24V y 750W y cuyas armas son un hacha y una pala neumáticas.

En esencia se trata de una pala allanadora provista de un hacha. El chasis del robot es una batea de titanio y los motores se asientan en unos bloques ABS. En la figura se observa el mecanismo de pala del robot. Unos arietes se encargan de su levantamiento, siendo dos válvulas solenoidales las encargadas de accionarlos. Estas válvulas se ocupan de cambiar el curso del CO2 que fluye a través de la unidad neumática. En el primer caso, el CO2 penetra por la parte posterior del ariete, provocando que este se extienda y levante la pala. Cuando el solenoide está apagado, el gas se introduce por la parte delantera y hace que el ariete se retraiga. Finalmente, comentar que el depósito intermedio recibe CO2 procedente de tres botellas de pistola de pintura.

Wheely Big Cheese

Wheely Big Cheese es un robot semi-activo tipo aleta/cuña que pesa 99.8kg, cuyas dimensiones son 1.47x0.94x0.42m, que utiliza motores Litton de 24V como planta motriz y cuyo arma es una aleta propulsada.

Tiene una buena estructura y materiales que lo dotan de resistencia. La parte delantera del robot se desplaza sobre cojinetes y la aleta puede levantar hasta una tonelada de peso lanzando a cualquier contrincante por los aires. Concretamente puede elevarse hasta 1.2m de altura en sólo 0.4s. El siguiente diagrama muestra cómo se transmiten las fuerzas por la máquina hasta el suelo cuando el robot levanta a un contrario. Finalmente, comentar que, al igual que los anteriores robots, también posee un mecanismo de autoincorporación.

LA IMPORTANCIA DEL RADIOCONTROL

A nivel de competición es crucial un buen sistema de RC pues, según expertos dentro de este mundo, el 80% de los participantes son derrotados por su propio RC. La persistencia de partes ruidosas y una incorrecta longitud de antena son problemas comunes en este sentido. Un mal sistema de RC puede provocar perder el control del robot, lo que supone, en el mejor de los casos, que el aparato quede parado (en el caso de que el transmisor o el receptor se inutilicen o la señal enviada no pueda ser interpretada por el receptor, ya sea por ruido u otros avatares) o que se vuelva loco, pudiendo poner en peligro la integridad de las personas al, por ejemplo, realizar una mala decodificación de las señales procedentes de nuestro transmisor o por señales interferencia.

Un típico equipo de RC, de los que se pueden encontrar en cualquier tienda de modelismo, está compuesto por un transmisor (a), un cargador de baterías (b), servos (c) conectados al receptor (d) y baterías para el receptor (e). El servo está compuesto por un motor que hacer girar la leva del servo (la figura blanca de la imagen). Las palancas del transmisor funcionan del siguiente modo: al moverlas adelante y atrás gira un eje que cambia el voltaje del potenciómetro, lo que produce una variación de la señal información que se transmite al aire modulada. Por tanto, el transmisor también constará de un cristal piezoeléctrico para proporcionar la frecuencia de una señal portadora.

En consecuencia, no podemos elegir cualquier ancho de banda para operar sin más, sino que existen unas bandas especiales para ser utilizadas por los roboteros. Al comienzo, todos los RC venían sintonizados en 27MHz, concediéndosele a cada usuario un trozo de 25-50kHz en torno a dicha frecuencia central. Se ha llegado a poblar en exceso esta banda de modo que, en la actualidad, se usan los 35MHz para el aeromodelismo y los 40MHz para los vehículos de superficie. Si no nos ceñimos a estas frecuencias, se podrían producir problemas por interrupción en algunos servicios como el de los bomberos en ciertos países, donde se utiliza la banda de los 70.5MHz. La frecuencia escogida para la Guerra de los Robots es la de los 40MHz usándose los 459MHz para los robots caseros.

La mayoría de los robots tienen cuatro canales, destinados a dirección, control de velocidad, activación del armamento y algún mecanismo de autoincorporación, implementándose ambos últimos mediante simples interruptores. La señal modulada transporta la información sobre estas cuatro características de forma simultánea.

En RC la onda portadora se modula con una secuencia de pulsos pero, para ello, antes la señal información continua hay que convertirla en dicha secuencia de pulsos. Para ello se siguen los métodos de modulación por pulsos codificados (PCM, variando la amplitud de los pulsos) y modulación por posición de los impulsos (PPM; en este caso, cuanto mayor sea la amplitud de la señal modulante, mayor es la velocidad de generación de pulsos de amplitud constante y viceversa). PCM, además es, como sabemos, menos sensible a interferencias. Las instrucciones para cada canal se envían de forma secuencial. Finalmente, notar que la modulación de la portadora procedente del cristal no es más que una modulación en frecuencia. La señal entonces se amplifica y pasa a la antena. El receptor entonces demodula la señal procedente a la frecuencia acordada y la decodifica según PCM o PPM, enviándose al servo (por ejemplo para el control de dirección) o interruptor correspondiente para efectuar la operación deseada.

DISEÑO Y CONSTRUCCIÓN DE ROBOTS DE COMBATE

Explicaremos muy brevemente cómo construir dos robots de combate con materiales reciclados: uno de ellos será un robot tipo aleta/cuña similar al visto y otro un robot hormiga. El diseño y construcción de robots sólo tiene límites en cuanto a lo establecido por las normas de la competición. Por lo demás, no existe un procedimiento fijo o metódico para su realización y es importante utilizar la imaginación.

Lo ideal sería utilizar, para el primer tipo de robot, por su ligereza y bajo precio, una plancha de fibra de densidad media, aunque también puede usarse contrachapado. Primero diseñaremos y recortaremos las piezas para la construcción del chasis con alguno de estos materiales a nuestro gusto, siempre respetando las normas de la competición en la que vayamos a participar (dimensionado, materiales, peso…). Podemos fijar estas piezas para el chasis con escuadras de aluminio y algunos remaches. Tendremos en cuenta el tamaño de los elementos del interior y haremos aberturas en la base para la salida de las ruedas. Para las ruedas se pueden reaprovechar unas ya existentes o ser fabricadas y ensambladas tal y como, por ejemplo, figura en el diagrama.

Se pueden reaprovechar un par de motores de limpiaparabrisas. Se necesitará un juego de ellos, es decir, uno izquierdo y otro derecho. En cada lateral se harán perforaciones tanto para el eje de los motores como para fijarlos y también las ruedas. Los motores de limpiaparabrisas tienen dos velocidades: lenta y rápida. Necesitamos que funcionen muy deprisa, por lo que habrá que trucarlos empalmando un cable en el terminal rápido del interior del motor.

Agregando unos bloques de poliestireno en el chasis podemos aumentar mucho la rigidez del robot sin agregar apenas peso.

Unas baterías de gel plomo ácido-selladas como las de los sistemas antiincendio nos servirán para alimentar los motores de las ruedas. Tras conectarlas, nuestro robot podrá comenzar a andar.

Podemos entonces pasar a construir el sistema neumático que será la base del funcionamiento de la aleta de volteo. Necesitamos en primer lugar, por tanto, una válvula que corte o permita el suministro de aire para el lanzamiento de la aleta. Necesitamos diseñar una placa de soporte para sendos servos que harán dicha función y que se ensamblarán como se muestra en el diagrama. Como depósito de aire del sistema neumático podemos hacer uso de una botella, pues permite contener suficiente aire como para lanzar la aleta bastantes veces durante un combate, es ligera y soporta la suficiente presión.

Un par de bombas de bicicleta iguales servirán de arietes para el levantamiento de la aleta.

Podemos utilizar unas planchas de aluminio para dotar de fuerza y resistencia a la estructura, todo ello sin incrementar notablemente el peso del robot. De este mismo material fabricamos la aleta de volteo, colocándole también algún refuerzo. Seguidamente será necesario agregar algún tipo de cuerda para frenar el movimiento de la aleta de tal modo que esta no arranque los pistones de los bombines. También es el momento de instalar la unidad servoneumática anteriormente construida. Con un poco de poliestireno y cable se fijarán las botellas, interconectando finalmente todo el sistema neumático (botellas, servos, arietes…).

Finalmente deberemos ocuparnos de la electrónica (para el control del robot). Se puede instalar una dirección diferencial, esto es, que el radio de giro dependa de la velocidad de cada motor. El sistema se compone de un transmisor, como puede ser cualquiera de radiocontrol, y de un receptor en el robot conectado a un microcontrolador PIC que procesará las señales y las enviará al controlador de velocidad que se encargará de decirle a cada motor, cuál debe ser la velocidad de giro de cada uno de ellos. Como se observa, entre el microcontrolador y el controlador de velocidad existe un aislador óptico. Este dispositivo permite la comunicación de ambos dispositivos mediante luz. Esto se hace así para evitar daños e interferencias en el radiocontrol por parte de los motores del robot. Aparte de ellos deberemos proporcionar alimentación a cada componente. Montaremos finalmente todo el sistema electrónico receptor en el robot y realizaremos los últimos ajustes.

Otra opción más sencilla de construir y más económica es la de un robot de combate tipo hormiga.

Partiremos de la utilización de un sistema de RC a 40MHz y de tres microservos. En primer lugar, y tras haber realizado un chasis que puede ser una simple plancha de plástico con dos aberturas para las ruedas, adaptaremos dos de los tres microservos para que giren y giren como un motor normal y no se limiten a un ángulo entre 90º y 135º. Estos nos servirán como fuente de propulsión para el control de las ruedas. Fijaremos unas pequeñas ruedas al chasis y las ensamblaremos con las levas de los microservos que se fijarán mediante cinta adhesiva al chasis por la cara interna. Un tercer microservo se puede colocar encima de los otros a fin de que levante una pequeña aleta que servirá de arma como en el anterior caso. Todos ellos se conectarán al receptor que se colocará sobre el chasis. También colocaremos la alimentación sobre el mismo y la conectaremos a la alimentación del receptor. Finalmente recubrimos todo con algún material plástico que sirva de coraza y damos salida a la antena. También sería posible, por ejemplo, agregar algún tipo de arma como una pequeña sierra giratoria. De nuevo, sólo precisaríamos de conectar un microservo a la misma y al receptor para su control.

Filtros digitales


He implementado tres funciones de MatLab que permiten, dada la respuesta impulsiva real de un filtro en el dominio del tiempo, obtener mediante los métodos de Padé, Prony y Shanks los coeficientes que definen el filtro digital.

Podemos observar que, en general (aunque dependiendo del caso particular y del orden del filtro), el mejor comportamiento lo presenta el de Shanks que no es más que una recalculación de los coeficientes B para el método de Prony, aprovechando los mismos coeficientes A. Además, en general son mejores los filtros obtenidos mediante los métodos de Prony y Shanks respecto del de Padé, debido a que el método de Padé sólo utiliza las p+q+1 primeras muestras de la respuesta impulsiva ideal para caracterizar los coeficientes del filtro, mientras que, independientemente del orden, en Prony y Shanks podemos hacer uso de N muestras de la respuesta impulsiva, debido a que se basa en la caracterización del filtro a través de coeficientes de autocorrelación.


Adjunto una captura de un filtro pasa baja IIR con p = 5 y q = 10, así como los códigos MatLab de las distintas funciones.



Método de Padé
% mPade
%
% Calcula los coeficientes A y B de un filtro digital por el método de
% Padé.
%
% mPade(x,p,q), donde 'x' es la respuesta impulsiva ideal del filtro en el
% dominio del tiempo, 'p' es el orden de los coeficientes A del denominador
% y 'q' es el orden de los coeficientes B del numerador.
%
% [a,b] = mPade(x,p,q), donde 'a' almacena los coeficientes A y 'b' los
% coeficientes B del filtro calculado.
%
% Autor: Iván López Espejo

function [a,b] = mPade(x,p,q)
% Cálculo de la matriz de formulación del método.
matrixPade = [];
column = x(1:q+p+1);
for k = 1:1:p+1
matrixPade = [matrixPade; column];
column = [0 column(1:q+p)];
end
matrixPade = matrixPade';
% Determinación de los coeficientes 'a' del denominador.
matrixA = matrixPade(q+1:q+p,1:p);
vectorA = [];
for k = 1:1:p
vectorA(k) = x(q+k+1);
end
vectorA = vectorA';
a = -inv(matrixA)*vectorA;
a = [1; a];
% Determinación de los coeficientes 'b' del numerador.
b = matrixPade(1:q+1,1:p+1)*a;


Método de Prony
% mProny
%
% Calcula los coeficientes A y B de un filtro digital por el método de
% Prony.
%
% mProny(x,p,q), donde 'x' es la respuesta impulsiva ideal del filtro en el
% dominio del tiempo, 'p' es el orden de los coeficientes A del denominador
% y 'q' es el orden de los coeficientes B del numerador.
%
% [a,b] = mProny(x,p,q), donde 'a' almacena los coeficientes A y 'b' los
% coeficientes B del filtro calculado.
%
% Autor: Iván López Espejo

function [a,b] = mProny(x,p,q)
% Obtención de la forma matricial de las ecuaciones normales de Prony.
corrcruz = 0;
matrixProny = [];
for k = 1:1:p
for l = 1:1:p
for m = p+1:1:length(x)
if m-l > 0 && m-k > 0
corrcruz = corrcruz + x(m-l)*x(m-k);
end
end
matrixProny(l,k) = corrcruz;
corrcruz = 0;
end
end
% Calculamos el vector de términos independientes para la obtención de los
% coeficientes 'a'.
vectorA = [];
for k = 1:1:p
for m = p+1:1:length(x)
if m-k > 0
corrcruz = corrcruz + x(m)*x(m-k);
end
end
vectorA(k) = corrcruz;
corrcruz = 0;
end
vectorA = vectorA';
% Obtención de los coeficientes 'a'.
a = -inv(matrixProny)*vectorA;
a = [1; a];
% Construcción de matriz de Padé para el cálculo de los parámetros 'b' del
% filtro.
matrixPade = [];
column = x(1:q+p+1);
for k = 1:1:p+1
matrixPade = [matrixPade; column];
column = [0 column(1:q+p)];
end
matrixPade = matrixPade';
% Determinación de los coeficientes 'b' del numerador.
b = matrixPade(1:q+1,1:p+1)*a;


Método de Shanks
% mShanks
%
% Calcula los coeficientes B de un filtro digital por el método de
% Shanks siéndole pasados los coeficientes A calculados por el método de
% Prony.
%
% mShanks(a,x,q), donde 'a' son los coeficientes calculados mediante el
% método de Prony, 'x' es la respuesta impulsiva ideal del filtro en el
% dominio del tiempo y 'q' es el orden de los coeficientes B del numerador.
%
% [b] = mShanks(a,x,q), donde 'b' almacena los coeficientes B del filtro
% calculado.
%
% Autor: Iván López Espejo

function [b] = mShanks(a,x,q)
% Generación de la función delta.
delta = zeros(1,length(x));
delta(1) = 1;
% Cálculo de la respuesta impulsiva según el filtro determinado por los
% coeficientes A.
g = filter(1,a,delta);
% Cálculo de la matriz de correlaciones para la obtención de los parámetros
% 'b' según el método de Shanks.
corrg = 0;
matrixShanks = [];
for k = 1:1:q+1
for l = 1:1:q+1
for m = 1:1:length(x)
if m-l-1 > 0 && m-k-1 > 0
corrg = corrg + g(m-l-1)*g(m-k-1);
end
end
matrixShanks(l,k) = corrg;
corrg = 0;
end
end
% Cálculo del vector de términos independientes.
vectorShanks = [];
for k = 1:1:q+1
for l = 1:1:length(x)
if l-k-1 > 0
corrg = corrg + x(l)*g(l-k-1);
end
end
vectorShanks(k) = corrg;
corrg = 0;
end
vectorShanks = vectorShanks';
% Obtención de los coeficientes 'b' mediante resolución del sistema de
% ecuaciones.
b = inv(matrixShanks)*vectorShanks;

Lilo's House


Esa es la caseta que le construí al perro de Irene y mío, llamado Last Input Last Output (Lilo para los amigos), con la inestimbale paciencia y colaboración tanto de ella como de mi padre.

Son sólo unos paneles de aglomerado (salvo la base, que es de pino) cortados y fijados mediante tornillos, salvo las columnas del porche que hubo que tornearlas. Se levanta del suelo gracias a unas pequeñas patas. Se pintó con pintura al agua ideal para exteriores, lo que proteje el aglomerado. Finalmente coloqué en el porche un pedacito de césped artificial para darle ese toque. Estoy pensando en cubrir tanto el techo como el tejadillo del porche con imitación de pizarra, pero eso es ya otra historia que quizá haga más adelante.

Tratamiento de audio ruidoso (I)

Me dispongo a desarrollar un pequeño programa para la limpieza automática de ruido típico en archivos de audio genéricos.

Primeramente genero el algoritmo que aplicaré mediante MatLab. Posteriormente expandiré la técnica y programaré todo junto con alguna interfaz de usuario en Java.

La técnica de limpieza es muy sencilla: dado un archivo de audio de entrada, el programa habrá de reconocer un tramo de lo que es considerado ruido. Asumimos entonces que se trata de ruido blanco, por lo que podremos caracterizarlo sin más que estudiar su media y su varianza. El programa entonces generará una cantidad considerable de muestras de ruido blanco de iguales características, promediándolo con el archivo ruidoso original en cuestión. Una vez hecho, con un post-tratamiento que incluiría algo de ganancia, tendríamos el archivo de audio limpio de ruido.

Son obvias las limitadas aplicaciones del algoritmo pero permite, en la inmensa mayoría de casos, limpiar el fichero del típico ruido adherido durante una grabación u otros.

El siguiente código en MatLab ejemplifica lo expuesto. También adjunto una gráfica donde se muestran los dos canales (audio estéreo) de lo que es considerado ruido, y el ruido final tras ser tratado mediante dicho algoritmo.


% Algoritmo para la limpieza de ruido en archivos de audio.
% Autor: Iván López Espejo
clear;

% Lectura del archivo de audio y pretratamiento.
[muestras,frecMuestreo,numMuestras] = wavread('Ir3.wav');
ruido = muestras(1:5000,:);
ruidoIzq = ruido(:,1);
ruidoDer = ruido(:,2);
mediaIzq = mean(ruidoIzq);
mediaDer = mean(ruidoDer);
varIzq = var(ruidoIzq);
varDer = var(ruidoDer);
rFIzq = ruidoIzq;

rFDer = ruidoDer;
% Generación de ruido de iguales características para promediado.
for k = 1:1:10000
rIzq = mediaIzq + sqrt(varIzq)*randn(length(ruidoIzq),1);
rFIzq = rFIzq + rIzq;
rIzq = 0;
rDer = mediaDer + sqrt(varDer)*randn(length(ruidoDer),1);
rFDer = rFDer + rDer;

rDer = 0;
end
rFIzq = rFIzq/10001;
rFDer = rFDer/10001;
rFIzq = rFIzq - mediaIzq;

rFDer = rFDer - mediaDer;
% Representaciones de los ruidos original y tratados.
subplot(2,1,1), plot(ruidoIzq,'g'), title('Canal Izquierdo')
hold on
subplot(2,1,1), plot(rFIzq,'r')
hold off
legend('Ruido Original','Ruido Tratado')
subplot(2,1,2), plot(ruidoDer,'g'), title('Canal Derecho')
hold on
subplot(2,1,2), plot(rFDer,'r')

hold off
legend('Ruido Original','Ruido Tratado')




Simulación y applets

El siguiente applet (aplicación ejecutable en un navegador web) programado en Java realiza simulaciones acerca del juego de apuestas del doblado en ruletas.

La mecánica es bien sencilla. El jugador apuesta 1€ al rojo o al negro. Si gana, apuesta la misma cantidad que apostó anteriormente al mismo color. Si pierde, dobla la apuesta al mismo color. El programa de simulación que realicé considera éxito haber ganado 50€ o más, y fracaso haber perdido 50€ o más. Pueden introducirse las veces que se quiere jugar con esta dinámica y el programa, considerando una distribución de probabilidad uniforme, simulará el resultado (número de jugadas ganadas respecto de perdidas).

Por lo que se observa, la probabilidad de éxito de este sistema se encuentra en torno al 55%, por lo que no es muy recomendable aplicar la técnica ciegamente.

En este link pueden probar el applet.

Se basa en el uso de la simulación Monte Carlo, donde la estimación del error absoluto del método tiende a la inversa de la raíz del número total de simulaciones en virtud del Teorema del Límite Central.

Las siguientes gráficas de datos recogen los resultados de la simulación con el applet (porcentaje de jugadas ganadas frente a las totales en función del número de repeticiones del experimento) y el estimado del error.


Nota: Es necesario tener soporte Java para la ejecución del applet.

Reconocimiento Automático de Locutores

Poder reconocer la procedencia de la voz puede ser una herramienta muy útil, es decir, poder identificar de forma automática quién habla mediante la asistencia de un computador y sin necesidad de intervención humana alguna en tiempo real para dicha resolución. Las aplicaciones son innumerables.

Actualmente me encuentro desarrollando un pequeño programa que intenta solventar este escollo. La primera aproximación se encuentra implementada en MatLab, adjuntándose a continuación el código. Mi primera solución, la cual iré puliendo con el paso del tiempo, se basa en el estudio de la correlación del módulo de la Transformada Rápida de Fourier de un conjunto de muestras de audio que contengan voz. La operación de correlación, grosso modo, mide la similitud entre dos funciones. Aprovechando el concepto de densidad de potencia espectral de la voz, comparo el módulo del espectro de voz entrante con los existentes en una base de datos previamente cargada.

Una característica importante de la voz es el timbre. El timbre modela los armónicos y su potencia, por lo que el estudio de la voz en el dominio de la frecuencia resulta, a priori, imprescindible. También, dependiendo de la persona, la densidad de potencia se concentrará en unas u otras zonas del espectro (normalmente en zonas más bajas para el hombre que para la mujer).

No obstante, el sistema para nada es infalible; de hecho, nada más lejos. Según mi corta experiencia sobre el siguiente código, he comprobado que tiene una fiabilidad del 88.8%, cifra que puede aumentar o disminuir, debido a que dicha experiencia no resulta a día de hoy del todo representativa. Sería necesario el estudio de otros parámetros para discutir con mayor fiabilidad el resultado. Esto son mejoras que iré incluyendo en los próximos días.

Finalmente, comentar que, en principio, el siguiente código no aprende ni actualiza su base de datos en función de usuarios no conocidos, sino que supone que el acceso al mismo será por parte de personas ya registradas (selección de mejor correlación). Pueden probar a diferenciar entre dos personas sin más que almacenar en un archivo, que hará de base de datos, 40000 muestras del módulo de la Transformada Rápida de Fourier procedentes de un archivo de audio (.wav) de voz con, al menos, 80000 muestras (por convenio) muestreadas a una frecuencia de 44100Hz.


% PROGRAMA PARA EL RECONOCIMIENTO AUTOMÁTICO DE LOCUTORES 0.1a

% Autor: Iván López Espejo
audio = input('Introduzca, entre comillas, el archivo de audio para analizar con extensión wav: ');
[muestras,frecMuestreo,numMuestras] = wavread(audio);
muestras = muestras(:,1);
if frecMuestreo ~= 44100
disp('La frecuencia de muestreo del audio de entrada ha de ser de 44100Hz');
else
if length(muestras) < 80000
disp('El número de muestras del audio de entrada a la frecuencia de muestreo, ha de ser al menos de 80000 muestras');
else
HComp1 = csvread('Per1.ascii');
HComp2 = csvread('Per2.ascii');
muestras = muestras(1:80000);
H = fft(muestras);
H = H(1:length(H)/2);
H = abs(H);
correlacion1 = corr(HComp1,H);
correlacion2 = corr(HComp2,H);
if correlacion1 > correlacion2
disp('La voz en cuestión es de la Persona 1.');
else
disp('La voz en cuestión es de la Persona 2.');
end
end
end

Irene.

01010110010010010100010001000001
Comprar en
Descargar

Cargando...
Mi foto
Iván López





Soy estudiante de Ingeniería de Telecomunicación.
Ver todo mi perfil