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
Configuración del proyecto.
Abre el proyecto lab5.
Selecciona el target
Test_lab5, que utiliza un simulador para la depuración del código.
Tareas a realizar.
Escribe el código de la función
lab5()en el archivoejercicios.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 archivotest/test_lab5.c.
Herramientas de análisis.
Inicializa el debugger
y abre la herramienta
Analyzer desde el menú:.
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
y corrige cualquier error funcional
hasta que la función lab5()cumpla con las especificaciones.
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".
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
Configuración del proyecto.
Copia a
shared/includeyshared/srclos archivos necesarios para utilizar los módulospulsacionesydds.Copia también en las mismas carpetas los archivos
ejercicios.cyejercicios.hrenombrándolos alab4.cylab4.hrespectivamente. Edita lab4.h y modifica las directivas de compilación condicionada para que utilicen el nombrelab4en lugar deejercicios.Abre el proyecto lab5.
Selecciona el target
lab5.
Tareas a realizar.
Modifica el código de
src/main.cpara que utilice la funciónlab5()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.cpara 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.
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/D8del 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:
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:
Parámetro |
Valor |
Descripción |
|---|---|---|
delay |
10 muestras |
Retardo para autocorrelación |
filtro IIR |
|
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);