5.3 Demodulación FSK. Ejercicios

5.3.1 Demodulador FSK v.23:

Se trata de implementar el algoritmo de demodulación FSK descrito y verificar su funcionamiento, utilizando como referencia la señal FSK generada en la práctica 4.

Incluiremos esta funcionalidad en lab5():

/**
  * @brief Demodulación FSK por autocorrelación y filtrado.
  *
  * @details
  * Realiza:
  *  1) Línea de retardo (22 muestras) y producto entrada·retardo (autocorrelación).
  *  2) Filtrado IIR de 2º orden (DF2T) sobre el producto.
  *  3) Decisión binaria con umbral fijo.
  *
  * @param FSK_in Muestra de entrada <16,15>.
  * @return Bit demodulado: 1 o 0.
  *
  * @pre Llamar por cada nueva muestra.
  * @note Umbral de decisión ajustado empíricamente
  *       y sin control de saturación.
  */
  uint8_t lab5(int16_t FSK_in)
lab5() Simulación
  1. Configuración del proyecto.

    • Abre el proyecto lab5.

    • Selecciona el target Test_lab5, que utiliza un simulador para la depuración del código.

  1. Tareas a realizar.

    • Escribe el código de la función lab5() en el archivo ejercicios.c.

    • Asegúrate de que el código compila correctamente y no genera errores.

    • Revisa los casos de prueba definidos en la función main(), ubicada en el archivo test/test_lab5.c.

  2. Herramientas de análisis.

    • Inicializa el debugger ico_debug y abre la herramienta Analyzer desde el menú:

      View → Analysis Windows → Logic Analyzer.

      Analyzer mostrará la evolución temporal de las variables:

      • g_pls: simula el resultado de una pulsación.

      • dbg_fsk_in: muestra de entrada FSK.

      • dbg_fsk_dly: muestra de retardo FSK.

      • dbg_fsk_prod: muestra el producto de autocorrelación FSK.

      • dbg_fsk_prod_filt: muestra la salida del filtro FSK.

      • dbg_fsk_demod: muestra el bit demodulado FSK.

      • g_time: muestra el tiempo actual de simulación.

    • Ejecuta la aplicación ico_run y corrige cualquier error funcional hasta que la función lab5() cumpla con las especificaciones.

      Figura 5-14. Señales internas del demodulador FSK en simulación.
  3. Ajuste del umbral.

    Utiliza la herramienta Logic Analyzer para medir los valores máximo y mínimo de la señal filtrada (dbg_fsk_prod_filt) durante la modulación de la secuencia "10101010".

.. note:: Para medir amplitudes, se pueden utilizar el marcador y el cursor. Seleccionamos Amplitud en la barra de herramientas y situamos el cursor en los puntos de interés de la señal. En la figura siguiente se observa la medición de las amplitudes máxima y mínima de la señal filtrada:
Figura 5-15. Medición de amplitudes máxima y mínima en la señal filtrada FSK.

una vez validado el funcionamiento en simulación, puedes implementar la misma funcionalidad en el hardware real utilizando el target lab5.

lab5() Prueba en hardware
  1. Configuración del proyecto.

    • Copia a shared/include y shared/src los archivos necesarios para utilizar los módulos pulsaciones y dds.

    • Copia también en las mismas carpetas los archivos ejercicios.c y ejercicios.h renombrándolos a lab4.c y lab4.h respectivamente. Edita lab4.h y modifica las directivas de compilación condicionada para que utilicen el nombre lab4 en lugar de ejercicios.

    • Abre el proyecto lab5.

    • Selecciona el target lab5.

  1. Tareas a realizar.

    • Modifica el código de src/main.c para que utilice la función lab5() y emplee un buffer circular para el intercambio de datos entre el bucle principal y la ISR del códec (I2S).

    • Completa el código de la rutina de interrupción en src/isr.c para que obtenga muestras del códec y las guarde en el buffer circular.

    • Para la generación de la señal FSK, se utiliza el código desarrollado en la práctica 4, y se conectan la salida (headphone) y la entrada (line-in) del códec mediante un cable de audio.

  2. Test y Resultados esperados.

    • Utiliza el osciloscopio para verificar que las señales generadas son las esperadas. Para ello visualiza la salida del demodulador FSK en el pin P7D/D8 del microcontrolador.

    • Ajusta el umbral de decisión en la función lab5() según los valores observados en el osciloscopio para conseguir tiempos en alto y en bajo similares.

5.3.2 Demodulador FSK de un string de texto:

(Ejercicio opcional)

Modifica main.c para utilizar la función lab42() que implementa una demo de modulación FSK que transmite un string de texto al detectar una pulsación larga.

Repite el proceso seguido en la sección anterior para implementar y verificar el funcionamiento correcto del del demodulador FSK.

Implementa en C la función uart_decode() que decodifica los bits recibidos por FSK y reconstruye el string original:

/**
* @brief Decodificación UART de bits recibidos por FSK.
*
* @details
* Reconstruye el string original a partir de los bits recibidos
* mediante la demodulación FSK.
*
* @param fsk_demod Resultado de la demodulación FSK: 1 o 0.
* @return Puntero al string decodificado (NULL si no hay string completo).
*
* @note Asume formato UART: 1 start, 8 data, 1 stop, sin paridad.
*       Baudrate: 1200 bps. Frecuencia de muestreo: 48 kHz.
* @pre Llamar por cada nueva muestra (aprox. 40 muestras por bit).
*/
const char* uart_decode(uint8_t fsk_demod);

5.3.3 Rediseño, modulador/demodulador FSK a 4800 bps:

(Ejercicio opcional)

Se trata de rediseñar el modulador/demodulador FSK para trabajar a una tasa de 4800 bps en lugar de 1200 bps.

Utilizaremos la siguiente configuración en el modulador FSK:

Configuración del modulador FSK a 4800 bps

Parámetro

Valor

Descripción

\(f_{s}\)

48 kHz

Frecuencia de muestreo del sistema

tasa de símbolos

4800 bps

Tasa de transmisión de datos

\(f_{0}\)

4200 Hz

Frecuencia portadora para bit 0

\(f_{1}\)

2600 Hz

Frecuencia portadora para bit 1

Y la siguiente configuración en el demodulador FSK:

Configuración del demodulador FSK a 4800 bps

Parámetro

Valor

Descripción

delay

10 muestras

Retardo para autocorrelación

filtro IIR

[b,a]=ellip(2, 1, 19, 2400/(fs/2))

Filtro paso bajo de 2º orden

umbral de decisión

-800

Umbral fijo para decisión binaria

La salida del demodulador FSK se conectará a los pines P7D/D8 y P22 del microcontrolador. P7F permite su visualización con el osciloscopio, y P22 recibir el string por el puerto serie del ordenador y mostrarlo en el terminal (putty).

Para configurar el pin P22 como salida digital, utiliza la siguiente configuración:

// Configuración pin P22 como salida digital
GPIO_ChannelDigAna(P22,GPIO_DIG);
GPIO_ChannelMode(P22, GPIO_OUTPUT);
// Inicializa P22 en estado alto
GPIO_ChannelWrite(P22, GPIO_HIGH);

fig1