5.1 Demodulación FSK

Existen diversas técnicas para demodular una señal FSK; en esta práctica utilizaremos el esquema de demodulación no coherente mostrado en la figura siguiente:

fig1

Figura 5-1. Demodulación FSK.

La señal (\(S(t)\)) se digitaliza a \(f_s=48\,\text{kHz}\) y 16 bits de resolución (\(S[n]\)), se multiplica por una versión retrasada \(K\) muestras de la misma (\(S[n-K]\)) y se filtra para eliminar la componente de alta frecuencia. Finalmente, un detector de nivel determina si el dato corresponde con un “1” o un “0”. En esta práctica se utiliza el estándar de transmisión V.23, que especifica una velocidad de 1200 baudios, representando un “0” por \(f_0=2100\,\text{Hz}\) y un “1” por \(f_1=1300\,\text{Hz}\).

5.1.1 Cálculo del retardo K

La señal \(\text{producto}=S[n]\cdot S[n-K]\) se puede expresar así:

\[\begin{aligned} S[n]\cdot S[n-K] &= A\cos\!\left(\frac{2\pi f_o}{f_s}n\right)\cdot A\cos\!\left(\frac{2\pi f_o}{f_s}(n-K)\right) \\ &= \frac{A^2}{2}\left[ \cos\!\left(\frac{2\pi f_o}{f_s}K\right) + \cos\!\left(\frac{2\pi f_o}{f_s}(2n-K)\right) \right] \end{aligned}\]

El primer término \(\left(\frac{A^2}{2}\cdot\cos\!\left(\frac{2\pi f_o}{f_s}K\right)\right)\) es una constante que depende únicamente de \(K\) siempre que \(n\) y \(n-K\) pertenezcan al mismo bit. El segundo término, de frecuencia doble \(\left(\frac{A^2}{2}\cdot\cos\!\left(\frac{2\pi f_o}{f_s}(2n-K)\right)\right)\), se elimina con el filtro paso bajo (LPF).

Tras el filtrado, la salida tomará los valores \(\frac{A^2}{2}\cdot\cos\!\left(\frac{2\pi f_0}{f_s}K\right)\) o \(\frac{A^2}{2}\cdot\cos\!\left(\frac{2\pi f_1}{f_s}K\right)\), dependiendo del valor del bit. \(K\) debe elegirse para maximizar la diferencia \(d(K)\):

\[d(K) = \left| \cos\!\left(\frac{2\pi f_0}{f_s}K\right) - \cos\!\left(\frac{2\pi f_1}{f_s}K\right) \right|\]

Para \(f_0=2100\,\text{Hz}\) y \(f_1=1300\,\text{Hz}\), con \(f_s=48\,\text{kHz}\), \(d(K)\) tiene la forma siguiente:

fig2

Figura 5-2. d(K).

En la figura se muestran los valores de \(d(K)\) para \(K<40\) (40 muestras por bit). Se observan dos máximos, en \(K=22\) y en \(K=35\). Tomaremos \(K=22\) para evitar solapamiento entre bits. Para \(K=22\), los niveles de continua serán:

para \(f_0\)\(\frac{A^2}{2}\cdot 0.972\) y para \(f_1\)\(\frac{A^2}{2}\cdot (-0.824)\).

5.1.2 Filtro paso bajo

Utilizaremos un filtro paso bajo con las siguientes características:

fig3

Figura 5-3. Diagrama de bloques del filtro elíptico DF2T.

Características del filtro paso bajo

tipo

elíptico (IIR)

máxima pendiente

orden

2

\(\mathbf{\mathsf{F_{pass}}}\)

600 Hz

1/2 tasa de bits en la comunicación

\(\mathbf{\mathsf{A_{pass}}}\)

1 dB

atenuación en la banda de paso

\(\mathbf{\mathsf{A_{stop}}}\)

30 dB

notch en \({(2600+4200)}/{2}\)
atenuación suficiente en la banda atenuada

\(\mathbf{\mathsf{F_{s}}}\)

48 kHz

frecuencia de muestreo

Para diseñarlo se utiliza la función ellip() de Matlab:

>> fs=48000;
>> [b,a] = ellip(2,1,30,600/(fs/2))
b =
   0.031763569116579  -0.057625134062037   0.031763569116579
a =
   1.000000000000000  -1.912274541990542   0.918896699587907
fig4

Figura 5-4. Respuesta en frecuencia del filtro elíptico DF2T.

Implementamos el filtro utilizando la forma directa II transpuesta:

fig5

Figura 5-5. Estructura interna del filtro elíptico DF2T.

Para obtener el rango de la salida calculamos la norma Linf del filtro, que nos asegura que no haya overflow en la salida cuando en la entrada del filtro tenemos sinusoides:

>> hdf=dfilt.df2t(b,a)
hdf =
     FilterStructure: 'Direct-Form II Transposed'
          Arithmetic: 'double'
           Numerator: [0.0317635691165791 -0.0576251340620372 0.0317635691165791]
         Denominator: [1 -1.91227454199054 0.918896699587907]
    PersistentMemory: false

>> norm(hdf,'Linf')
ans =
   0.999999995461953

Por lo tanto, si la entrada del filtro \(|X[n]| < 1\), la salida \(|Y[n]| < \text{norm(hdf,'Linf')}\).

Diseño del filtro en coma fija
  1. Preparación del entorno.

    • Descarga y descomprime el archivo de recursos lab5 en tu espacio de trabajo.

    • Los archivos ejercicos.h y ejercicos.c que incluyen el código del filtro están ubicados en la carpeta src.

  2. Configuración del proyecto.

    • Abre el proyecto lab5.

    • Selecciona el target Test_filtro, que utiliza un simulador

      para la depuración del código. Esto permite desarrollar y validar el software sin necesidad de disponer del hardware físico.

  3. Tareas a realizar.

    • Codifica los coeficientes del filtro en 16 bits con la mayor precisión posible.

    • Anota en el diagrama del filtro el formato en coma fija de los nodos.

    • Indica las transformaciones necesarias para que los cálculos sean correctos.

    • Considera la entrada \(|x[n]| < 1\).

    • Escibe la función de filtrado en C en el fichero ejercicios.c, prototipada como:

      /**
         * @brief  Aplica un filtro eliptico de orden 2 a la señal de entrada
         *           utilizando la forma directa II transpuesta
         * @param  entrada: señal de entrada <16,15>
         * @return          señal de salida  <16,15>
         *
         * @note   El filtro se ha diseñado en Matlab:
         * @code    fs=48000;
         *          [b,a] = ellip(2,1,30,600/(fs/2))
         */
         int16_t iir_filtro_df2t (int16_t entrada)
      
    • 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_filtro.c.

  4. 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 globales:

      • g_inputsample: muestra de entrada.

      • g_outputsample: muestra de salida (filtrada).

    • Ejecuta la aplicación ico_run y corrige cualquier error funcional hasta que la

      función iir_filtro_df2t cumpla con la especificación deseada.

  5. Test y Resultados esperados.

    El fichero test/test_filtro.c incluye los siguientes casos de prueba:

    • Test1: respuesta impulsional del filtro:

      Figura 5-6. Respuesta impulsional del filtro.
    • Test2: respuesta escalón del filtro.

      Figura 5-7. Respuesta escalón del filtro.
    • Test3: filtrado de una señal senoidal de frecuencia 600 Hz.

      Figura 5-8. Filtrado de señal senoidal de 1200 Hz.
    • Test4: filtrado de una señal senoidal de frecuencia 3319 Hz.

      Figura 5-9. Filtrado de señal senoidal de 3319 Hz.

    Nota

    La simulación se detiene después de cada test. Ajusta el zoom y los valores Min/Max de la gráfica para visualizar correctamente la señal.

5.1.3 Detector y modelo Matlab

Con el fin de evaluar el funcionamiento del algoritmo, tanto el modulador de la práctica anterior como el demodulador de esta se han implementado en Matlab: ModDemod_FSK.m. La figura siguiente muestra las señales a la salida de los distintos bloques del algoritmo de demodulación: señal de entrada (FSK), producto (FSK_prod), señal filtrada (FSK_prod_filt) y señal digital (FSK_demod):

fig10
Figura 5-10. Proceso de demodulación.

Podemos utilizar la gráfica de la salida del filtro FSK_prod_filt para diseñar el algoritmo de detección: se trata de que el tiempo de bit sea el mismo para un “1” que para un “0”. En la simulación, si la salida del filtro es > 0.15, el dato es un “0”; en caso contrario, un “1”.