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:
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í:
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)\):
Para \(f_0=2100\,\text{Hz}\) y \(f_1=1300\,\text{Hz}\), con \(f_s=48\,\text{kHz}\), \(d(K)\) tiene la forma siguiente:
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:
Figura 5-3. Diagrama de bloques del filtro elíptico DF2T.
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
Figura 5-4. Respuesta en frecuencia del filtro elíptico DF2T.
Implementamos el filtro utilizando la forma directa II transpuesta:
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
Preparación del entorno.
Descarga y descomprime el archivo de recursos
lab5en tu espacio de trabajo.Los archivos
ejercicos.hyejercicos.cque incluyen el código del filtro están ubicados en la carpetasrc.Configuración del proyecto.
Abre el proyecto lab5.
- Selecciona el target
Test_filtro, que utiliza un simuladorpara la depuración del código. Esto permite desarrollar y validar el software sin necesidad de disponer del hardware físico.
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 archivotest/test_filtro.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 globales:
g_inputsample: muestra de entrada.
g_outputsample: muestra de salida (filtrada).
- Ejecuta la aplicación
y corrige cualquier error funcional hasta que la
función
iir_filtro_df2tcumpla con la especificación deseada.Test y Resultados esperados.
El fichero
test/test_filtro.cincluye los siguientes casos de prueba:
Test1: respuesta impulsional del filtro:
Test2: respuesta escalón del filtro.
Test3: filtrado de una señal senoidal de frecuencia 600 Hz.
Test4: filtrado de una señal senoidal de frecuencia 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):
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”.
y abre la herramienta
y corrige cualquier error funcional hasta que la