Archivo por meses: agosto 2023

Detección de voz

La idea primaria es tener un sistema de radio relevo en el cual la señal recibida en un receptor se retrasmita en un trasmisor.

Se requiere un detector de sonido para que cuando exista información de audio en el Receptor ordene al Transmisor a emitir por medio de una señal enviada al Transmisor llamado normalmente PTT.

El Detector debe cumplir con algunos requisitos:

  • La señal de audio entrante debe alcanzar un nivel mínimo para disparar el PTT para evitar que el ruido lo dispare.
  • La señal de audio debe estar presente al menos un tiempo mínimo para dispara el PTT y evitar que transciendes cortas interferencias lo disparen. Vamos a considerar este tiempo mínimo como retardo de disparo.
  • La información de PTT debe permanecer un tiempo después que la señal de audio desaparezca para permitir que el transmisor no se desconecte entre pausas de sonido que se tiene cuando el audio es voz humana. Hay pausas entre silabas, palabras y oraciones.  Este tiempo de retardo lo conoceremos como retardo o tiempo de cuelgue.

SOLUCION CON COMPONENTES DISCRETOS

Hay muchos circuitos para detección de voz construidos con componente discretos desde la era de los tubos electrónicos y luego con transistores.

El siguiente es un circuito típico hecho con transistores.

El transistor Q1 actúa como un amplificador de la señal de audio que ingresa por la izquierda.  La señal de audio amplificada se rectifica por los diodos 1N914 y la corriente se utiliza para cargar el condensador de 35mF.  Cuando no hay audio no hay corriente rectificada que cargue el condensador y el transistor Q2 permanece en corte. Al aparecer audio el condensador se empieza a cargar y llega a un punto en que pone en conducción el transistor Q2 que atrae el relevador y da la orden de PTT.

El retardo de disparo depende del potenciómetro de 100K por donde se carga el condensador y el tiempo puede se ajustado con este potenciómetro.

Cuando la señal de audio cesa, el condensador de 35 mF se empieza a descargar a través de la resistencia de 100K y la unión base emisor del transistor. Cuando el condensador se descarga suficiente saca de conducción al transistor Q2 y entonces el suelta al relé y al PTT.

SOLUCION DIGITAL

En tiempos modernos la solución se puede lograr usando microcontroladores y entre ellos el mas popular es el ARDUINO.  El circuito sería el siguiente:

              Como se puede ver el circuito es mucho mas sencillo, la entrada de audio se conecta a un puerto analógico del Arduino.  Se hace a través de un condensador para eliminar el componente de corriente continua que pueda tener la entrada de audio.      

El Arduino puede leer el voltaje presente en el puerto analógico y de acuerdo con el voltaje medido puede poner en conducción o bloqueo el transistor que suministra la información de PTT.      

El nivel a que se activa el PTT y los retardos de inicio y cuelgue se trasladan al software.  A continuación, trataremos como podemos manejar el software para conseguir nuestros objetivos.

SOFTWARE

En los puertos analógicos del Arduino se lee un valor numérico entre 0 y 1024 para un voltaje análogo de entre 0 y 5 voltios. La lectura del puerto se incluye dentro de la rutina void loop() lo que produce de el voltaje sobre el puerto analógico se mida con cierta periodicidad.

El Arduino realmente lee el valor instantáneo del puerto en el instante que loop lo ejecuta. El valor medido fluctúa muchísimo y el resultado de una única medición no nos sirve para tomar decisiones.  Entonces debemos tomar muchas mediciones (muestras) de la señal de audio recibido para tratar de calcular un valor medio o ponderado que nos indique la magnitud de la señal recibida. Esto significa que debemos hacer un algoritmo o programa que nos permita evaluar la magnitud de señal sinusoidal que se está recibiendo.

Un programa elemental que nos permita calcular el valor medio de la señal basado en muestras podría ser el siguiente;

unsigned int Contador, acumulado, valor_medio;

#define entrada A1

void setup()

{

     contador = 0;

     acumulado = 0;

     valor_medio = 0;

}

void loop()

{

     Int medido = analogRead(entrada);

     acumulador += medido;

     contador++;

     if(contador >= 16)

     {

          valor_medio = acumulado / 16;

          contador = 0;

          acumulado = 0;

          procesar_valor_medio();

}

}

El programa toma 16 muestras de señal y calcula su valor medio, en la variable valor medio se mantiene ese valor.

La pregunta que tendríamos es si tomar el valor medio de 16 muestras es adecuado se requiere mas o menos muestras. La respuesta es que depende de la frecuencia de la señal de audio y la frecuencia con que se realiza el loop.

Este articulo es para ser continuado siempre y cuando exista interés de mis lectores para profundizar en el tema.