viernes, 5 de junio de 2015
Meetup
Esta semana hice algo de lo que tenía mucha curiosidad: ir a un meetup. Este en particular fue muy interesante ya que la temática era hacer un intercambio cultural entre extranjeros radicando en Puebla y mexicanos. Compartí una buena tarde con gente de Turquía, India (un estudiante de doctorado de astrofísica en INAOE) y EU (Ian, el fundador del grupo Foreing Exapts, Mexicanos and Poblanos). Meetup no es una plataforma muy conocida en México, sumémosle que la seguridad aquí no es nuestro fuerte, y es difícil encontrar eventos en la provincia. Espero que eso pronto pueda cambiar. Es justo el tipo de sitios donde el internet se usa para romper tu burbuja de confort y vivir algo nuevo en la vida real.
viernes, 10 de abril de 2015
sábado, 21 de marzo de 2015
02:25 am
Me arrepiento de perder la costumbre, si alguna vez la tuve, de escribir con regularidad. Este blog sería como un registro al que podría acudir para auxiliar a mi memoria o analizar mi vida de forma más ordenada. Una libreta de apuntes técnicos de mi vida. Pero siendo honesto conmigo mismo, esa no era la verdadera razón por la que yo escribía. Era y es una necesidad de dejar una huella en este mar de la existencia. Puedo presumir que a mis 24 años he llevado una vida de novela literaria. ¿No es esto un ya buen motivo para escribir sobre ella? Quizá temo palidecer los detalles sobre una mala redacción. But who knows? nunca es tarde para recuperar o construir un hábito.
jueves, 19 de marzo de 2015
Gráfica de un Patrón de Radiación 3D con Python
Para este programa se están utilizando datos obtenidos de una simulación de un dipolo de media onda en HFSS en un archivo csv.
# -*- coding: utf-8 -*-
"""
@author: Rodolfo Escobar
"""
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
data = np.loadtxt('dipolo_16.csv',delimiter=',',skiprows=1)
theta = data[:,0]
phi = data[:,1]
r = data[:,2]
a = 0.0174532925
phi_rad = a*phi;
theta_rad = a*theta;
#Conversión de coordenadas
x = r * np.sin(phi_rad) * np.cos(theta_rad)
y = r * np.sin(phi_rad) * np.sin(theta_rad)
z = r * np.cos(phi_rad);
x = np.reshape(x,(73, 37))
y = np.reshape(y,(73, 37))
z = np.reshape(z,(73,37))
R = np.reshape(r,(73,37))
N = R/R.max()
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
surf = ax.plot_surface(x, y, z, rstride=1, cstride=2,facecolors=cm.coolwarm(N),cmap = 'coolwarm',linewidth=0.5 )
surf.set_edgecolor('k')
# Equivalente a la instrucción axis equal en Matlab
max_range = np.array([x.max()-x.min(), y.max()-y.min(), z.max()-z.min()]).max() / 2.0
mean_x = x.mean()
mean_y = y.mean()
mean_z = z.mean()
ax.set_xlim(mean_x - max_range, mean_x + max_range)
ax.set_ylim(mean_y - max_range, mean_y+ max_range)
ax.set_zlim(mean_z - max_range, mean_z + max_range)
#
plt.title(u'Patrón de Radiación')
m = cm.ScalarMappable(cmap=cm.coolwarm)
m.set_array(R)
cbar = fig.colorbar(m,shrink=0.8, aspect=9)
cbar.set_label('dB')
plt.rc('ytick', labelsize=7)
plt.show()
# -*- coding: utf-8 -*-
"""
@author: Rodolfo Escobar
"""
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
data = np.loadtxt('dipolo_16.csv',delimiter=',',skiprows=1)
theta = data[:,0]
phi = data[:,1]
r = data[:,2]
a = 0.0174532925
phi_rad = a*phi;
theta_rad = a*theta;
#Conversión de coordenadas
x = r * np.sin(phi_rad) * np.cos(theta_rad)
y = r * np.sin(phi_rad) * np.sin(theta_rad)
z = r * np.cos(phi_rad);
x = np.reshape(x,(73, 37))
y = np.reshape(y,(73, 37))
z = np.reshape(z,(73,37))
R = np.reshape(r,(73,37))
N = R/R.max()
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
surf = ax.plot_surface(x, y, z, rstride=1, cstride=2,facecolors=cm.coolwarm(N),cmap = 'coolwarm',linewidth=0.5 )
surf.set_edgecolor('k')
# Equivalente a la instrucción axis equal en Matlab
max_range = np.array([x.max()-x.min(), y.max()-y.min(), z.max()-z.min()]).max() / 2.0
mean_x = x.mean()
mean_y = y.mean()
mean_z = z.mean()
ax.set_xlim(mean_x - max_range, mean_x + max_range)
ax.set_ylim(mean_y - max_range, mean_y+ max_range)
ax.set_zlim(mean_z - max_range, mean_z + max_range)
#
plt.title(u'Patrón de Radiación')
m = cm.ScalarMappable(cmap=cm.coolwarm)
m.set_array(R)
cbar = fig.colorbar(m,shrink=0.8, aspect=9)
cbar.set_label('dB')
plt.rc('ytick', labelsize=7)
plt.show()
lunes, 16 de marzo de 2015
Graficar una esfera con coordenadas esféricas en Matlab
Una manera de hacer la gráfica de una esfera hueca es primero construir el cascaron como una superficie expresada con coordenadas esféricas y después convertirlas a coordenadas cartesianas con la función sph2cart(). Matlab utiliza la convención alta-azimutal
para coordenadas esféricas por lo que se tiene que considerar a la hora
de traducir funciones expresadas con otras convenciones (por ejemplo, aquellas que miden theta desde el eje Z). En este ejemplo estoy graficando una esfera unitaria centrada en el origen pero pueden modificar el radio multiplicándolo por el valor que deseen y sumando un offset a las coordenadas cartesianas para moverla. Este ejemplo también funciona sin ningún problema en Octave, que es la versión abierta y gratuita de Matlab.
%Esfera de radio unitario en coordenadas esféricas
Az = linspace(0,2*pi,50); %phi
El = linspace(-pi,pi,50); %theta
r = ones(1,50);
%Construcción de malla
[El,Az] = meshgrid(El,Az);
r = meshgrid(r);
%La conversión se realiza después de construir la malla
[X,Y,Z] = sph2cart(Az,El,r);
mesh(X,Y,Z), axis equal
%Esfera de radio unitario en coordenadas esféricas
Az = linspace(0,2*pi,50); %phi
El = linspace(-pi,pi,50); %theta
r = ones(1,50);
%Construcción de malla
[El,Az] = meshgrid(El,Az);
r = meshgrid(r);
%La conversión se realiza después de construir la malla
[X,Y,Z] = sph2cart(Az,El,r);
mesh(X,Y,Z), axis equal
viernes, 13 de febrero de 2015
Escudo de la BUAP (Blanco, PNG)
lunes, 17 de noviembre de 2014
Simulación de circuitos eléctricos en Simulink
Bloques usados:
Solver Configuration: (Simscape>Utilities)
Voltage Sensor: (Simscape >Foundations Library>Electrical>Electrical Sensors)
Current Sensor: (Simscape >Foundations Library>Electrical>Electrical Sensors)
PS-Simulink Converter: (Simscape >Utilities)
Resistor (Simscape>Foundations Library>Electrical>Electrical Elements)
Electrical Reference (Simscape>Foundations Library>Electrical>Electrical Elements)
AC Voltage Source (Simscape>Foundations Library>Electrical>Electrical Sources)
Mux (Simulink >Common Used Blocks)
Scope (Simulink>Sinks)
Para este modelo se dejó la configuración del Solver en default con la fuente de voltaje a 10 V pico-pico a 60 Hz y la resistencia es de 50 ohms. El tiempo de simulación es de 0.06 segundos.
Nota: Cómo activar las leyendas en el Scope.
Solver Configuration: (Simscape>Utilities)
Voltage Sensor: (Simscape >Foundations Library>Electrical>Electrical Sensors)
Current Sensor: (Simscape >Foundations Library>Electrical>Electrical Sensors)
PS-Simulink Converter: (Simscape >Utilities)
Resistor (Simscape>Foundations Library>Electrical>Electrical Elements)
Electrical Reference (Simscape>Foundations Library>Electrical>Electrical Elements)
AC Voltage Source (Simscape>Foundations Library>Electrical>Electrical Sources)
Mux (Simulink >Common Used Blocks)
Scope (Simulink>Sinks)
Para este modelo se dejó la configuración del Solver en default con la fuente de voltaje a 10 V pico-pico a 60 Hz y la resistencia es de 50 ohms. El tiempo de simulación es de 0.06 segundos.
Nota: Cómo activar las leyendas en el Scope.
viernes, 3 de octubre de 2014
Guadalajara
sábado, 30 de agosto de 2014
Circuito de muestreo y retención
Este circuito puede encontrarse en la página 706 del libro Circuitos Electrónicos Discretos e Integrados de Donald L. Schilling. Es un circuito inversor de muestreo y retención que utiliza un FET de canal p como dispositivo de conmutación. El diodo D1 hace que la tensión en el drenaje del FET se mantenga fijada en 0.7 V haciendo que el voltaje Vsg nunca exceda -4.3 V independientemente del valor de la señal de entrada V1. Si la señal V1 se vuelve negativa, las funciones de las terminales drenaje y fuente se invierten, permitiendo que el circuito se comporte de manera similar a un interruptor ideal. La simulación de la respuesta del circuito es la siguiente:
martes, 19 de agosto de 2014
Buscando a Waldo con Matlab
Una aplicación entretenida de la correlación cruzada normalizada es la detección de una imagen patrón en una imagen de mayor tamaño. Esta correlación está definida matemáticamente como
dónde f(x,y) representa a la función de imagen y t(x,y) la función de templete o imagen patrón que se desea detectar. En nuestro programa ese templete será este segmento de imagen dónde aparece Waldo:
Nuestra función principal será el siguiente mapa en el que habrá que encontrar a Waldo:
Para encontrarlo utilizaremos la función normxcorr2(). Esta función retornará un arreglo bidimensional resultado de la correlación cruzada del templete y la imagen. Para encontrar la posposición de Waldo en la imagen bastará con encontrar el punto donde la función alcanza su máximo. El arreglo resultante será tan grande como la imagen del mapa por lo que habrá que seleccionar una pequeña región alrededor del pico para poder visualizarlo mejor:
Para encontrar la posición del pico utilizamos la función max() con la siguiente sintaxis:
[pico,indice] = max(c(:)); % Obtener valor del pico y su índice
El arreglo c representa a la función de de correlación. Hasta aquí la variable pico contiene el valor del máximo y la variable indice contiene la posición del valor máximo como si la matriz c estuviera distribuida en un arreglo vectorial. Para conocer la verdadera poción del pico en la imagen se necesita la función ind2sub():
[y,x] = ind2sub(size(c),indice); % Obtener posición en la imagen
Teniendo ahora la posición de Waldo solo queda mostrar la imagen completa con un rectángulo superpuesto para señalarlo:
El programa completo es quizá más compacto de lo que pudieron haber pensado
clc,clear
mapa = imread('Waldo.jpg'); %Carga imagen del mapa
waldokernel = imread('waldok.jpg'); % carga templete de Waldo
c = normxcorr2(waldokernel(:,:,1),mapa(:,:,1)); % Correlación cruzada normalizada
[pico,indice] = max(c(:)); % Obtener valor del pico y su índice
[y,x] = ind2sub(size(c),indice); % Obtener posición en la imagen
ccut = c(y-45:y+45,x-45:x+45); % Recortar región alrededor del pico
imshow(mapa)
hold on
rectangle('Position',[x-50,y-43,70,70], 'LineWidth',2)
figure(2),surf(ccut), shading flat, title('Pico en Correlación Cruzada')
dónde f(x,y) representa a la función de imagen y t(x,y) la función de templete o imagen patrón que se desea detectar. En nuestro programa ese templete será este segmento de imagen dónde aparece Waldo:
Nuestra función principal será el siguiente mapa en el que habrá que encontrar a Waldo:
Para encontrarlo utilizaremos la función normxcorr2(). Esta función retornará un arreglo bidimensional resultado de la correlación cruzada del templete y la imagen. Para encontrar la posposición de Waldo en la imagen bastará con encontrar el punto donde la función alcanza su máximo. El arreglo resultante será tan grande como la imagen del mapa por lo que habrá que seleccionar una pequeña región alrededor del pico para poder visualizarlo mejor:
Para encontrar la posición del pico utilizamos la función max() con la siguiente sintaxis:
[pico,indice] = max(c(:)); % Obtener valor del pico y su índice
El arreglo c representa a la función de de correlación. Hasta aquí la variable pico contiene el valor del máximo y la variable indice contiene la posición del valor máximo como si la matriz c estuviera distribuida en un arreglo vectorial. Para conocer la verdadera poción del pico en la imagen se necesita la función ind2sub():
[y,x] = ind2sub(size(c),indice); % Obtener posición en la imagen
Teniendo ahora la posición de Waldo solo queda mostrar la imagen completa con un rectángulo superpuesto para señalarlo:
El programa completo es quizá más compacto de lo que pudieron haber pensado
clc,clear
mapa = imread('Waldo.jpg'); %Carga imagen del mapa
waldokernel = imread('waldok.jpg'); % carga templete de Waldo
c = normxcorr2(waldokernel(:,:,1),mapa(:,:,1)); % Correlación cruzada normalizada
[pico,indice] = max(c(:)); % Obtener valor del pico y su índice
[y,x] = ind2sub(size(c),indice); % Obtener posición en la imagen
ccut = c(y-45:y+45,x-45:x+45); % Recortar región alrededor del pico
imshow(mapa)
hold on
rectangle('Position',[x-50,y-43,70,70], 'LineWidth',2)
figure(2),surf(ccut), shading flat, title('Pico en Correlación Cruzada')
Suscribirse a:
Entradas (Atom)












