En las redes de transporte de Internet, para poder enviar grandes cantidades de información se utilizan unos protocolos especiales. Uno de ellos es SDH.

Synchronous Digital Hierarchy (SDH)

Una trama de SDH tiene una duración de 125 μs. Dentro de estos 125 μs se puede añadir información de muchos tributarios (usuarios). El número de tributarios que es posible añadir está estandarizado, de manera que las tasas binarias en SDH son:

Tasa binaria SDH Interfaz óptico Tasa binaria
STM-1 OC-3 155 Mbps
STM-4 OC-12 622 Mbps
SMT-16 OC-48 2.5 Gbps
STM-64 OC-192 10 Gbps
STM-256 OC-768 40 Gbps

Capas SDH

En el protocolo SDH existen 4 capas:

  1. Path Layer: establece conexiones end-to-end.
  2. Multiplex Section Layer: tareas de multiplexado, sincronización y protección.
  3. Regeneration Section Layer: genera las tramas y mantenimiento de la sección. Introduce o extrae los Virtual Containers.
  4. Photonic Layer: interfaz óptico por donde viaja la información

sdh_layerLas tramas de 125 μs están construidas por el contenedor básico llamado STM (Synchronous Transport Module), en el que cada uno equivale a 64 kbps.

stm

El STM-1 tiene una tasa binaria de:
\[270 \cdot 1 \cdot 9 \cdot 64~kbps = 155~Mbps\]
El STM-4:
\[270 \cdot 4 \cdot 9 \cdot 64~kbps = 622~kbps\]
La trama SDH está formada por la cabecera y la payload.
trama
Cabecera

  • Puntero con información de señalización y monitorización.
  • Información APS (Automatic Protection Switching).
  • Información sobre la estructura de la traba

Payload

También tiene una cabecera para señalización y medida de errores.
El container es la unidad básica de empaquetamiento.
Cabecera (llamada POH) + Container = Virtual Container
Los VC pueden ser de orden alto (alta velocidad) o de orden bajo (baja velocidad).
Hay containers de diferente tamaño que se tienen que encajar dentro del espacio de la payload (C2, C12, C11).
Los VC pueden ser creados por elementos no bien sincronizados, por lo que no se podrán añadir a tiempo dentro de la trama STM.

La cabecera estaba formada por un hueco llamado pointer. Este puntero se rellena con información que junto con un VC forma la unidad administrativa.
Todo el bloque de puntero + Todas las unidades administrativas = Grupo de unidad administrativa
¿Qué pasa con el tráfico de baja velocidad? ¿Cómo se puede poner dentro de la trama STM?
Con unidades tributarias = puntero + VC de bajo orden.
Varias unidades tributarias generan un grupo de unidades tributarias.

La unidad tributaria es igual que la unidad administrativa pero más pequeña. Son de VC de bajo orden.

Por orden de tamaño ascendente:

  1. Container
  2. Virtual container (VC): POH + C-n
  3. Unidad tributaria (TU): puntero + VC de bajo orden
  4. Unidad administrativa (AU): puntero + VC de alto orden
  5. Grupo de unidades tributarias (TUG): n · TU
  6. Grupo de unidades administrativas (AUG): n · AU
  7. STM-N: SOH + AUG

sdh_2

Generic Frame Procedure (GFP)
Para poder añadir información de diferentes protoclos (Ethernet, Fibre Channel, …) en una trama SDH se utiliza un procedimiento de entramado genérico. De esta manera SDH puede transportar cualquier protocolo sin importar su procedencia.
Concatenación SDH

Cuando se quiere transportar información mayor que la unidad básica, se pueden combinar varios contenedores. Por ejemplo añadir 599.04 Mbps utilizando 4 VC-4c. Sin embargo, de esta manera se desperdicia mucho espacio. Por eso, dos contenedores se enlazan mediante código y no físicamente contiguos. Esto se conoce como Virtual Concatenation Group (VCG).

Existe un método conocido como Link Capacity Adjustment Scheme (LCAS) que varía dinámicamente el ancho de banda de los contenedores de una concatenación virtual sin afectar al servicio.

Optical Transport Network (OTN)

Es un protocola (más bajo que SDH) para interconectar distintas redes de transporte. Al principio, cada fabricante lo hacía de manera diferente y por tanto no se podían interconectar entre sí.

OTN Tasa binaria Equivalente SDH
OTU-1 2.5 Gbps STM-16
OTU-2 10 Gbps STM-64
OTU-3 40 Gbps STM-256
OTU-4 100 Gbps

Esquemas de protección

En SDH, el tiempo máximo de recuperación por un fallo del sistema sin afectar al funcionamiento de este es de 60 ms: 50 ms para la conmutación de protección y 10 ms para detectar el fallo.

Conceptos básicos
Tipos de protección

  • Protección dedicada: cada conexión activa tiene asignado su propio ancho de banda para reencaminar el tráfico en caso de fallo.
  • Protección compartida: un ancho de banda de protección para múltiples conexiones activas.

También pueden considerarse:

  • No reversibles: la conmutación de vuelta al camino activo original una vez se ha reparado un fallo es manual
  • Reversibles: cuando se detecta que el falo ha sido reparado, se conmuta automáticamente a la fibra original.

Otras taxonomías:
tax
a) Uso normal b) Unidireccional c) Bidireccional

Para notificar fallos en la red se utiliza el protocolo APS (Automatic Protection Switching).

Tipos de conmutación

conm

  1. Camino activo normal
  2. Conmutación de camino (path-switching): la conmutación de caminos se hace a nivel de path, de manera que la conexión se establece por un camino alternativo de punto a punto.
  3. Span protection: existe un camino replicado y paralelo al que ha dejado de funcionar.
  4. Conmutación de anillo. Solo se redirecciona en los nodos cuyo enlace no funciona. A diferencia del path-switching, este reencaminamiento no es punto a punto, sino que solo se da en el momento en el que el siguiente enlace no funciona.

1+1: el tráfico se transmite simultaneamente sobre dos fibras separadas.
1:1: hay 2 fibras pero el tráfico solo se envía por una. Se conmuta en caso de fallo y se notifica mediante APS (Automatic Protection Switching).
1:N: N fibras comparten un único camino de protección.

Anillos autoreparables, arquitecturas
SNCP: subnetwork connection protection
Anillo unidireccional. La fibra de protección se transmite en otro sentido. No necesita protocolo de señalización.

MS-SPRing: Multiplex Section Shared Protection Ring
El enrutamiento se realiza por el camino más corto. Hay 2 ó 4 fibras de protección.
Hay reutilización espacial: mientras la fibra auxiliar no falle, se puede aprovechar entre múltiples conexiones. Son anillos bidireccionales.

En MS-SPRing/4 hay 4 fibras. Si falla el enlace en una dirección hay una de reserva.
En MS-SPRing/2 hay 2 fibras. Cada una utiliza la mitad del ancho de banda. En caso de fallo todo el tráfico va por la otra (los dos sentidos de transmisión por la misma fibra).

A la hora de conformar una vocal, las cuerdas vocales vibran, produciendo una vibración en el aire en forma de tren de pulsos. A su vez, este tren de pulsos pasa a través del tracto vocal, el cual, dependiendo del fonema que se ha pronunciado actuará como un filtro y modificará las componentes frecuenciales del tren de pulsos.

reconPara cada fonema, el filtro resultante del tracto vocal es diferente. Mientras hablamos, el responsable de que una palabra o un fonema suene de una manera particular es el tracto vocal. Se puede ver un ejemplo intentando decir ‘Hola’ con la boca cerrada o sin mover la boca. Aunque las cuerdas vocales vibran de la misma manera que lo hacen cuando la boca está abierta, no se entiende bien.

Por tanto, en reconocimiento de voz es interesante poder extraer características del tracto vocal, que corresponde a la forma de la envolvente del sonido visto desde el punto de vista frecuencial. Entonces, ¿cómo extraemos la envolvente? Utilizando el análisis cepstral.

Análisis cepstral

El cepstrum de una señal es el resultado de calcular la transformada de Fourier (FT, del inglés Fourier Transform) del espectro de la señal estudiada en escala logarítmica (dB). El nombre cepstrum deriva de invertir las cuatro primeras letras de spectrum. El cepstrum puede ser visto como una información del ritmo de cambio de las diferentes bandas de un espectro.

Wikipedia

El cepstrum o análisis cepstral aplicado a una voz equivale a:
La voz \(V\left(f\right) = P \left(f \right) \cdot T\left( f \right)\), donde \(P \left(f \right)\) son las componentes frecuenciales producidas por las cuerdas vocales y \(T \left(f \right)\) es el filtro equivalente del tracto vocal.
Si aplicamos logaritmo a \(V\left( f\right)\), tenemos \(\log{\left[ V\left( f \right) \right]} = \log{\left[ P\left( f \right) \right]} + \log{\left[ T\left( t \right) \right]}\)

La transformada de Fourier de \(T\left( f \right)\) tiene bajas frecuencias. Por otra parte, la transformada de Fourier de \(P\left( f \right)\) contiene altas frecuencias.
De esta manera, si volvemos a hacer la transformada de Fourier de \(V\left( f \right)\) y nos quedamos solo con las bajas frecuencias, habremos eliminado la componente de \(P\left( f \right)\) y tendremos solo la información de \(T\left( f \right)\). Hay que pensar en el concepto de Transformada de Fourier de la Transformada de Fourier \(\left(FFT\left\{ FFT \left\{ x \right\} \right\} \right)\).

Sin embargo, en audio no se utiliza exactamente de esta manera, si no que además se aplica un banco de filtros Mel y se utiliza como segunda transformada la DCT en lugar de la transformada de Fourier debido a sus propiedades de compresión de información (consigue concentrar la mayor parte de la información en pocos coeficientes). Es por ello que en la extracción de parámetros para reconocimiento de voz se utilizan los Mel Frequency Cepstral Coefficients (MFCC).

Mel Frequency Cepstral Coefficients (MFCC)

Para empezar a extraer los parámetros MFCC de un archivo de audio, el audio se enventana. En lugar de extraer los parámetros MFCC de una pieza de 1 segundo (que podría ser aproximadamente la duración de una palabra), se extraen los MFCC de segmentos de 25 ms. La ventana es una ventana de tipo Hanning o Hamming para evitar los armónicos artificiales que aparecen al utilizar ventanas cuadradas. Cada ventana se desplaza 10 ms en tiempo, por lo que existe una superposición entre una ventana y otra.Enventanado MFCC

  1. A cada una de estas ventanas se aplica la FFT.
  2. A la FFT de cada ventana se le aplica el banco de filtros MEL.
  3. Se calcula el logaritmo
  4. Se hace la transformada discreta del coseno (DCT)
  5. Nos quedamos con los N primeros coeficientes (baja frecuencia). Normalmente 12 coeficientes. O también 12 para bajas frecuencias y 1 para la energía media de la ventana.

Como ya habíamos dicho la diferencia entre los cepstrum y los MFCC, es que una vez hecho la FFT en el paso 1, se filtra mediante los filtros MEL y en lugar de aplicar en el paso 4 otra vez una FFT, se aplica la DCT .

Cabe destacar que en reconocimiento de voz no se reconocen fonemas sino palabras. Por tanto, para un archivo de audio de 1 segundo, tendremos \(\frac{1~seg-25~ms}{10~ms} = 97.5 \approx 98\)

parámetros MFCC \(\left( \left\{p_1, p_2, …, p_m \right\} \right)\) y cada parámetro MFCC contendrá N elementos \(\left( p_m = \left\{c_1, c_2, …, c_N \right\} \right)\).

Función para la extracción de MFCC en MATLAB de Kamil Wojcicki

Parámetros típicos de la función mfcc.m:

Si la señal por ejemplo está grabada a 16 kHz, tiene componentes frcuenciales hasta 8 kHz. 7 kHz como frecuencia superior máxima es una buena elección para no tener en cuenta las frecuencias próximas a Nyquist que suelen verse atenuadas y porque hasta 7 kHz hay suficiente información de voz. Por debajo se puede limitar a 50 Hz, dado que la voz humana no tiene apenas información por debajo y así se puede evitar ruidos.

Tw = 25;                % analysis frame duration (ms)
Ts = 10;                % analysis frame shift (ms)
alpha = 0.97;           % preemphasis coefficient
M = 23;                 % number of filterbank channels
C = 12;                 % number of cepstral coefficients
L = 22;                 % cepstral sine lifter parameter
LF = 50;                % lower frequency limit (Hz)
HF = 7000;              % upper frequency limit (Hz)
ia-with-three-oa
Amplificador de instrumentación con 3 AO

Esta disposición de AI se puede separar en dos etapas:

Etapa 1stage-1Por superposición y haciendo el KCL:
\(\)
\[ V_{in_1} = 0 \]
\[R_3 + \alpha R_4 = R_G\]
\[ \frac{V_{in_2}-V_B}{R_5} = \frac{0-V_{in_2}}{R_G}\]
\[V_{in_2}R_G -V_B R_G =-V_{in_2}R_5\]
\[V_B = \left( 1 + \frac{R_5}{R_G} \right) V_{in_2}\]
\[\frac{0 – V_{in_2}}{R_G} + \frac{0 – V_A}{R_2} = 0\]
\[V_A = – \frac{R_2}{R_G}V_{in_2}\]

Ahora con \(V_{in_2} = 0\),

\[\frac{V_{in_1}-0}{R_G} = \frac{0-V_B}{R_5} \]
\[V_{in_1}R_5 =-V_B R_G\]
\[V_B =-\frac{R_5}{R_G}V_{in_1}\]
\[\frac{0 – V_{in_2}}{R_G} + \frac{0 – V_A}{R_2} = 0 \]
\[V_A = \left( 1 + \frac{R_2}{R_G} \right) V_{in_1} \]
Por lo que finalmente, tenemos que:
\[V_A = \left( 1 + \frac{R_2}{R_G} \right) V_{in_1} – \frac{R_2}{R_G}V_{in_2} \]
\[V_B = \left( 1 + \frac{R_5}{R_G} \right) V_{in_2} -\frac{R_5}{R_G}V_{in_1} \]
En cuanto a la ganancia en modo común de esta etapa, la podemos calcular haciendo \(V_{in_1} = V_{in_2}\). De esta manera,
\[V_A = \left( 1 + \frac{R_2}{R_G} \right) V_{in_1} – \frac{R_2}{R_G} V_{in_1} = V_{in_1}\]
\[V_B = \left( 1 + \frac{R_5}{R_G} \right) V_{in_1} -\frac{R_5}{R_G}V_{in_1} = V_{in_1}\]
Por tanto, sea cual sea el valor de \(R_2\), \(R_5\) y \(R_G\), la tensión en modo común pasa a los nodos \(V_A\) y \(V_B\).

La otra etapa restante es:
De nuevo, aplicando superposición podemos llegar a la expresión final de la salida.
\[V_{out} = – \frac{R_9}{R_1} V_A + \left(1 + \frac{R_9}{R_1} \right) \frac{\beta R_8 + R_7 }{ \beta R_8 + R_7 + R_6} V_B \]
\[V_{out} = – \frac{R_9}{R_1} \left[ \left( 1 + \frac{R_2}{R_G } \right) V_{in_1} – \frac{R_2}{R_G }V_{in_2} \right]+ \left(1 + \frac{R_9}{R_1} \right) \frac{\beta R_8 + R_7 }{ \beta R_8 + R_7 + R_6} \left[ \left( 1 + \frac{R_5}{R_G} \right) V_{in_2} -\frac{R_5}{R_G}V_{in_1} \right] \]

Para calcular la ganancia en modo común de esta etapa vamos a aplicar una tensión igual en las dos entradas diferenciales. Por tanto \(V_A = V_B = V_{CM}\). Así conseguimos la siguiente expresión para la tensión de salida.
\[V_{out} = – \frac{R_9}{R_1} V_{CM} + \left(1 + \frac{R_9}{R_1} \right) \frac{\beta R_8 + R_7 }{ \beta R_8 + R_7 + R_6} V_{CM} \]
También identificaremos \(R_{ref} = \beta R_8 + R_7\) para facilitar las operaciones.
\[V_{out} = – \frac{R_9}{R_1} V_{CM} + \left(1 + \frac{R_9}{R_1} \right) \frac{R_{ref}}{R_{ref}+ R_6} V_{CM} \]
Idealmente, querríamos que esta tensión fuese igual a 0, de manera que el amplificador de instrumentación pudiese rechazar completamente para poder, por ejemplo, eliminar el ruido acoplado en ambas entradas tal y como puede verse en la figura.

CMRR

\[V_{out} = – \frac{R_9}{R_1} V_{CM} + \left(1 + \frac{R_9}{R_1} \right) \frac{R_{ref}}{R_{ref}+ R_6} V_{CM} \]
\[G_{cm} = \frac{V_{out}}{V_{CM} } = – \frac{R_9}{R_1} + \left(1 + \frac{R_9}{R_1} \right) \frac{R_{ref}}{R_{ref}+ R_6} \]
\[G_{cm} = \frac{R_{ref}}{R_{ref}+R_6} – \frac{R_9 R_6}{R_1 R_{ref} + R_1 R_6} \]
Por tanto, resolviendo la ecuación de ganancia en modo común igual a 0, \(G_{cm} = 0\), tenemos que
\[- \frac{R_9}{R_1} + \left(1 + \frac{R_9}{R_1} \right) \frac{R_{ref}}{R_{ref}+ R_6} = 0\]
Ecuación que podemos identificar de la siguiente manera:
\[A = \frac{R_9}{R_1}\]
\[ B =\frac{R_{ref}}{R_{ref}+ R_6}\]
\[ – A + \left(1 + A \right) B = 0 \]
\[-A + B + AB = 0 \]
\[\left( B -1 \right) A = -B \]
\[ A = \frac{-B}{B-1} = \frac{B}{1-B} \]
\[A = \frac{\frac{R_{ref}}{R_{ref}+ R_6}}{1-\frac{R_{ref}}{R_{ref}+ R_6}} = \frac{R_{ref}}{R_6} \]
\[\frac{R_9}{R_1} = \frac{R_{ref}}{R_6} \]
Por tanto, para tener una ganacia en modo común de 0 (o lo que es lo mismo un CMRR\( = \infty\)), \(R_9 = R_{ref}\) y \(R_{1} = R_6\)

Por otra parte, si queremos que \(V_A = V_B\) cuando \(V_{in_1} = V_{in_2}\), necesitamos que se cumpla la siguiente relación entre las resistencias \(R_2\) y \(R_5\).
\[ V_A = V_B \left( 1 + \frac{R_2}{R_G} \right) V_{in_1} – \frac{R_2}{R_G}V_{in_2} = \left( 1 + \frac{R_5}{R_G} \right) V_{in_2} -\frac{R_5}{R_G}V_{in_1} \left( 1 + \frac{R_2}{R_G} \right) – \frac{R_2}{R_G} = \left( 1 + \frac{R_5}{R_G} \right) -\frac{R_5}{R_G} \]
Por simple inspección se llega a la conclusión de que \(R_2 = R_5\).

Por último, podemos calcular la ganancia diferencial y la ganancia de modo común de otro modo. Si definimos la tensión diferencial como \(V_d = V_{in_1}- V_{in_2}\) y la tensión en modo común como \(V_c = \frac{V_{in_1} + V_{in_2}}{2}\), sustituimos en la expresión de \(V_o\) e identificamos la expresión resultante como \(V_o = G_d V_d + G_c V_c\), en la que \(G_d\) es la ganancia diferencial y \(G_c\) es la ganancia en modo común (la misma que hemos calculado arriba, obtenemos que \(G_d\) es igual a:
\[ G_d = \frac{-2 R_9 R_G R_{ref} – R_9 R_G R_6 – 2 R_9 R_2 R_{ref} -2 R_9 R_2 R_6 – R_{ref}R_1 R_G – 2 R_1 R_5 R_{ref} – 2 R_9 R_{ref} R_5}{2R_1 R_G \left( R_{ref} + R_6 \right) } \]
En caso de tener las resistencias balanceadas, la expresión de la ganancia diferencial se simplifica a:
\[G_d = -\frac{R_G^2}{R_1 \left( R_9 + R_1 \right)} – \frac{R_9}{2 \left( R_9 + R_1\right)} – \frac{R_9 R_2}{R_G \left( R_9 + R_1 \right)} – \frac{R_9}{2 \left( R_9+ R_1 \right)} – \frac{R_2 R_9}{R_G \left( R_9+ R_1 \right)} – \\ \frac{R_9^2 R_2}{R_1 R_G \left( R_9 + R_1 \right)} \]

Conclusiones

Este amplificador de instrumentación es muy utilizado para amplificar salidas de sensores y demás aplicaciones de instrumentación. Sus ventajas residen en que si está balanceado se puede conseguir tener una ganancia de modo común baja (o CMRR alto) a la vez que se mantiene una ganancia ajustable a través de \(R_G = R_3 + \alpha R_4\). Por último, también podemos ver como la impedancia de entrada de este amplificador es muy alta, ya que ambas entradas son las entradas de un AO.
\[V_{out} = – \frac{R_9}{R_1} \left[ \left( 1 + \frac{R_2}{R_G } \right) V_{in_1} – \frac{R_2}{R_G }V_{in_2} \right]+\left(1 + \frac{R_9}{R_1} \right) \frac{R_{ref} }{R_{ref} + R_6} \left[ \left( 1 + \frac{R_5}{R_G} \right) V_{in_2} -\frac{R_5}{R_G}V_{in_1} \right] \]
\[G_d = \frac{-2 R_9 R_G R_{ref} – R_9 R_G R_6 – 2 R_9 R_2 R_{ref} -2 R_9 R_2 R_6 – R_{ref}R_1 R_G – 2 R_1 R_5 R_{ref} – 2 R_9 R_{ref} R_5}{2R_1 R_G \left( R_{ref} + R_6 \right)} \]
\[G_{cm} = \frac{R_{ref}}{R_{ref}+R_6} – \frac{R_9 R_6}{R_1 R_{ref} + R_1 R_6} \]

Enlaces a CircuitLab para simulación



En anteriores entradas he hablado del ESP8266, de cómo configurarlo y cómo introducirnos un poco en el amplio espectro de posibilidades que este pequeño chip nos brinda. No obstante, en la documentación que he publicado falta una parte importante, y esta es la de hardware.

Dado que el pinout del ESP-01 no es apto para conectarlo a una protoboard (a no ser que quieras cortocircuitarlo) decidí hacer un pequeño adaptador para conectar el programador serie (FTDI) y la alimentación, así como añadir un jumper para iniciar el chip en modo programación.

Para ello he utilizado:

  • Tira doble de cuatro pines hembra (o dos tiras simples de cuatro pines hembra), para la conexión del ESP.
  • Tira de 6 pines macho, para la conexión del ESP y salidas de GPIO.
  • Tira de 2 pines hembra, para alimentación.
  • Dos pilas AAA (1.5V cada una)

Estos son los distintos pines disponibles en el ESP-01:

pinout
ESP-01 pinout

Las conexiones que he hecho en mi adaptador son las siguientes:

 

esp-conn
Conexiones adaptador

 

El número de pines corresponde al de los pines del ESP.

El resultado final es este:

programador
Adaptador ESP-01

También decir que la alimentación que utilizo son dos pilas AAA conectadas en serie soldadas (podéis utilizar un portapilas, pero si no tenéis uno, esta opción también puede funcionar):

power
Alimentación a 3V

Mobile IP es un estándar de protocolo comunicación diseñado para permitir a usuarios de dispositivos móviles moverse entre redes manteniendo la misma dirección IP.

Se definen dos tipos de movilidad:

  1. Macro movilidad: el desplazamiento de un móvil se produce entre dos dominios de redes diferentes.
  2. Micro movilidad: el desplazamiento de un móvil se produce entre dos subredes de un mismo dominio administrativo.

Mobile IP está definida en el marco de macro movilidad.

En el estándar Mobile IP se añaden tres nuevas entidades funcionales:

  1. Mobile Node (MN): terminal que cambia de ubicación.
  2. Home Agent (HA): router de la home network que coge los datagramas destinados al Mobile Node y los entrega a través de la care-of address. También almacena información sobre la posición actual del MN.
  3. Foreign Agent (FA): router de una red visitada que ofrece servicios de enrutado al MN mientras el MN es registrado.

MIPMobile IP permite enrutar datagramas IP independientemente de la localización del dispositivo. Cada Mobile Node (MN) es identificado por su Home Address sin importar su ubicación. Mientras está fuera de la home network, se asocia una care-of address al MN que identifica su ubicación actual y la Home Address a la cual está asociado el extremo del tunel de encapsulamiento que conecta con el Home Agent.

En Mobile IP (MIP) se utilizan dos tipos de IP: estáticas y dinámicas.

La estática es la Home Address la que le proporciona la Home Network al dispositivo. Es la IP que siempre va a tener aun cuando el dispositivo salga de la Home Network, por tanto la dirección IP permanente.

La dinámica es la care-of address, la cual es proporcionada por la Foreign Network (FN) de manera que el Home Agent pueda seguir comunicándose con el dispositivo, por tanto la dirección IP temporal.

Por tanto recapitulando, el MN tiene una IP que lo identifica en internet: la Home Address. Sin embargo, cuando el MN cambia a una red externa a la cual tenía asociada la Home Address se le tiene que asignar una IP provisional que le permita al Home Agent reenviarle los datagramas IP que el MN tiene que recibir o transmitir. Por tanto, el Foreign Agent al cual está conectado le proporciona una care-of address. Con esta care-of address el MN se comunica directamente (mediante un encapsulamiento tunel) con el Home Agent. De esta manera, aun cuando el dispositivo no está conectado en la red original se simula que la dirección IP del MN no ha cambiado, ya que el Home Agent está haciendo de proxy.

Otro forma es que no exista exista el Foreign Agent, de manera que el túnel se establece directamente entre el MN y el HA. De esta manera el MN se le asigna una co-located care-of address.Mobile IP

 

Modo de funcionamiento

  1. El MN es el encargado de descubrir si está conectado a su Home Network o se ha movido a una Foreign Network. No son los únicos responsables en este proceso sino que también intervienen la Foreign Agent y el Home Agent. Este proceso se denomina Agent Discovery. Para esto se utiliza una extensión del protocolo ICMP.
  2. El siguiente paso es registrarse en la Foreign Network para obtener la care-of address. Este proceso intervienen tanto el MN, el FA así como el HA, que debe conocer la care-of address del MN registrado es un Home Network. El proceso de registro está formado por dos mensajes, una petición de registro y una respuesta a la petición. De esta manera se informa al HA de la CoA del MN.
  3. Una vez ya están las direcciones asignadas se puede transferir información a través del túnel que conecta el Home Agent y el Foreign Agent.

perfm

Proceso de registro
Proceso de registro

Si el túnel IP solo es unidireccional se crea un problema en el que hay un enrutado triangular que no permite que la IP del Mobile Node sea la misma para recibir que para transmitir. Haciendo el túnel bidireccional se soluciona el problema.

ip_triangular_problemtriangular_problem_solution

Proceso completo de Agent Discovery, Registro y transferencia de datos
Proceso completo de Agent Discovery, Registro y transferencia de datos

Algunas desventajas del Mobile IP es que es necesario incorporar el nodo de Foreign Agent en todas las redes visitadas. También sobrecarga la red al necesitar de peticiones constantes si el MN se mueve. Otra desventaja es que es necesario implementar procesos de autentificación entre el MN y el FA y entre el FA y el HA.

En GPRS y UMTS (2.5G y 3G), GGSN (Gateway GPRS Support Node) actúa como Home Agent y el SGSN (Serving GPRS Support Node) actúa como Foreign Agent.

En 4G el P-GW (Packet data network Gateway) actúa como Home Agent y el SGW (Serving Gateway) actúa como Foreign Agent.

Mobile IPv6

Hasta ahora, todo lo referente a Mobile IP aplicaba para IPv4. Para Mobile IPv6 existen ciertas diferencias.

Por ejemplo, en Mobile IPv6 no existe la entidad de Foreign Agent (FA) ya que ha sido sustituida por el Access Router (AR).

En IPv6 existen 3 entidades funcionales, el Home Agent (HA), el Mobile Node (MN) y el Correspondent Node (CN) que es la dirección de destino de los datos.

En IPv6 el Home Agent sigue haciendo de proxy para evitar el problema del tunelado triangular que hemos explicado anteriormente.

Sin embargo, existe un modo de operación llamado Route Optimization que establece un tunel directo entre el MN alojado en una Visited Network y el CN sin pasar por el Home Agent.

mipv6

En el protocolo OSPF se utilizan diferentes tipos de mensaje para informar a los routers de la composición de la red. Existen 5 tiempos diferentes de paquetes y cada uno de ellos tiene una función diferente:

  • Paquetes hello [Tipo 1]: se utilizan para comunicar a los routers adyacentes de la propia existencia. De esta manera, los routers conocen qué vecinos tienen, por lo que son la base para el intercambio de datos de enrutamiento en OSPF.
  • Paquetes de descripción de la base de datos [Tipo 2]: se utiliza para describir  el contenido de la base de datos de cada router. Sin embargo, no transporta la información que ella contiene.
  • Paquetes de solicitud del estado del enlace [Tipo 3]: se utiliza para solicitar fragmentos específicos de la base de datos del estado del enlace del router vecino. Después de recibir un actualización de la descripción de la base de datos de un vecino, es posible que un router descubra que la información del vecino es más nueva o más completa que la que el mismo posee. Para pedirle al router vecino que se la dé, se utiliza un paquete de solicitud del estado del enlace.
  • Paquete de actualización del estado del enlace [Tipo 3]: se utilizan para transportar realmente los datos de los estados del enlace a los routers vecinos. Exiten 5 tipos de paquetes:
    • LSA de router o Router Link (RL) [Tipo 1]: describen el estado de un interfaz de un router dentro de su área. Cada router genera un aviso de este tipo por cada enlace que tenga.
    • LSA de red o Network Link (NL) [Tipo 2]: es similar a un LSA de router, en la que se informa del coste y el estado del enlace para todos los routers conectados a la red, con la diferencia de que la información del LSA de red es un resumen de toda la información del estado del enlace y coste de la red (LAN) y no solo de sus vecinos. Solo el router designado (DR) puede generarla y seguirla.
    • LSA de resumen-red IP o Summary Link (SL) [Tipo 3]: se utiliza para describir información de alcanzabilidad de redes de otras áreas del mismo sistema autónomo (AS). Son generados por los router fronterizos (Area Border Router, ABR) del área y se transmiten hacia otras áreas. Sirven también para indicar la ubicación del Autonomous System Border Router (ASBR), el cual conecta el sistema autónomo con otro AS externo.
    • LSA de resumen-router límite de sistema autónomo [Tipo 4]: la diferencia entre la LSA de Tipo 3 y la LSA de Tipo 4 es que la LSA de Tipo 3 describre rutas entre áreas y la LSA de Tipo 4 describe rutas que son externas a la red OSPF.
    • LSA de AS externo o External Link (EL) [Tipo 5]: son generados por los ASBR en su AS y hacia otros AS y difundidas por el ASBR dentro del área 0 a través de todas las áreas OSPF a las que pertenece. Sirven para describir información de alcanzabilidad de destinos fuera del propio AS. Estos destinos pueden ser hosts específicos o direcciones de red externas.

Como vemos, el protocolo OSPF es altamente complejo y requiere una cantidad considerable de mensajes para su correcto funcionamiento.

Microsoft Access es un buen programa para gestionar bases de datos ya que nos permite crear fácilmente front-ends. Sin embargo, el mayor problema del que adolece es la inexistencia de una manera sencilla de compartir la base de datos con la que trabaja MS Access.

Para solucionar este problema, es posible crear una base de datos en MySQL y conectarla con MS Access, de manera que sea accesible por más de un usuario y evitar que se corrompa con facilidad. Una de las maneras que se podría implementar es contratando un servidor (Strato, One&One, etc…), pero abrir los puertos de MySQL a cualquier es potencialmente peligroso para el servidor. Por ello, intenté buscar otra solución, y esta es tener un servidor solo accesible desde una red local, por lo que los posibles atacantes no puedan acceder al servidor de ninguna manera.

La manera más sencilla y barata de montar un servidor en casa es utilizando una Raspberry Pi, en la que instalaremos el sistema operativo Raspbian y sobre el cual vamos a hacer las siguientes configuraciones.

Para empezar, necesitamos conectarnos con la Raspberry mediante SSH, por lo que necesitaremos conocer cuál es su dirección IP dentro de la red. Existe una utilidad para Linux llamada arp-scan con la que podremos ver las direcciones IP de todos los dispositivos de la red:

sudo arp-scan --localnet -interface=wlan0

Una vez hayamos localizado nuestra Raspberry y nos hayamos conectado con ella mediante SSH, hay que configurar la asignación de IP’s para estar seguros de que la dirección no va a cambiar cada vez que la enchufemos. Existen cientos de tutoriales que explican cómo hacerlo, por lo que no lo explicaré.

Una vez ya tengamos la Raspberry con una IP estática, vamos a montar el servidor MySQL.

sudo apt-get install mysql-server mysql-client libmysqlclient-dev

Esto requerirá 11.6 MB para archivos + 99.4 MB de espacio adicional. Durante la instalación nos pedirá que introduzcamos la contraseña para el usuario root de MySQL.

Una vez esté instalado vamos a acceder a MySQL de escribiendo el comando:

mysql -u root -p

Una vez estemos en el shell de MySQL, tan solo tendremos que crear la base de datos que queramos:

CREATE DATABASE database_name

Alternativamente, si lo que queremos es importar una base de datos previamente creada, podemos hacer login en MySQL de la siguiente manera:

mysql -u root -p database_name < /path/to/database.sql

Para comprobar que la base de datos se ha creado correctamente, lo más sencillo y cómodo es verlo mediante PHPMyAdmin. Para instarlo:

sudo apt-get install phpmyadmin
sudo php5enmod mcrypt
sudo service apache2 restart

Cuando esté todo configurado e instalado, podemos acceder a PHPMyAdmin poniendo en el navegador la direccion: ip-raspberry/phpmyadmin (e.g. 192.168.1.23/phpmyadmin)

Ahora ya solo queda utilizar la utilidad de MySQL llamada ODBC Driver (Open Data Base Connector) para enlazar la base de datos de MS Access con la que acabamos de crear en MySQL. Para ello podéis seguir los pasos que explican desde la web oficial.

La comunicación I2C es muy útil a la hora de comunicarse con dispositivos de un mismo circuito. Con esta entrada quiero dar un poco de luz a este protocolo que pese a su sencillez es un auténtico misterio a la hora de implementarlo.

Cabe destacar que, atendiendo a la definición del protocolo, la dirección del slave es de 7 bits (del bit 7 al 1). De esta manera el bit 0 se utiliza para decirle al slave si el master quiere leer (bit 0 = 1) o quiere escribir (bit 0 = 1). Es por eso que en el código se utilizan dos direcciones diferentes en función de si se quiere leer o escribir.

El master escribe continuamente “Saludos desde el Master” y después lee 23 bytes del Slave, que devuelve “Por el Slave todo bien”.
Para poder cambiar el número de bytes para leer o escribir desde el master hay que cambiar las variables n_read y n_write. (Si sabéis de algún método mejor, soy todo oídos). La implementación utiliza el propio hardware del PIC (en este caso el PIC16F877) aunque se podría haber hecho mediante software y haber utilizado cualquier pin del procesador. En este caso habría que añadir la opción FORCE_SW en la inicialización del I2C.
NOTA: Solo se puede implementar I2C por software para el master. Para el Slave debe de ser forzosamente hardware.
El código para el master es:


#include "16F877.h"
#device ADC=16
 
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
 
#use delay(crystal=14745600)
#use rs232(baud=115200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=PORT1)
#use i2c(Master,Fast,sda=PIN_C4,scl=PIN_C3)
 
#define SLAVE_WRITE_ADDR 0xA0
#define SLAVE_READ_ADDR 0xA1
 
void write_slave(int address, int *buffer, int n_read){
   int n_byte = 0;
   i2c_start();
   i2c_write(address);
   for(n_byte = 0;n_byte<n_read;n_byte++)
      i2c_write(buffer[n_byte]);
   i2c_stop();
}
 
void read_slave(int address, int *buffer, int n_read){
   int n_byte = 0;
   i2c_start();
   i2c_write(address);
   for(n_byte = 0;n_byte<n_read-1;n_byte++)
      buffer[n_byte] = i2c_read();
   buffer[n_byte] = i2c_read(0);
   i2c_stop();
}
 
void print_buffer(int *buffer, int length){
   int n_byte;
   for(n_byte = 0;n_byte<length;n_byte++)
         printf("%c",buffer[n_byte]);
    printf("\r\n");
}
 
void main(){
   int n_read=23,n_write = 23;
   int writeBuffer[] = {0x53,0x61,0x6c,0x75,0x64,0x6f,0x73,0x20,0x64,0x65,0x73,0x64,0x65,0x20,0x65,0x6c,0x20,0x4d,0x61,0x73,0x74,0x65,0x72}; //"Por el Slave todo bien"
   int readBuffer[23];
   printf("MASTER\r\n");
   while(TRUE){
      write_slave(SLAVE_WRITE_ADDR, writeBuffer, n_write);
      delay_ms(100);
      read_slave(SLAVE_READ_ADDR, readBuffer, n_read);
      print_buffer(readBuffer,n_read);
      delay_ms(100);
   }
}

El Slave lo único que hace es gestionar la llegada de paquetes I2C, tanto de escritura como de lectura. Para entender un poco más el código recomiendo leer la documentación del PIC C Compiler (CCS) (pulsando F1), donde explica con detalle las diferentes funciones que se utilizan.

Faltan añadir algunas mejores en el Slave para recibir un número flexible de bytes. Ahora solo imprime los datos por consola (RS232) cuando se envían el número exacto de bytes descritos en max_written.

El código del Slave es:

#include "16F877.h"
#fuses HS,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP
#device ADC=10
#use delay(clock=14745600)
#use rs232(baud=115200, xmit=PIN_C6, rcv=PIN_C7,ERRORS)
#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3,FAST=100000, address=0xA0,FORCE_HW) 
#use spi(DI=PIN_A0, DO=PIN_A1, CLK=PIN_A2, ENABLE=PIN_A3, BITS=16)
  
 int max_read = 23,max_written = 23;
 int writeBuffer[] = {0x50,0x6F,0x72,0x20,0x65,0x6C,0x20,0x53,0x6C,0x61,0x76,0x65,0x20,0x74,0x6F,0x64,0x6F,0x20,0x62,0x69,0x65,0x6E};
 
#int_SSP 
void i2c_interrupt() {
   int state;
   //Get state 
   int readBuffer[23]; 
   state = i2c_isr_state(); 
   if(state==0) //Address match received with R/W bit clear, perform i2c_read( ) to read the I2C address. 
      i2c_read(); 
 
   else if (state==0x80) //Address match received with R/W bit set; perform i2c_read( ) to read the I2C address, and use i2c_write( ) to pre-load the transmit buffer for the next transaction (next I2C read performed by master will read this byte). 
      i2c_read(2); 
 
   if(state>=0x80){ //Master is waiting for data    
      i2c_write(writeBuffer[state - 0x81]); //Write appropriate byte, based on how many have already been written 
      if ((state-0x80)==max_written){
         //printf("\nFull data sent\r\n");
      }
   } 
   else if(state>0){ //Master has sent data; read. 
      readBuffer[state - 1] = i2c_read(); //LSB first and MSB secound 
      if (state==max_read){ 
         for(int i = 0;i<max_read;i++)
            printf("%c",readBuffer[i]); 
         printf("\r\n");
      } 
   }
} 
 
void main() {
   enable_interrupts(INT_SSP);
   enable_interrupts(GLOBAL);
   printf("SLAVE\r\n");
   while(1){
 
   } 
}

El código ha sido depurado y probado utilizando Proteus 8, así que os aseguro que el código funciona, aunque si vais a copiar y pegarlo, os recomiendo que os hagáis vuestra propia cabecera y solo copiéis las funciones.

Captura de pantalla (8)

Podemos construir un filtro paso banda de muchas maneras, pero la mayoría se basan en el mismo concepto: un filtro paso alto + un filtro paso bajo. Si lo queremos hacer de primer orden, a parte de que no podremos tener amplificación, necesitaremos inductores, que suelen ser grandes, caros o con un poco de complejidad para construir. Sin embargo, si optamos por un filtro paso banda activo de segundo orden, solo necesitaremos un amplificador operacional, condensadores y resistencias. Existen varias tipologías de filtros paso banda activos, pero hay una en particular, con realimentación multiple que tiene la ventaja de conseguir factores de calidad Q relativamente altos (~25). Podéis revisar algunos conceptos básicos en la entrada de Filtros paso bajo.

Esquemático

La configuración del filtro paso banda con realimentación multiple es la siguiente:

multiple-feedback-band-pass-active-filter
Filtro paso banda activo con realimentación multiple

En el esquemático podemos identificar cuatro tensiones nodales \(v_{in}\), \(v_o\).

Análisis

Haciendo el KCL en \(v_x\) obtenemos la ecuación:
\[\left( v_{in} – v_{x} \right) G_1 – \left( v_x – v_n \right) sC_2 – \left(v_x – v_o \right)sC_1 = 0\]
Dado que tenemos realimentación negativa podemos realizar la hipotesis de que \(V_n = V_p = 0\), por lo que la ecuación resultante es:
\[v_{in} G_1 – v_{x} G_1 -v_x sC_2 -v_x sC_1 +v_o sC_1 = 0\]
Del mismo modo, haciendo el KCL en \(v_n\):

\[\left( v_{x} – v_{n} \right) s C_2 – \left( v_{n} – v_{0} \right) G_2 = 0\] \[v_{x} s C_2 + v_{0} G_2 = 0\] \[v_x = \frac{-v_o G_2}{s C_2}\]

Con estas dos ecuaciones tenemos completamente definido el circuito. Podemos escribirlo en forma matricial como:
\[\begin{bmatrix} G_1 + sC_2 + sC_1 & -sC_1\\ sC_2 & G_2 \end{bmatrix}\begin{bmatrix} v_x \\ v_o \end{bmatrix}=\begin{bmatrix} v_{in}G_1\\ 0 \end{bmatrix}\]
Por lo que finalmente podemos calcular la función de transferencia, que tiene la siguiente expresión:
\[H(s) = \frac{v_o}{v_{in}} = \frac{- s \frac{1}{R_1 C_1}}{s^2 + s \left( \frac{1}{C_1 R_2} + \frac{1}{C_2 R_2} \right) + \frac{1}{C_1 C_2 R_1 R_2}}\]
de la que identificando con la expresión genérica podemos extraer los valores de \(f_0\), BW y Q:

\[T(s) = \frac{K s \omega_0}{s^2 +\underbrace{ 2 \zeta \omega_0}_{BW(rad/s)} + \omega_0^2}\] \[f_0(Hz) = \frac{1}{2 \pi \sqrt{R_1 R_2 C_1 C_2}}\] \[BW(Hz) = \frac{1}{2\pi} \left( \frac{C_1 +C_2}{C_1 C_2 R_2} \right)\] \[Q = \frac{f_0}{BW}=\sqrt{\frac{C_1 C_2 R_2}{C_2}} \left( C_1 +C_2 \right)\]

Diseño

Vamos a diseñar un filtro paso banda con una frecuencia central de 800 Hz y un ancho de banda 200 Hz. Para ello, fijamos los valores de los condensadores a un valor razonable \(R_2\). Para ello podemos hacerlo a mano o utilizar MATLAB:

%  Calculo de R2
syms R2;
C1 = 100E-9;
C2 = 100E-9;
eqn = 1/(2*pi) * ((C1+C2)/(C1*C2*R2)) == 200
solR2 = solve(eqn,R2)
	solR2 = 1.5915e+04 
%  Calculo de R1
f0 = 800;
syms R1;
eqn2 = 1/(2*pi * sqrt(R1 * R2 * C1 * C2)) == 800;
solR1 = solve(eqn2, R1)
	solR1 = 248.6796

El valor calculado para \(R_1 = 248.67~\Omega\) y \(R_2 = 15~k\Omega\).

Evaluación

Vamos a comprobar que los valores escogidos son correctos. Para ello, podemos simular con MATLAB la función de transferencia y dibujar su diagrama de Bode o de una manera más rápida y sencilla, utilizar CircuitLab.

Si lo queremos hacer con MATLAB el procedimiento es el siguiente:

%  Calculamos la función de transferencia
T = tf([-1/(R1*C1) 0],[1 (1/(C1*R2)+1/(C2*R2)) 1/(C1*C2*R1*R2)]);
%  Generamos el eje de coordenadas
w = logspace(0,5, 10000);
%  Mostramos el diagrama de Bode de la función de transferencia
bodemag(T,w);
grid;

El resultado es el siguiente:

Diagrama de Bode del filtro paso banda con realimentación multiple
Diagrama de Bode del filtro paso banda con realimentación multiple

(Al hacer la gráfica, tened en cuenta que por defecto el eje de coordenadas está en radianes/s)

Como vemos el pico de resonancia está alrededor de los 800 Hz y tiene un ancho de banda aproximado de 200 Hz. Los valores no se ajustan perfectamente porque he elegido las resistencias comerciales y no son los valores exactos que deberían ser, pero la aproximación es bastante buena.

Si lo queremos simular con CircuitLab, tiene la ventaja de que también tiene en cuenta efectos no previstos por la función de transferencia al contemplar las no idealidades del amplificador de instrumentación que elijamos. El efecto más notorio que se puede observar es que la ganancia no es tan alta como la predicha por la función de transferencia en MATLAB. Podéis acceder al circuito desde CircuitLab

Diagrama de Bode de magnitud y fase con CircuitLab
Magnitud del diagrama de Bode de magnitud con CircuitLab
Diagrama de Bode de fase con CircuitLab
Fase del diagrama de Bode con CircuitLab