Curso autodidacta/complementario de Matlab: videos, ejercicios, códigos y más ...
Mostrando entradas con la etiqueta Códigos. Mostrar todas las entradas
Mostrando entradas con la etiqueta Códigos. Mostrar todas las entradas
Cómo poner textura de imagen a una superficie 3D en Matlab
Resumen
Muchos video juego y simuladores usan texturas de imágenes sobre superficies de polinomios. Como si coloran una piel a un armazón. Aquí exploramos cómo se hace esta superposición en Matlab.
Además mostramos que se pueden cargar imagenes desde Internet a nuestro programa de Matlab.
Preguntas para pensar
1) ¿Cómo puede ser importante este programa para una aplicación médica?
2) ¿Cómo se eliminan las lineas guías (cuadricula) de la imagen 3D?
4) Las proyecciones planas se incorporaron a la superficie 3D. Lo que crea sitios con discontinuidades. ¿Como se puede mejorar el ajuste de una imagen que funciona como piel sobre una superficie digital?
Código Matlab
% Superficie 3D con una textura de imagen
% Inicialización
clear all; close all; clc; format compact;
% Constantes y valores iniciales
k = -.5; j = 0.6;
% Generando los valores x,y,z
[x,y] = meshgrid(-3:.2:3, -3:.2:3);
z = k.*(1-(cos(x.^2+y.^2))./(x.^2+y.^2+j));
% Dibujando la superficie
h = surf(x,y,z);
% Añadiendo una imagen a la superficie
img = imread('http://upload.wikimedia.org/wikipedia/en/5/5d/Ubinas_ali_2010205.jpg');
% Ubinas: el volcan más reciente de Perú
set(h,'CData',img,'FaceColor','texturemap')
axis off
% fin del guión.
Cómo hacer el símbolo del pentagrama con Matlab
Resumen
Un pentagrama es una estrella de cinco picos, hecha con cinco trazos. Tiene propiedades geométricas muy interesantes.
Para construirla, aquí dibujamos una linea horizontal, y la giramos mediante la función rot2d, cuyo al código encontraras al final de esta entrada. El guión del pentagrama se basa en dibujar una linea horizontal y luego rotarla. Sin embargo, se tiene cuidado de usar adecuadamente las definiciones de operaciones de matrices para obtener los vectores rotados.
Preguntas para pensar
1) ¿En que situaciones Matlab es una herramienta cómoda y adecuada para dibujar?, ¿y en situaciones Matlab es una pesima herramienta para hacer dibujos?
2) ¿Mejorando el entorno gráfico de Matlab, hace más amigable sus funciones de dibujo?
Ejercicios
1) Dibuje una estrella de David, utilizando de base los códigos de esta entrada
2) Explique con un ejemplo la importancia de de usar x = [x x(1)]; para obtener una rotación adecuada.
3) ¿En que coordenadas el punto en que gira la linea horizontal?, ¿Cómo puede especificar otro punto como pivote de los giros?
Códigos Matlab
function [xt, yt] = rot2d(t, x, y)
% La función rot2d rota un objeto bidimensional
% que es representado por dos vectores: X y Y
% El ángulo de rotación es t, en radianes.
r = [cos(t) -sin(t); sin(t) cos(t)];
x = [x x(1)];
y = [y y(1)];
z = r*[x;y];
xt = z(1,:);
yt = z(2,:);
%guión para dibujar el pentagrama
%% Pentagrama
% Author: Vicente Torres Zuñiga
%
% Guión Matlab para graficar el símbolo de un pentagrama en el sistema
% cartesiano
% El símbolo consiste en un círculo con un pentagrama en interior -un
% estrella de cinco puntas dibujada con cinco lineas %
%
% El algoritmo se enfoca en obtener las coordenadas de dibujo:
% primero de un circulo, luego de una linea horizontal, que posteriormente
% se rota para generar cuatro lineas para completar el pentagrama
%
close all; clear; clc % limpiamos la casa
num_puntos = 250; % número de puntos
t = linspace(0, 2*pi, num_puntos); % Intervalo
noLados = 5; % Número de lados del polígono
AnguloInt = 2*pi/noLados; % Ángulo interior del polígono
%
% Variables del círculo
r = 2; % Radio
h = 0; k = 0; % Coordenadas del centro
%
% Ecuación parámetrica del círculo:
x = r*cos(t)+h; y = r*sin(t)+k;
%
%% Ecuaciones para la linea horizontal
% Longitud de la linea horizontal
lH = 2*r*sin(AnguloInt);
% Distancia de la linea horizontal al centro: (0,0)
dist_lH = r*cos(AnguloInt);
%
% Definición del intervalo de la línea horizontal
xH = linspace(-lH/2, lH/2, num_puntos);
% Definición de vectores
L = zeros(2,num_puntos);
L(1,:) = xH;
L(2,:) = -dist_lH;
%
[L0rx L0ry] = rot2d(AnguloInt*0, L(1,:), L(2,:));
[L1rx L1ry] = rot2d(AnguloInt, L(1,:), L(2,:));
[L2rx L2ry] = rot2d(AnguloInt*2, L(1,:), L(2,:));
[L3rx L3ry] = rot2d(AnguloInt*3, L(1,:), L(2,:));
[L4rx L4ry] = rot2d(AnguloInt*4, L(1,:), L(2,:));
%
% Gráficas
hold on
plot(x,y, 'r', 'LineWidth', 4) % círculo
plot(L0rx, L0ry, 'LineWidth', 4) % línea horizontal
plot(L1rx, L1ry, 'LineWidth', 4)
plot(L2rx, L2ry, 'LineWidth', 4)
plot(L3rx, L3ry, 'LineWidth', 4)
plot(L4rx, L4ry, 'LineWidth', 4)
axis square off
hold off
% fin del guión/script
Descubriendo huevos de Pascua en Matlab
Los huevos de Pascua son imagenes, fragmentos de audio o video o pedazos de código con una funcion inesperada e intencional de un programa. Fueron dejadas por los programadores para dejar un testimonio de su trabajo y aficiones; pero tal vez lo princiapal, estan ahí para que las descubramos.
Hay que enfatizar que los huevos de pascua no son demos, ni errores de programación.
De mis ejemplos favoritos en Matlab debo mendicionar siguientes:
- fifteen
- load handel, sound(y,Fs)
- load audio48, sound(signal48kHz, Fs48)
- why
- spy
- image
¡Debes probarlas!
Unas notas extras:
1) Parece que las versiones modernas de Matlab dejo de aparecer la imagen del espia. Pero la puedes recuperar con el código de una entrada de stackoverflow.
2) Image tiene una interesante historia, que la cuenta -en su blog- Steve Eddins.
Para ver las demas imagenes que se ocultan en la imagen por defecto puedes usar el siguiente código Matlab:
defImage = pow2(get(0,'DefaultImageCData'),47);
imgCell = repmat({zeros(size(defImage))},8,7);
for shift = 0:52
imgCell{shift+1} = bitshift(defImage,shift);
end;
allImages = cell2mat(imgCell.');
imshow(allImages,[min(allImages(:)) max(allImages(:))]);
%fin del script
20 puntos extra: por mejorar interface y programa de captura de imagenes
![]() |
| Interface de video y analisis de una imagen capturada |
Este es un script para obtener el video (con su archivo fig), la imagen congelada y estadística de esa imagen, funciona con la interface de una cámara web. Funciona en base a la captura de video, cuyo código se encuentra en nuestra práctica de grabación y manipulación de video por medio de Matlab.
En primer equipo que entregue este código con una función en la interface para variar y fijar la sensibilidad de la cámara web. Obtiene hasta 20 puntos (para cada uno de los miembros del equipo) en las evaluaciones de la clase.
El máximo de integrantes por equipo es 3.
La fecha límite para hacer el código es el 30 de noviembre.
Preguntas sobre este proyecto sólo serán contestadas en este post y en la clase presencial.
Links útilies:
Ayuda de Matlab Adq. Toolbox
Cómo simular en Matlab un patrón de difracción de una apertura circular
![]() |
| Apertura circular y su patrón de difracción simulados con Matlab |
El siguiente guion es para usarse en Matlab y realizar una simulación de un patrón de difracción. Puede ser útil para motivarlos a estudiar más este tema:
%inicia script
%% script para simular un patrón de difración de una apertura circular
%% mediante la transfotmada discreta y rapida de Fourier
%
%% por Vicente Torres (18/8/2011), en base al script de Luis Mex
%limpieza de memoria
clear;
clc;
close all
%acondicionamiento
n=2^10;
M=zeros(n); % matriz base donde, que representa la pantalla, oscura
I=1:n;
x=I-n/2;
y=n/2-I;
[x,y]=meshgrid(x,y);
R=10;
a=(x.^2+y.^2<=R.^2); % acondicionando el área de la apertura,
% estos seran indices de la matriz
M(a)=1; % la apertura deja pasar la luz, que se representa con 1
figure
subplot(1,2,1)
imagesc(M),colormap( [0 0 0;1 1 1]),title('\bf abertura circular'),axis image;
D=fft2(M); % Calculo del patron de difraccion
D1=fftshift(D);
subplot(1,2,2)
imagesc(abs(D1)),colormap(hot),axis image, title('\bf patrón de difracción');
%fin del script
En Matlab central pueden encontrar otros ejemplos de patrones de difracción, basado en la ayuda de Matlab.
Preguntas para pensar:
La forma del patrón de difracción en campo lejano parece concordar con el experimento, como se puede comprobar que su perfil de intensidad corresponde adecuadamente con la teoría o con el experimento.
1) En base a este ejemplo obtenga el patrón de difracción de una rendija simple.
2) Obtenga la simulación de un patrón de difracción de una rendija cuadrada
Código para obtener la primera derivada por coeficientes de una función
Como se puede consultar en el libro: transformada de Fourier para peatones, podemos definir la derivada Yk como la “primera diferencia central” de la función F:
La cual tiene una función de transferencia, que no presenta problemas de corrimientos de fase:
Sin embargo, presenta un efecto de filtro muy pronunciado a frecuencias altas.
El siguiente código matlab aplicado a la función sin^2(x) con un paso de 0.1 funciona muy bien. En las figuras de salida del script se observan la función original, la derivada teórica y la derivada obtenida. Observe que presenta un comportamiento muy similar las dos derivadas. Efectivamente, cuando comparamos la derivada obtenida sobre la deriva teórica obtenemos en la gráfica una recta identidad. Por todo lo anterior, afirmamos que es un buen algoritmo para operar la derivada.
%%Script que calcúla numéricamente la primera derivada de la función:
%%sin(x)^2.
clear all
close all
clc
%Definiendo intervalos
x=0:0.01:1;
%función original:
funcion=(sin(x)).^2;
%preparando parámetros:
s=length(funcion); %longitud de la funcion
Y=zeros(1,s); % espacio de memoria para la derivada numerica
% Algoritmo de primera derivada
for k=2:s-1
Y(k)=(funcion(k+1)-funcion(k-1))/(2*0.01);
end
% Graficación de funciones teoricas y su compraración con la estimación
% numerica de la primer derivada
figure
subplot(2,1,1)
hold on
plot(x,funcion,'r') % función original
plot(x,2*sin(x).*cos(x), '-b') % derivada teorica de la funcion original
plot(x,Y,'ok') % derivada numerica obtenida
axis([0,1.04,0,1.1]);
xlabel('Vector <>')
ylabel('Funciones utilizadas')
text(0.02,0.8,'Funciones Sin^2(x) (rojo), derivada teorica (azul), derivada numerica (negro)')
box on
hold off
subplot(2,1,2)
plot(2*sin(x).*cos(x),Y,'-b')% comparacion entre funciones;
% derivada teorica contra la derivada numerica
xlabel('Función 2*sin(x).*cos(x), derivada teorica')
ylabel('Derivada numerica obtenida')
axis([0,1.04,0,1.1]);
grid
%%% fin del script
Ejercicios:
Matlab tiene su comando/función para hacer la derrivada: diff, su algoritmo de trabajo es:
1) ¿Cómo se compara este algoritmo con el propuesto en el post?
2) Muestre ejemplos del uso de este comando
3) ¿Cuales son las limitaciones de esta forma de definir la derivada?
Enlaces relacionados:
Capítulo 2, Derivación numérica del curso de métodos numéricos de Agustín A. Rosas.
Comparación del desempeño de un filtro convolución y un filtro pasa bajas de promedios ponderados en una misma función/señal
Ahora mostramos dos ejemplos de filtros. La funcion a trabajar es:
La cual tiene un pico extendido en t=5 y dos pequeños picos de estructura en t=2. Pues bien la entrada a un instrumento cuenta con filtro descrito por:
Efectivamente, la señal filtrada por convolución será la transforma de Fourier inversa de la multiplicación de las transformadas de Fourier de la señal y del filtro; es decir:
A continuación aplicaremos el filtro en código Matlab.
Filtro 1: Convolución.

Para comparar la señal y la salida filtrada, a ambas las normalizamos. Observamos que hay un corrimiento en el tiempo. Este efecto en los indices y en la amplitud son muy comunes cuando se usa la transformada de Fourier.

Adicionalmente, una vista cercana a la estructura de los dos picos pequeños muestra que la salida del filtro cuenta con estos picos más pequeños y casi sin desernir. Con todo, esta forma de presentar los datos muestra a detalle que el filtro es bueno sin ser excelente para eliminar la estructura de la curva principal .
A continuación, mostramos el código Matlab utilizado para hacer estas curvas.
%%% Inicio código 1: Filtro convolución
clc
clear
close all
x = 0:0.0001:10;
y = 4*((sin(x-2)).^2).*exp(-50*((x-2)).^2) + 0.5*( ((x-5).^2 +0.25).^(-.25) );
r = ones(size(x));
for k= 1:length(x)
if x(k) <= 0.15
r(k)= .50;
elseif x(k) <= 0.30
r(k)= 0.25;
elseif x(k) <= 0.60
r(k)= 0.10;
else
r(k)= 0;
end
end
plot(x,r, 'LineWidth',3)
axis([-.2,3,-0.2,0.6])
Y= ifft( fft(y).*fft(r));
figure
hold on
plot(x, y/max(y), '--b','LineWidth',3)
plot(x,Y/max(Y), 'k', 'LineWidth',3)
axis([0,10,0.28,1.05])
hold off
%%% Fin código 1: Filtro convolución
Filtro 2: Pasa bajas con promedio ponderado

Ahora bien, utilizaremos el filtro pasa bajas (PB), que ya mostramos en otro post, en este caso usamos 6,0000 iteraciones. Dado que la estructura en la función puede representar una oscilación rápida aplicaremos el filtro PB. Observamos en la salida que tanto el cambio en la amplitud como el corrimiento en los indices de los vectores de las curvas es casi minimo. Además de que se ve más disminuida la estructura en la función.

Este filtro PB presenta mejores resultados que el de convolución; esto es por el tipo de filtro r(t) utilizado. Sin embargo, el filtro PB tarda mucho más en desarrollarse. Puedes usar los comandos de Matlab TIC yTOC antes y despues de que inicien las rutinas para observar la velocidad de ejecución de cada función o escript.
Podemos asegurar que dependiendo que se busquemos filtrar, hay un filtro que nos funcionara mejor que otros, pero hay que saberlo encontrar :)
A continuacion el segundo código Matlab:
%%% Inicio código 2: filtro pasa bajas con promedio ponderado
clc
clear
close all
tic % inicia el contador de tiempo
t = 0:0.001:5*pi;
f = 4*((sin(t-2)).^2).*exp((-50)*(t-2).^2) +0.5*((t-5).^2+0.25).^(-0.25); %señal de trabajo
hold on
plot(t, f, 'r') % para visualizar la señal con ruido
for corrida = 1:60000 %iteracion del filtro
for k = 2:(length(t)) -1 ;
f(k) = 0.25*(f(k-1) + 2*f(k) + f(k+1)); %filtro
end
end
plot(t, f, '--b') %para visualizar la señal filtrada
hold off
toc %finaliza el contador del tiempo
%%% Fin código 2: filtro pasa bajas con promedio ponderado
Ejercicios:
1) Muestre el grado de atenuación de las protuberancias después de pasar por el filtro.
2) Diseñe otro filtro de convolución que atenue mejor a los dos picos que forman protuberancias en la curva original
3) Calcule la salida del filtro de convolución con r(w)*I(w) en lugar de I(w)*r(w). Describa sus observaciones.
Ejemplos de código para formar señales discretas en Matlab
El objeto más básico en Matlab es una matriz numérica con la posibilidad de almacenar números complejos. Por supuesto, los datos obtenidos en el estudio de señales y sistemas son muy bien representados en forma de matrices. En este post usaremos Matlab para la generación de señales elementales: cuadrada, triangular, entre otras.
El ToolBox de procesamiento de señales de Matlab posee una gran variedad de funciones para la generación de señales, estas señales requieren de una representación vectorial de la variable tiempo, de manera continua o discreta. Para realizar una simulación de un intervalo continuo, se usa un vector de valores discretos con un intervalo de muestreo muy pequeño.
Como vimos en post anteriores, el siguiente comando genera un vector llamado t de valores que representan la variable tiempo, con un intervalo de muestreo de 1 ms entre 0 y 1 segundo.
t = 0:0.001:1;
Después de creado el vector que representa la variable tiempo, es posible iniciar el desarrollo de alguna señal de interés.
En Matlab una señal discreta en el tiempo se representa exactamente, porque los valores de la señal son representados como los elementos de un vector. Sin embargo las señales de tiempo continuo en Matlab son tan solo aproximaciones. La aproximación consiste de un vector cuyos elementos son muestras de la verdadera señal de tiempo continuo. Cuando se usa esta técnica para la representación de señales continuas es importante escoger el intervalo de muestreo lo suficientemente pequeño para asegurar que las muestras capturan todos los detalles de la señal.
EJEMPLOS DE SEÑALES EN MATLAB
La generación de señales periódicas tales como ondas cuadradas y triangulares es una actividad muy fácil de realizar en MATLAB.
1) SEÑAL CUADRADA
Consideremos primero la generación de una onda cuadrada de amplitud A, frecuencia fundamental w (medida en radianes por segundo) y ciclo útil rho. Recordemos que el ciclo útil es la fracción de cada periodo en donde la señal es positiva.

Para generar dicha señal se pueden escribir lo siguiente en la linea de comandos:
>> A = 1;
>> w = 10 * pi;
>> rho = 0.5;
>> t = 0:0.001:1;
>> sq = A*square(w*t+rho);
>> plot(t,sq);
En la segunda línea de este ejemplo, pi es una función interna de Matlab que calcula el número más cercano a la constante PI en formato de coma flotante. El último comando es usado para vizualizar la señal generada. El comando plot dibuja líneas conectando los valores sucesivos de la señal y así da la apariencia de una señal en tiempo continuo.
2) SEÑAL TRINGULAR
Consideremos ahora la generación de una onda triangular de amplitud A, frecuencia fundamental w y ancho Wdt . El periodo de la onda triangular será T con el máximo valor de la señal ocurriendo en t = WT . El comando básico para generar esta señal es:
A * sawtooth(w * t + Wdt)
El resultado se puede observar en la gráfica a la izquierda
3) SEÑAL ESCALÓN
En Matlab, el comando ones(M, N) genera una matriz de unos de tamaño MxN, y el comando zeros(M, N) es una matriz de ceros del mismo tamaño. Se puede hacer uso de estas dos matrices para generar dos señales comúnmente usadas: la señal escalón y la señal impulso.
Una señal paso de amplitud uno, puede ser generada con el siguiente comando.

U = [zeros(1, 10), ones(1, 11)];
Para la versión continua creamos un vector que represente el tiempo el cual tenga muestras de un intervalo separados por valores muy pequeños. Los comandos y los resultados se muestran a continuación:
>> u=[zeros(1,10),ones(1,11);
>> t=-1:0.1:1;
>> plot(t,u)
Como se menciono anteriormente, una señal generada en Matlab es inherentemente de naturaleza discreta. Para visualizar una señal en tiempo discreto se puede hacer uso del comando stem. Específicamente stem(n, x), bosqueja los datos contenidos en el vector x como una señal de tiempo discreto con los valores de tiempo definidos por el vector n. Los vectores n y x deben tener dimensiones compatibles, es decir deben tener el mismo número de elementos. Así, para este caso para obtener la representación de esta señal en tiempo discreto creamos un vector-tiempo el cual debe tener valores separados por una unidad.
>> u=[zeros(1,10), ones(1,11)];
>> n=-10:10;
>> stem(n,u)
Recuerde que para poder usar las funciones plot y stem, es requisito que los vectores (t y u) ó (n y u) tengan iguales dimensiones. Por esta razón el vector u se forma como una composición de diez ceros y 11 unos, debido a que los arreglos t y n, tienen dimensión 21 dado que incluyen un elemento central el cual es el número cero. Para probar este hecho, se puede hacer uso de la función Matlab llamada size que devuelve como resultado un vector con las dimensiones de la matriz que se le pasa como parámetro.
4) SEÑAL IMPULSO:

La versión discreta de la señal impulso se puede también generar con ayuda de las funciones zeros y ones, realizando una composición como sigue:
>> delta = [ zeros( 1 ,10 ), 1 , zeros( 1 ,10 ) ];
>> n = -10:10;
>> stem(n,delta);
5) SEÑAL RAMPA
Para generar la señal rampa, tan solo es necesario recordar que esta función puede ser creada, como la composición de una recta Y(x) = x a partir de cero y de la recta Y(x) = 0 para valores de x menores de cero, así la versión discreta se muestra a continuación:
>> t1=0:0.1:10;
>> rampa1=t1;
>> rampa=[zeros(1,101),rampa1];
>> t2=-10:0.1:0;
>> t=[t2,t1];
>> plot(t,rampa)
Ejercicios:
1) Desarrollar un conjunto de comandos Matlab para aproximar las siguientes señales periódicas en tiempo continuo, dibujando 5 ciclos de cada una:
a) Onda Cuadrada, de amplitud 5 Volts, frecuencia fundamental 20 Hz y ciclo útil del 60%.
b) Señal diente de sierra, amplitud 5 Volts y frecuencia fundamental 20Hz
Código y ejemplos con diferentes iteraciones de un filtro pasa bajas de promedio ponderado
Estas dos figuras se obtuvieron con pequeñas modificaciones del código que aquí se presenta. En el primer caso se realizaron 10,000 iteraciones del mismo filtro. El tiempo que tomo fue considerable y su filtradrado fue bueno. Sin embargo con 1,000 iteracciones el filtrado es malo y el tiempo no se reduce considerablemente, lo cual es lógico pues disminuyo en un factor de 10 las iteraciones, aunque siguen siendo muchas iteraciones 1,000. Estos son sólo ejemplos de cómo aplicar filtros de promedios ponderados hay filtros alternativos que son más rápidos y eficaces en la tarea asignada. El ejercicio sirve para ver las entrañas de estos filtros.
clc
clear
close all
x = 0.0:0.001:3*pi;
yy = sin(0.5*x)+sin(40*x); % la frecuencia a limpiar es la de 40, la cual es relativamente grande
subplot(3,1,1)
plot(x,yy) % primero vemos como es la señal original
% limpiar señal
% y(k) = yy(k-1) + 2*yy(k) + yy(k+1)
final = length(yy);
y = yy;
for m =1:10000 % hacemos muchas iteraciónes pues el filtro es poco eficiente
for k =2:final-1
y(k) = (0.25)*(y(k-1) + 2*y(k) + y(k+1)); % filtro pasa bajas
end
end
subplot(3,1,2)
plot(x,y) % el resultado lo vemos aqui.
subplot(3,1,3)
hold on
plot(sin(0.5*x),y) % el resultado lo vemos aqui.
plot(y,y, '--k') % el resultado lo vemos aqui.
hold off
Suscribirse a:
Comentarios (Atom)









