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

martes, 31 de marzo de 2015

Circuito Electrónico Equivalente de un Oscilador de Cristal

Si bien no es mi objetivo definir en esta entrada lo que es un cristal, no estará de más que lo haga para todos aquellos que lleguen a este blog buscando información sobre otro tipo de "cristales".

En el caso que nos ocupa definiría un cristal simplemente como un material piezoeléctrico vibrante y, al oscilador de cristal como aquel que hace uso de la resonancia mecánica de dicho material, para generar una señal de reloj lo más estable posible o al menos, muy estable. Este tipo de osciladores de cristal, se utilizan por ejemplo en circuitos digitales, basados en microcontroladores, en RF, etc.

El porque de utilizar un material piezoeléctrico, es debido a que cuando se le aplica una corriente eléctrica se distorsiona o altera, generando un campo eléctrico en el momento en que vuelve a su forma original.

Los cristales los podemos encontrar de diversas formas y tamaños, en función de las características que se busquen o de las especificaciones necesarias. Aunque en realidad todos los objetos tienen una frecuencia de vibración y, esta dependerá de su forma, tamaño, elasticidad y velocidad del sonido en el material, el más común utilizado en electrónica es el cristal del cuarzo (Quartz) y una frecuencia ampliamente utilizada en los relojes será la de 32Khz (32.768Hz)

Ahora bien, eléctricamente podemos representar un cristal mediante el siguiente circuito:





En este circuito podemos observar por un lado, una red serie (RLC) compuesta por R1, L1 y C1, a la cual se le conoce como "Motion Arm", algo así como "Brazo de movimiento". Esta red define el comportamiento mecánico del cristal. La capacitancia C1 representa la elasticidad del cuarzo, la infuctancia L1 representa la masa vibrante del cuarzo y por último la resistencia R1 que representa las pérdidas debidas a la amortiguación de las vibraciones.

Por otro lado nos encontramos con la capacitancia C0, conocida como "Shunt" o capacitancia estática y no es más que la suma de varias capacitancias parásitas debidas al propio encapsulado del cristal y a los propios electródos. Por lo tanto, si medimos la capacitancia de un cristal, lo que estaremos miendo realmente será la capacitancia indicada en el circuito por C0, ya que C1 no tendrá efecto.

Haciendo uso de la transformada de Laplace, en este circuito equivalente, nos podemos encontrar dos tipos de frecuencias:

    - por un lado la "Frecuencia resonante en serie" (Fs), la cual depende solamente de C1 y L1
   
    Fs = 1 / 2pi Sqrt(L1C1)

    - y por otro lado la "Frecuencia anti-resonante o paralela" (Fp), la cual también incluye C0

    Fp = (1 / 2pi Sqrt(L1C1)) Sqrt(1 + (C1/C0))

Y esto es todo por hoy ....

jueves, 27 de noviembre de 2014

Redes Sociales y perfilado de los usuarios

Una de las ultimísimas noticias relacionadas con las redes sociales no hace más que certificar cual es el verdadero objetivo que hay detrás de todas y cada una de ellas y, por si alguno todavía se muestra escéptico al respecto, aquí está la última perla de Twitter.


Pues nada "tuétanos", ahora resulta que los responsables de Twitter han decidido, así por su cara bonita, que van a husmear en nuestros dispositivos (móviles, tablets, etc.), para ver cuales son las aplicaciones que utilizamos, según ellos para ofrecernos una mejor "experiencia de usuario", algo que empieza a tocar un poco las ... "morales" de más de uno, entre los que me incluyo.


Obviamente, un servicio que utilizas "gratuitamente", y que mueve tantos millones de euros en el mundo, algo "raro" tiene que esconder detrás. Y es que ésta, como tantas redes sociales, lo único que busca es obtener TANTOS DATOS PERSONALES DE SUS USUARIOS COMO SEA POSIBLE, con el fin de trazar perfiles de la ciudadanía hasta extremos hasta ahora insospechados e inalcanzables sin el uso de la red.


La cantidad de datos personales y "privados" que circulan por estas redes es inmensa, pero no es menos inmensa la utilidad o el uso que se puede hacer de ellos.


Digamos, que el uso más evidente será el de ofrecernos PUBLICIDAD DIRIGIDA Y PERSONALIZADA en base a nuestros gustos, aficiones, costumbres o hábitos, amistades, situación laboral, personal, de salud, etc.


Imagina que  tienes instalada en tu dispositivo una aplicación para acceder a tu banco habitual, la gente que está detrás de Twitter también lo sabría, imagina que utilizas una aplicación para recordar cuando debes ponerte la insulina (TWITTER también lo sabría), imagina que utilizas una aplicación para ir anotando los granos que te salen en el culo (TWITTER también lo sabría), imagina que como muchas mujeres, utilizas una aplicación para controlar tu período (TWITTER también lo sabría), imagina LO QUE QUIERAS, porque seguro que con el tiempo TWITTER también lo sabrá.


Pero cuidado, porque quizás TWITTER y el resto de redes sociales, no sean los únicos que lleguen a tener acceso a toda esta información que tu piensas que solo te pertenece a ti, imagina nuevamente que toda esa información llega a manos del lado oscuro de la sociedad, gente sin escrúpulos ni miramientos que lo único que buscan es lucrarse (al igual que TWITTER & Company), pero utilizando otras artes más agresivas y directamente sobre tu persona física.


En fin, las redes sociales pueden estar muy bien, pero la comunicación entre personas no tiene porque ser sinónimo de "PERDIDA DE INTIMIDAD O PRIVACIDAD".


En cualquier caso, si no quieres permitir que esto suceda, en el caso de Twitter, parece ser, que puedes desactivar tal comportamiento y, para ello tan solo debes seguir unos pequeños pasos. Aquí tenéis la página de soporte de twitter que os muestra como hacerlo.


https://support.twitter.com/articles/20172080-que-es-el-grafico-de-aplicaciones-de-twitter#


Y si no os importa todo esto, como a más de uno que conozco, pues nada gritad al unísono vuestra frase favorita:


"NA TIO, SI TOTAL, YO NO TENGO NADA QUE ESCONDER, A MI ME DA IGUAL".