jueves, 11 de junio de 2015

¿Qué tiene dentro? El Condensador Electrolítico

Aquí uno de esos post que sirven para saciar la curiosidad de los "mente-inquieta", que gustan de conocer las interioridades de todo aquello que les rodea.

En esta ocasión algo pequeñito y sencillo a la vez, pero de vital importancia en la tecnología que nos acompaña cada a día en nuestro entorno, el condensador electrolítico.









Diagrama de Transición para números en Notación Científica (1.5e-10)

Si en el anterior post mostraba la expresión regular necesaria para representar patrones correspondientes a números expresados en notación científica, en esta ocasión quiero mostrar como sería el diagrama de transición necesario, para que un autómata sea capaz de analizarlo.

En la imagen siguiente podéis ver tanto el diagrama de transición como la expresión regular correspondiente:


Podríamos expresarlo con alguna variante, pero para entender el concepto general del diagrama de transición creo que es más que suficiente.

Expresión Regular para números en Notación Científica (1.5e-10)

No cabe duda que las expresiones regulares tienen un potencial de mucho valor a la hora de analizar textos, ya sea para marcado, búsqueda de patrones, o incluso la programación de un compilador, un analizador de frases, de expresiones matemáticas, etc.
 
En esta ocasión he tenido que echar mano de ellas para el análisis de textos matemáticos en los cuales aparecen números en Notación Científica (con exponentes del tipo 1.5E-10). Pues bien, una expresión regular que me está funcionando bastante bien es la siguiente:
 
[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?
 

Esta expresión regular se puede descomponer en los siguientes bloques, para poder interpretarla con mayor facilidad: 
  • El primer bloque [-+]? está indicando que el número podría estar precedido opcionalmente de un signo - o un signo +
  • El segundo bloque [0-9]* indica que podría aparecer un número de 0 o más dígitos del 0 al 9 
  • El tercer bloque indica que también de manera opcional podría aparecer un punto decimal
  • El cuarto bloque sugiere la aparición de un número de 1 o más dígitos del 0 al 9 
  • El quinto bloque es precisamente el que indicaría la parte exponencial del número y podría ser totalmente opcional.
Este último bloque se descompone en los siguiente sub-bloques:
  • Un primer bloque que indica la aparición de la letra 'e' o 'E' de exponente.
  • Un segundo bloque que indica la aparición opcional del signo '-' o el signo '+'
  • Un tercer bloque que indica la aparición de un número de 1 o más dígitos del 0 al 9.

sábado, 6 de junio de 2015

Captura de la FSK del Caller-ID

Dado que actualmente estoy trabajando en un nuevo proyecto relacionado con la telefonía, quería mostraros como se ve la FSK, o dicho de otro modo, la trama de datos del CallerID o identificación de llamada entrante.

Supongo que si has llegado hasta aquí es porque ya sabes de que va esto, pero para aquellos de vosotros que sintáis curiosidad y no sepáis de que va, se trata de la señal que llega a nuestros teléfonos fijos cada vez que recibimos una llamada telefónica, así de sencillo.

Dicha señal, contiene los datos que identifican a la llamada entrante, esto es, fecha, hora y número de teléfono entre otras cosas. Ni que decir tiene, que para que dicha señal llegue por la línea de teléfono hasta nuestro terminal, deberemos tener activado dicho servicio con nuestro operador, el cual en algunos casos implica un pequeño coste añadido.

Pues bien, esta señal se transmite por la línea telefónica desde la Oficina Central de nuestro operador hasta nuestro terminal, utilizando lo que se conoce como FSK (Frequency Shift Keying) ó Modulación por Desplazamiento de Frecuencia.

La idea "bijain de escen" es sencilla. Básicamente consiste en utilizar dos señales de distinta frecuencia para representar el 1 y el 0, o lo que se conoce como marca y espacio. De tal forma que, si queremos transmitir un 1 utilizaremos una de las frecuencias y para el 0 utilizaremos la otra.

Bueno al grano, aquí podéis ver una captura realizada con el osciloscopio RIGOL DS2202 de toda la trama completa, además de un par de señales de Ring:



Como podéis comprobar en la imagen, la señal de la trama del Caller-ID se encuentra entre dos señales de tono o Ring. En la imagen siguiente, he hecho una "ampliación" de un pedacito de dicha trama para que veáis la diferencia entre las dos señales empleadas para representar los '0' y '1'. Además he recortado la señal para que lo podáis ver un poco más claro:


Como se ve en la imagen superior, tenemos una valor de 8 bits '11001010', la cual corresponde a una mínima porción de la trama completa, es más, solamente a efectos de sincronización y para que os hagáis una idea de su magnitud, cuenta con unos 300 bits iniciales + otros 150 bits aprox. de sincronismo y finalmente los datos de identificación, pero esto según el estándar que se utilice podría llegar a ser de más de 2000 bits de longitud.

Pues nada, ahora ya sabéis como se ve la trama FSK del Caller-ID o identificación de llamada entrante.



C++11 y constexpr

El estándar de C++ desde su versión 11, incluye el nuevo especificador 'constexpr'. En concreto me voy a centrar en la especificación 11 de C++, ya que en la versión 14 hay algunos cambios muy interesantes, pero el compilador que voy a utilizar (que será Visual C++ de Visual Studio 2015), solo incluye hasta la versión 11.

A estas alturas me imagino que la mayoría de vosotros ya conocereis la existencia de este nuevo especificador, pero para aquellos que no lo sepan y por tanto, no lo hayan utilizado nunca, decir que se trata de un especificador para variables y funciones, que permitirá que éstas puedan ser utilizadas en expresiones constantes, las cuales en principio, podrán ser evaluadas en tiempo de compilación.

Y como una imagen vale más que mil palabras y, para nosostros un pedazo de código vale más que mil párrafos de explicaciones, vamos con un sencillo ejemplo.


Imaginad que definimos una plantilla que recibe un parámetro de tipo constante, y queremos que en el momento de instanciar tal plantilla, podamos pasarle una función como parámetro. Hasta ahora esto no era posible, al obligarnos la plantilla a que dicho parámetro fuese de tipo constante, pero ahora, y gracias al especificador 'constexpr', ya es posible, vamos a verlo.


#include <iostream>
using namespace std;
template<int n>
struct Calculos
{
 Calculos()
 {
  std::cout << "Valor: " << n << '\n';
 }
};
int main()
{
 Calculos<5> Test;
}


Bueno, como veis, lo que va a suceder con este pequeño código, es que se va a crear una instancia de  tipo Calculos y en cuanto se llame a su constructor, se mostrará por pantalla el valor pasado como parámetro a la plantilla, es decir el valor '5'


Pues bien, ¿qué sucede si lo que queremos es incluir como parámetro de la plantilla una llamada a una función que retorne un valor de tipo entero, por ejemplo el factorial de un número, en lugar de codificar directamente el valor '5'?, pues vamos a verlo:


#include <iostream>
using namespace std;
int factorial(int v)
{
 return v <= 1 ? 1 : (v * factorial(v-1));
}
template<int n>
struct Calculos
{
 Calculos()
 {
  std::cout << "Valor: " << n << '\n';
 }
};
int main()
{
 Calculos<factorial(6)> Test;
}

Este pedazo de código, va a lanzar un error en tiempo de compilación, porque al instanciar Test, va a comprobar que la funcion factorial no es constante y la plantilla está esperando un valor constante.

Pues bien, esto lo resolvemos incluyende el especificador 'constexpr' en la declaración de la función factorial. Obviamente, esto nos va a imponer ciertas restricciones en cuanto a que podemos utilizar en la programación de dicha función y que no. Por ejemplo, no podremos declarar variables locales, no podremos utilizar sentencias de iteración tipo For, While, etc. Esto último si que se podrá hacer con la versión del estándar 14 de C++

El siguiente código si que compilará sin ningún tipo de error, ya que el compilador evaluará la función  factorial en tiempo de compilación, consiguiendo de esta manera que el parámetro de la plantilla sea constante.


#include <iostream>
using namespace std;
constexpr int factorial(int v)
{
 return v <= 1 ? 1 : (v * factorial(v-1));
}
template<int n>
struct Calculos
{
 Calculos()
 {
  std::cout << "Valor: " << n << '\n';
 }
};
int main()
{
 Calculos<factorial(6)> Test}


Por último, simplemente decir que según parece, en la RTM de Visual Studio 2015 no estarán implementadas las características de 'constexpr' incluídas en el estándar C++14, tocará esperar a otra versión.


En cualquier caso, si que se pueden ir probando algunas de estas con el compilador GCC en su versión 5. Podeis ver algo de información al respecto aquí: https://isocpp.org/files/papers/N3652.html