Programación de funciones, vectores, matrices y ... · Programación de funciones, vectores,...

22
Programación de funciones, vectores, matrices y transformadas de Fourier con MATLAB Siguiendo los ejemplos presentados en este capítulo, usted ganará una cierta familiaridad con MATLAB, aprender cómo implementar una función, calcular la transformada de Fourier discreta, y comparar el resultado con la teoría analítica. Para fines de instrucción, la mayoría de los ejemplos son problemas unidimensionales (1D), pero los de dos dimensiones se introducen al final del capítulo. MATLAB es un software de aplicación para las matemáticas y gráficos con su propio lenguaje interpretativo, que es ampliamente utilizado para la simulación y modelado en disciplinas científicas y de ingeniería. Está optimizado para las operaciones vectoriales y matriciales y, por lo tanto, es una buena herramienta para simulaciones de óptica de Fourier, que generalmente implican al menos dos dimensiones. Los ejemplos de este capítulo y en todo el libro utilizan un conjunto básico de funciones de MATLAB, en parte para mantener el material en un nivel tutorial, pero también porque los detalles de los pasos de programación son más evidentes. A medida que se familiarice con el software, es posible encontrar formas más convenientes y eficientes para poner en práctica la programación. MATLAB versión 7.1 se utiliza en este libro. 3.1 Definición de funciones Abriendo MATLAB . Las ventanas que aparecen comúnmente incluyen el "directorio actual", "ventana de comandos," e "Historia de comando." Estas ventanas se agrupan a menudo juntos como parte de la ventana principal que comprende el "Escritorio" de MATLAB (Fig. 3.1). El directorio actual muestra la carpeta en la que se almacenará su trabajo y los archivos que se encuentran en esa carpeta relacionada con MATLAB. El código se puede introducir en la ventana de comandos donde se ejecuta una línea a la vez que se introduce. Salida numérica , tales como el valor de una variable, también se puede mostrar en la ventana de comando. El historial de comandos muestra una lista compacta de los comandos que se han introducido en la ventana de comandos. Otra ventana importante que se puede sacar es la

Transcript of Programación de funciones, vectores, matrices y ... · Programación de funciones, vectores,...

Page 1: Programación de funciones, vectores, matrices y ... · Programación de funciones, vectores, matrices y transformadas de Fourier con MATLAB Siguiendo los ejemplos presentados en

Programación de funciones, vectores, matrices y transformadas de Fourier

con MATLAB

Siguiendo los ejemplos presentados en este capítulo, usted ganará una cierta

familiaridad con MATLAB, aprender cómo implementar una función, calcular

la transformada de Fourier discreta, y comparar el resultado con la teoría

analítica. Para fines de instrucción, la mayoría de los ejemplos son problemas

unidimensionales (1D), pero los de dos dimensiones se introducen al final del

capítulo. MATLAB es un software de aplicación para las matemáticas y

gráficos con su propio lenguaje interpretativo, que es ampliamente utilizado

para la simulación y modelado en disciplinas científicas y de ingeniería. Está

optimizado para las operaciones vectoriales y matriciales y, por lo tanto, es

una buena herramienta para simulaciones de óptica de Fourier, que

generalmente implican al menos dos dimensiones. Los ejemplos de este

capítulo y en todo el libro utilizan un conjunto básico de funciones de

MATLAB, en parte para mantener el material en un nivel tutorial, pero

también porque los detalles de los pasos de programación son más

evidentes. A medida que se familiarice con el software, es posible encontrar

formas más convenientes y eficientes para poner en práctica la

programación. MATLAB versión 7.1 se utiliza en este libro.

3.1 Definición de funciones

Abriendo MATLAB . Las ventanas que aparecen comúnmente incluyen el

"directorio actual", "ventana de comandos," e "Historia de comando." Estas

ventanas se agrupan a menudo juntos como parte de la ventana principal

que comprende el "Escritorio" de MATLAB (Fig. 3.1). El directorio actual

muestra la carpeta en la que se almacenará su trabajo y los archivos que se

encuentran en esa carpeta relacionada con MATLAB. El código se puede

introducir en la ventana de comandos donde se ejecuta una línea a la vez que

se introduce. Salida numérica , tales como el valor de una variable, también

se puede mostrar en la ventana de comando. El historial de comandos

muestra una lista compacta de los comandos que se han introducido en la

ventana de comandos. Otra ventana importante que se puede sacar es la

Page 2: Programación de funciones, vectores, matrices y ... · Programación de funciones, vectores, matrices y transformadas de Fourier con MATLAB Siguiendo los ejemplos presentados en

"ventana del editor," donde el código se puede introducir y guardar como un

archivo (un archivo con la extensión M ".m"). Dos tipos diferentes de archivos

M se pueden crear: un script o una función. Un script es un conjunto de

líneas de código que se puede ejecutar como un programa. Cuando se

ejecuta una secuencia de comandos, salida numérica aparece en la ventana

de comandos. Los archivos de función M se pueden llamar desde la ventana

de comandos o desde un script para hacer una tarea particular y devolver un

resultado. Los ejemplos presentados aquí se describen como siendo

introducido en la ventana del Editor, que permite a su script que se guarda

en un archivo-M; pero, el código también se puede introducir directamente y

ejecutarlo en la ventana de comandos.

Page 3: Programación de funciones, vectores, matrices y ... · Programación de funciones, vectores, matrices y transformadas de Fourier con MATLAB Siguiendo los ejemplos presentados en

Lo primero que debe hacer es hacer una nueva carpeta para su trabajo. En la

barra de herramientas encima del directorio actual, haga clic en el icono

"Nueva carpeta" y una carpeta debería aparecer con un cursor posicionado

para introducir el nombre de la carpeta. Escribir un nombre, como "Óptica de

Fourier", y haga clic en cualquier lugar de la línea de la carpeta o pulse la

tecla Enter. A continuación, hacer doble clic en esta carpeta en la ventana del

directorio actual para abrirla como su área de almacenamiento actual.

El primer paso de la programación será la creación de una función

rectangular (rect). Una vez creada, esta pieza de código se puede llamar

desde un script para generar un vector que contiene una función rectángulo

en la muestra. Acceda a la ventana del editor, haciendo clic en el icono Nuevo

en archivos M (un icono en documentos similares), que se encuentra en el

extremo izquierdo de la barra de herramientas del escritorio principal de

MATLAB. Un cursor junto a la línea número 1 debería aparecer en la ventana.

Escriba lo siguiente:

1 function[out]=rect(x);

2 % rectangle function

3

4 out=abs(x)<=1/2;

5 end

Para ello, simplemente escriba a cabo cada línea, y pulsa la tecla Intro al final

de cada línea. MATLAB utiliza un formato de texto simple, por lo que las

teclas de función especiales no son necesarias para la introducción del

código. El carácter "%" indica que el texto que sigue es un comentario y no se

debe interpretar para su ejecución. Algunos de los textos en la pantalla será

de color. El texto del comentario se muestra en verde. Como siempre, la

documentación de su código es importante y algunos comentarios se

incluyen en los ejemplos que se presentan en este libro; pero, en general, se

Page 4: Programación de funciones, vectores, matrices y ... · Programación de funciones, vectores, matrices y transformadas de Fourier con MATLAB Siguiendo los ejemplos presentados en

mantienen al mínimo para mantener la concisa presentación. Los

comentarios también se pueden añadir en la misma línea que sigue al código.

Texto de color azul indica una función de funciones de MATLAB. El comando

función configura este archivo-M a una función llamada "rect" con un vector

de entrada "x" y un vector de salida "hacia fuera." MATLAB es más hábil con

las operaciones vectoriales y matriciales, por lo que el código tiende a

involucrar variables que son vectores y matrices en lugar de los parámetros

individuales. El código en la línea 4 utiliza una función de prueba lógica

vectorizada en MATLAB. El comando "ABS" toma el valor absoluto de cada

elemento x , y "<=" se aplica el "menor o igual" de prueba para cada

elemento. Si la prueba es "verdadero" (menos de 0 igual a 1/2), entonces se

devuelve 1 para ese elemento. Si la prueba es "falsa", se devuelve un 0. El

vector de salida tiene el mismo número de elementos que x, y contendrá la

función rectángulo muestreada. El punto y coma al final de una línea suprime

la salida en la ventana de comandos cuando se ejecuta el código.

En el código de rect, las muestras en los bordes del rectángulo no se les

permite tomar un valor de 1/2 como en la definición de una función analítica

rectángulo (ver sección 1.5). Si lo hace, puede ser interpretado como una

"pendiente" en el borde en lugar de una transición brusca, por lo que optan

por trabajar con una transición de un solo punto. La codificación que

utilizamos para rect tiene la característica de que la anchura total de la

función siempre se crea con un número impar de muestras. Si surge una

situación sobre la que se solicita un rectángulo con un número par de

muestras, se devolverá una muestra más de lo esperado. Algunos de los

ejemplos en el libro utiliza un valor de anchura o el radio que no es un

número de esta ronda,es simplemente consistente con el número impar de

muestras que se devolverán al llamar a rect.

Cuando haya terminado de escribir el código, haga clic en "Guardar" (icono

del disquete) en la barra de herramientas de la ventana Editor y guardar la

función con el nombre "rect." Se recomienda que el nombre del archivo será

el mismo que el nombre de la función. Un archivo-M con el nombre "rect.m"

Page 5: Programación de funciones, vectores, matrices y ... · Programación de funciones, vectores, matrices y transformadas de Fourier con MATLAB Siguiendo los ejemplos presentados en

debe aparecer en la ventana del directorio actual. Cierre la ventana del

editor. La función "rect" ahora puede ser llamado por cualquier otro script

que está operando dentro de la carpeta "Óptica de Fourier".

3.2 Creación de vectores

Supongamos que queremos programar una simulación de una función

espacial rectángulo 1D con una anchura media de 0,055 m (ancho total de

0,11 m). Esta función rectángulo se crea en un vector que corresponde a una

longitud física (lado de longitud L) de 2 m. Si el número de muestras en el

vector es 200, entonces el intervalo de muestreo ∆x (o "dx" en el código) es

0,01 m. Haga clic en Nuevo archivo-M y abra una nueva ventana del editor

para ir a la barra de herramientas principal de escritorio de MATLAB . En la

nueva ventana, introduzca las siguientes líneas:

1 % fft_example - Chapter 3 fft example

2

3 w=0.055; %rectangle half-width (m)

4 L=2; %vector side length (m)

5 M=200; %number of samples

6 dx=L/M; %sample interval (m)

Aquí, se definen los parámetros para el tamaño físico del rectángulo, la longitud del lado

del vector, el número de muestras, y el intervalo de la muestra. Agregue el código

siguiente:

7 x=-L/2:dx:L/2-dx; %coordinate vector

8 f=rect(x/(2*w)); %signal vector

El "*" indica multiplicación. En este código, el vector de coordenadas x se

crea con valores que van desde -1 (= -L / 2) a 0,99 (= L / 2-dx) en pasos de

0,01 (dx). Los dos puntos separan el tamaño y rango de paso. La sustracción

de un paso fuera del límite alto se traduce en un vector de 200 muestras. La

señal vector "f" se crea con la ayuda de la función rect previamente definido

Page 6: Programación de funciones, vectores, matrices y ... · Programación de funciones, vectores, matrices y transformadas de Fourier con MATLAB Siguiendo los ejemplos presentados en

y el uso de la coordenada del vector x. Asi 2 * w es un escalar, la

interpretación es que cada muestra en x se divide por 2 * w y el vector

resultante se introduce en la función rect. Para mostrar lo que han creado en

un gráfico de los valores de f en contra de los valores de x, agregue las

siguientes líneas:

9 figure(1)

10 plot(x,f); %plot f vs x

El comando "figura (1)" abre una ventana llamada "Figura 1" y "plot" hace

una gráfica. Antes de ejecutar esta secuencia de comandos, es necesario

guardarlo en un disco. Haga clic en Guardar en la barra de herramientas de la

ventana del editor y guarde este archivo-m con el ejemplo de nombre de

FFT. No utilice espacios en el nombre, ya que puede ser interpretado como

una solicitud para enlazar a otra función; para ejecutar, haga clic en Ejecutar

en la barra de herramientas de la ventana del editor (un icono de triángulo o

de versiones anteriores de MATLAB una flecha al lado de un icono de

documento). Si no hay errores en el código, la gráfica de f debe aparecer en

la ventana de la Figura 1. Si hay algún problema con el código, verá un

mensaje en la ventana de comandos. La gráfica debe ser similar a la Fig. 3.2.

Page 7: Programación de funciones, vectores, matrices y ... · Programación de funciones, vectores, matrices y transformadas de Fourier con MATLAB Siguiendo los ejemplos presentados en

Hay muchas opciones para ajustar la visualización gráfica, que incluyen el

cambio de los límites de los ejes, la adición de etiquetas, y el cambio de

líneas y símbolos gráficos. Un método consiste en utilizar el editor de la

barra de herramientas que aparece en la parte superior de cada ventana de

la figura "Editar grafica" (icono de la flecha). En este tutorial no vamos a ir

sobre el uso de este editor y el lector es referido a la "ayuda" de MATLAB

para aprender más (el icono "?"en la ventana del escritorio de MATLAB).

El editor de gráficos es una manera de trabajar de forma interactiva con la

pantalla. Sin embargo, los cambios realizados en la grafica no se registran en

el código; así, la próxima vez que se ejecuta la secuencia de comandos, la

gráfica se mostrará como lo era antes de la edición. Las órdenes pueden ser

incluidos en la secuencia de comandos para ajustar la grafica. En nuestro

ejemplo, volviendo atrás y editar el último comando plot y añadir los” eje" y

la etiqueta para "x” en las líneas de comandos:

11 figure(2)

12 plot(x,f,'-o'); %plot f vs x

13 axis([-0.2 0.2 0 1.5]);

14 xlabel('x(m)');

La opción adicional en el comando plot ('-o') coloca el marcador “o” en cada

muestra de la gráfica. El comando axis limita el conjuntos de valores

graficados sobre los ejes X e Y , y el comando xlabel etiqueta el eje X. El

comando figura (2) abrirá una segunda ventana para esta nueva gráfica. Sin

este comando, la nueva grafica podría sobrescribirse en la primera grafica de

la ventana de la Figura 1. Tenga en cuenta que las declaraciones para

modificar la grafica vienen después de la llamada gráfica.

Haga clic en Run para ejecutar el código (esto también guarda

automáticamente la última versión del código) y la grafica que aparece en la

ventana de la Figura 2 (Fig. 3.3) muestra más claramente la función

rectángulo. Tenga en cuenta la distancia a través de la parte superior del

Page 8: Programación de funciones, vectores, matrices y ... · Programación de funciones, vectores, matrices y transformadas de Fourier con MATLAB Siguiendo los ejemplos presentados en

rectángulo corresponde a 0,1 m (11 muestras), mientras que la base del

rectángulo corresponde a 0,12 m (13 muestras). La interpretación correcta

para esta función rectángulo muestreada es una anchura de 0,11 m, que se

encuentra entre las dos medidas. De hecho, debido a que la codificación de la

función rect genera un número impar de muestras, si un ancho medio de

0,05 m se usar en lugar de 0,055 m, el vector de la señal resultante sería

idéntico al mostrado en la Fig. 3,3, lo que significa que habría una pequeña

disparidad con la anchura prevista y la representación digital.

3.3 Desplazamiento para la FFT

Sin tener en cuenta por un momento el vector de coordenadas x, en

términos de las 200 muestras en f, una función rectángulo con un ancho de

11 muestras se ha creado centrada en el medio del vector f. Esto puede ser

visualizado mediante la adición del siguiente código:

15 figure(3)

16 plot(f,'-o');

17 axis([80 120 0 1.5]);

18 xlabel('index');

Page 9: Programación de funciones, vectores, matrices y ... · Programación de funciones, vectores, matrices y transformadas de Fourier con MATLAB Siguiendo los ejemplos presentados en

Con el argumento x removido por el comando plot, el vector f se representa

gráficamente como una función de los valores de índice del vector. La grafica

resultante (Fig. 3.4) presenta la muestra de la función de rectángulo centrada

en la posición de índice 101. Centrar el rectángulo en el medio del vector

permite una fácil visualización, pero como se describe en la Sección 2.4, el

algoritmo de FFT espera que el valor cero coordenado este en la primera

ubicación de índice. Para cambiar los valores para la operación de FFT, el

comando "fftshift" se puede aplicar, él cual toma las muestras de la primera

mitad del vector y los permuta con las muestras en la segunda mitad.

Agregue el siguiente código al programa y ejecutar el script para obtener el

diagrama de la Fig. 3.5.

19 f0=fftshift(f); %shift f

20 figure(4)

21 plot(f0);

22 axis([0 200 0 1.5]);

23 xlabel('index');

Page 10: Programación de funciones, vectores, matrices y ... · Programación de funciones, vectores, matrices y transformadas de Fourier con MATLAB Siguiendo los ejemplos presentados en

Un vistazo de cerca a la figura 3.5 nos debe convencer de que la muestra del

rectángulo se encuentra centrada en la ubicación de índice 1, y cinco

muestras se encuentran a la "derecha" y los cinco restantes a la "izquierda",

en el que el grupo de la izquierda se coloca al final del vector.

Algunos comentarios sobre el cambio de la FFT: en primer lugar, es más fácil

de usar un número par de M muestras para el vector y el centro de la función

de interés a un índice de M / 2 + 1. La función fftshift entonces cambiará la

muestra M / 2 + 1 a Índice 1. En nuestro ejemplo M = 200 y la definición del

vector x hace que la función rectángulo sea centrada en la M / 2 + 1 posición

(101). Más cuidado hay que tener cuando se cambia vectores que contienen

un número impar de muestras. Por ejemplo, si la función fftshift se utiliza con

un número impar de muestras, entonces la función ifftshift se debe utilizar

para deshacer el cambio. Para un número par de muestras, la función fftshift

funciona tanto hacia delante como hacia atrás. Una segunda observación es

que sin la operación de cambio del algoritmo FFT genera una transformada

de una función que es trasladada por la posición cero, lo que significa que un

término de fase lineal estará presente en el resultado (teorema de cambio!).

Page 11: Programación de funciones, vectores, matrices y ... · Programación de funciones, vectores, matrices y transformadas de Fourier con MATLAB Siguiendo los ejemplos presentados en

3.4 Computación de la FFT y visualización de resultados

Para calcular la FFT del vector "f0", adicione lo siguiente a continuación de la

última pieza de código:

24 F0=fft(f0)*dx; %FFT and scale

25 figure(5)

26 plot(abs(F0)); %plot magnitude

27 title('magnitude');

28 xlabel('index');

29

30 figure(6)

31 plot(angle(F0)); %plot phase

32 title('phase');

33 xlabel('index');

Aquí el algoritmo de la FFT en 1D es usado. Una letra capital es usada para el

vector de dominio de frecuencia. Multiplicar el resultado por el espacio de

muestra dx es necesario para aproximarnos correctamente a la integral

analítica de la transformada de Fourier. Entonces, cada muestra de F0

contiene dos partes de información (la parte real y la parte imaginaria); o

alternativamente, la magnitud y fase, dos graficas pueden ser usada para

visualizar estos resultados. El comando “abs” toma el valor absoluto

(magnitud) de la muestra de F0 y el comando”angle” extrae la fase de la

muestra, con rango de valores de salidas de –π a π. Los títulos de las gráficas

y las leyendas del eje x son incluido en este código. Ejecutar el script ylas

gráficas aparecen en la Fig 3.6.

Page 12: Programación de funciones, vectores, matrices y ... · Programación de funciones, vectores, matrices y transformadas de Fourier con MATLAB Siguiendo los ejemplos presentados en

Figure 3.6 (a) Magnitude and (b) phase plots for FFT result versus index.

La naturaleza del resultado en magnitud de la función sinc mostrado en la fig. 3.6 es evidente que el pico de la sinc se centra en el índice 1. Sin embargo, tenga en cuenta que las muestras no se encuentran exactamente donde se producirían los "ceros" de la magnitud. Por lo tanto, los valles mostrados en la curva no necesariamente parecen llegar a cero. El diagrama de fase puede parecer curioso, pero hay esencialmente tres valores de fase

en la trama: 0, -, y . Sin embargo, - y representar el mismo valor en un

formato de módulo 2, por lo que las transiciones bruscas en la trama entre -

y no son particularmente importantes, y la fase es efectivamente

constante en estos lugares. Estos afilados transiciones en 2 se producen debido a pequeñas diferencias numéricas entre las muestras. Con esta interpretación, se debe entender que la transición de fase importante es de 0

a (o -), que se produce aproximadamente cada 18 puntos. Comparando el

diagrama de fase con el gráfico de magnitud, es evidente que la transición

se produce en los ceros de magnitud. Por otra parte, un valor de fase de es equivalente a poner un signo menos en el valor de magnitud. La combinación de todos estos datos, la magnitud y fase graficadas en la Fig. 3.6 representan una función sinc de valor real, donde los valores en el lóbulo principal son positivos, los valores de los primeros lóbulo son negativos, los segundos valores de lóbulo son positivos, y así sucesivamente. En este caso, la función sinc de valor real podría simplemente haber sido mostrada en una gráfica; pero, en general, los resultados de la transformada de Fourier son complejos.

Page 13: Programación de funciones, vectores, matrices y ... · Programación de funciones, vectores, matrices y transformadas de Fourier con MATLAB Siguiendo los ejemplos presentados en

Una vez más, por razones de visualización, es útil centrar el resultado de la FFT en el vector. Además, las coordenadas de frecuencia espacial necesitan ser determinadas. Agregue lo siguiente a la secuencia de comandos (cortar y pegar desde el código anterior puede ayudar a lograr esto de manera rápida): 34 F=fftshift(F0); %center F 35 fx=-1/(2*dx):1/L:1/(2*dx)-(1/L); %freq cords 36 37 figure(7) 38 plot(fx,abs(F)); %plot magnitude 39 title('magnitude'); 40 xlabel('fx (cyc/m)'); 41 42 figure(8) 43 plot(fx,angle(F)); %plot phase 44 title('phase'); 45 xlabel('fx (cyc/m)'); Las coordenadas de frecuencia en fx se crean como se define en la Sección 2.4. La ejecución del script genera las gráficas que se muestran en la Fig. 3,7, donde la muestra de la magnitud de Fourier y la fase son centradas, y el eje de frecuencia se escala de manera apropiada.

3.5 Comparación con los resultados analíticos

Cuando sea posible, es una buena práctica para probar una nueva pieza de

código mediante la aplicación de las entradas simples, donde el resultado

puede ser comparado con un resultado analítico. Esto ayuda a diagnosticar

problemas y le permite construir el código anterior con confianza. Para el

ejemplo dado en la Sección 3.4, un resultado analítico se encuentra

fácilmente. Para la expresión

2

xf x rect

La transformada de Fourier es

2 sinc 2x xF f f

Page 14: Programación de funciones, vectores, matrices y ... · Programación de funciones, vectores, matrices y transformadas de Fourier con MATLAB Siguiendo los ejemplos presentados en

Para comparar el resultado discreto con el resultado analítico, agregue el

siguiente código al el script del "ejemplo de la fft":

46 F_an=2*w*sinc(2*w*fx); %analytic result 47 48 figure(9) 49 plot(fx,abs(F),fx,abs(F_an),':'); %plot magnitude 50 title('magnitude') 51 legend('discrete','analytic') 52 xlabel('fx (cyc/m)') 53 54 figure(10) 55 plot(fx,angle(F),fx,angle(F_an),':'); %plot phase 56 title('phase') 57 legend('discrete','analytic') 58 xlabel('fx (cyc/m)')

Aquí, la coordenadas de frecuencia fx se utilizan como entrada a la solución

analítica para crear el vector F_an. Tenga en cuenta que MATLAB utiliza la

función integrada sinc , ya que se ajusta a nuestra definición (véase la tabla

1.2). Los argumentos del comando plot se establecen para representar

gráficamente los resultados discretos y analíticos sobre la misma gráfica, y las

leyendas se añaden a la pantalla.

Figure 3.7 (a) Magnitude and (b) phase plots for centered FFT result.

Page 15: Programación de funciones, vectores, matrices y ... · Programación de funciones, vectores, matrices y transformadas de Fourier con MATLAB Siguiendo los ejemplos presentados en

Las gráficas resultantes (Fig. 3.8) comparan la FFT y los resultados analíticos.

Los resultados de magnitud son casi idénticos, pero el resultado de la FFT

tiene valores ligeramente más altos que la curva analítica en los bordes. Este

es el resultado de la propiedad de extensión periódica de la FFT (Sección 2.5).

Los gráficos de fase sólo se diferencian en algunas transiciones entre y -

para el resultado digital, que son de ninguna consecuencia.

3.6 Ejemplo de convolución Una convolución se puede realizar utilizando la FFT y aplicando el teorema de

convolución de Fourier. El ejemplo que aquí se presenta implica la

convolución de dos funciones gaussianas de diferentes anchuras. En la

ventana del editor, seleccione Nuevo archivo M e introduzca el siguiente

código que define y genera valores de muestra para las dos funciones fa y fb:

1 % conv_example - Convolution: two Gaussian functions 2 3 wa=0.3; %Gaussian 1 width [exp(-pi) radius](m) 4 wb=0.2; %Gaussian 2 width [exp(-pi) radius](m) 5 L=2; %side length (meters) 6 M=200; %number of samples 7 dx=L/M; %sample interval (m) 8 9 x=[-L/2:dx:L/2-dx]; %x coordinates 10 fa=exp(-pi*(x.^2)/wa^2); %Gaussian a 11 fb=exp(-pi*(x.^2)/wb^2); %Gaussian b 12 13 figure(1) 14 plot(x,fa,x,fb,'--'); title ('functions'); 15 xlabel('x (m)');

Page 16: Programación de funciones, vectores, matrices y ... · Programación de funciones, vectores, matrices y transformadas de Fourier con MATLAB Siguiendo los ejemplos presentados en

Figure 3.8 Comparison of (a) magnitude and (b) phase of FFT and analytic results.

Seleccione el nombre de "conv_example" para este archivo-M. Tenga en

cuenta el comando con el símbolo "^" para elevar al cuadrado cada valor de x

en el vector requerido antes de un período. Sin el período, MATLAB intentará

un vector en vez de una sola operación de elemento. La ejecución de este

código produce el diagrama que se muestra en la Fig. 3.9 (a). Ahora agregue

la siguiente para calcular y graficar el resultado de convolución:

16 Fa=fft(fa); %transform fa

17 Fb=fft(fb); %transform fb

18 F0=Fa.*Fb; %multiply pointwise

19 f0=ifft(F0)*dx; %inverse transform and scale

20 f=fftshift(f0); %center result

21

22 figure(2)

23 plot(x,f); title('convolution')

24 xlabel('x (m)')

Page 17: Programación de funciones, vectores, matrices y ... · Programación de funciones, vectores, matrices y transformadas de Fourier con MATLAB Siguiendo los ejemplos presentados en

Figure 3.9 (a) Two Gaussian functions and their (b) convolution result.

Las FFTs de los vectores de Gauss se calculan primero. Las funciones fa y fb

no necesitan ser cambiados antes de las FFT ya que la convolución solo

depende de sus posiciones relativas. Los resultados de las transformadas

siguientes se multiplican "punto a punto" o elemento por elemento. Esta

operación se indica con un período colocado antes que el operador producto

(. *). Sin el período la multiplicación de matrices o vectores pude ser un

intento. Al ejecutar el código produce el resultado mostrado en la Fig. 3.9

(b).

Como se introdujo en la sección 2.6, una consideración crítica para una

convolución calculado de esta manera es la propiedad de extensión periódica

de la FFT. El criterio es que la suma de los soportes de la función debe ser

menor que la longitud del vector. De la Fig. 3.9 (a), el soporte estimada de los

valores significativos en la primera gaussiana es Da ≈ 0,9 m y para el segundo

Db ≈ 0,6, por lo que la suma de estos dos es menor que la longitud del vector

L = 2 m. Ejercicio 3.2 le da la oportunidad de comprobar si la curva de la Fig.

3.9 (b) es de hecho una buena representación de la convolución analítica.

En este libro circunvoluciones están codificados directamente aplicando el

teorema de convolución, pero MATLAB tiene la función conv incorporado y

de dos dimensiones, CONV2. Para evitar estrictamente artefactos debido a la

coexistencia periódica, estas funciones se “llenan con cero" los vectores

iniciales, colocándolos en los vectores de tamaño doble o series de ceros, y

Page 18: Programación de funciones, vectores, matrices y ... · Programación de funciones, vectores, matrices y transformadas de Fourier con MATLAB Siguiendo los ejemplos presentados en

luego se realizan la convolución. Para la velocidad y la eficiencia

computacional se tienden a trabajar con tamaños de matriz fijas y prestar

atención al apoyo de las señales, como se hizo en el ejemplo anterior.

3.7 Dos Dimensiones

Problemas de la óptica física implican típicamente al menos dos dimensiones

espaciales. Iniciar un nuevo archivo-M, llamado fft2- ejemplo, e introduzca el

código siguiente para generar una muestra de la función rectángulo de dos

dimensiones (2D):

1 % fft2_example - 2D FFT example

2

3 wx=0.1; %rect x half-width (m)

4 wy=0.05; %rect y half-width (m)

5 L=2; %side length x&y (m)

6 M=200; %samples/side length

7 dx=L/M; %sample interval (m)

8 x=-L/2:dx:L/2-dx; %x coordinates

9 y=x; %y coordinates

10 [X,Y]=meshgrid(x,y); %X and Y grid coords

11 g=rect(X/(2*wx)).*rect(Y/(2*wy)); %signal

En este ejemplo, un rectángulo de 0,2 x 0,1 m se modela en un conjunto de

elementos de 200 x 200 que corresponde a un tamaño físico de 2 x2 m. La

longitud lateral L es la longitud física a lo largo de un borde de la matriz en

donde se supone que las dimensiones X e Y son las mismas. Dos vectores de

coordenadas x e y de muestra idéntica se definen para las dos dimensiones.

El comando "meshgrid" genera las matrices X e Y (mayúsculas), donde las

filas de X son copias del vector x y las columnas de Y son copiadas de y. X e Y

Page 19: Programación de funciones, vectores, matrices y ... · Programación de funciones, vectores, matrices y transformadas de Fourier con MATLAB Siguiendo los ejemplos presentados en

se utilizan para producir la versión muestreada de la función rect 2D en la

matriz g. Mediante el uso de X e Y, la versión codificada de g aparece mucho

como una expresión analítica.

Una imagen es una forma común de visualizar el resultado de la simulación

óptica. Para visualizar el contenido de g como una imagen, añada lo

siguiente:

12 figure(1)

13 imagesc(x,y,g); %image display

14 colormap('gray'); %linear gray display map

15 axis square; %square figure

16 axis xy %y positive up

17 xlabel('x (m)'); ylabel('y (m)');

El comando "imagesc" Escalas de la matriz de datos para el rango de

visualización completa y presenta la imagen y “colormap” proporciona una

pseudo-color de la imagen. La escala de "gris" se utiliza aquí, pero consulte

Ayuda para otros mapas de colores. El comando “axis square” presenta la

frontera de la figura como un cuadrado en lugar de la forma rectangular

predeterminada. Esto es útil en este caso en el que la longitud del lado es el

mismo en las direcciones x e y. La primera fila de un archivo de imagen

convencional corresponde a la parte superior de la imagen. Funciones de

visualización de imágenes en MATLAB asignan valores del eje y para

aumentar de arriba a abajo. El comando axis xy organiza el eje y que se

mostrará con el aumento de los valores de abajo hacia arriba. La ejecución

del script produce la imagen mostrada en la Fig. 3.10 (a).

De los resultados 2D, también suele ser útil ver "rebanadas" o perfiles 1D.

Para generar un perfil 1D del eje x a través del centro de la matriz [Fig. 3.10

(b)] Agregue el código siguiente, donde la sintaxis (M / 2 + 1, :) selecciona la

fila M / 2 + 1:

Page 20: Programación de funciones, vectores, matrices y ... · Programación de funciones, vectores, matrices y transformadas de Fourier con MATLAB Siguiendo los ejemplos presentados en

18 figure(2)

19 plot(x,g(M/2+1,:)); %x slice profile

20 xlabel('x (m)');

21 axis([-1,1,0,1.2]);

Figure 3.10 (a) Image and (b) x profile of 2D rectangle example.

Para realizar una FFT 2D de la función rectángulo, agregue lo siguiente:

22 g0=fftshift(g); %shift

23 G0=fft2(g0)*dx^2; %2D fft and dxdy scaling

24 G=fftshift(G0); %center

25

26 fx=-1/(2*dx):1/L:1/(2*dx)-(1/L);%x freq coords

27 fy=fx; %y freq coords

El comando fftshift opera en una matriz 2D de la manera descrita en la

Sección 2.4 y se necesita el comando fft2 para una transformada 2D. Escriba

el siguiente código para mostrar la magnitud de los resultados de la

transformada en un diagrama de superficie junto con una rebanada de perfil

a través del centro (Figura 3.11.):

Page 21: Programación de funciones, vectores, matrices y ... · Programación de funciones, vectores, matrices y transformadas de Fourier con MATLAB Siguiendo los ejemplos presentados en

28 figure(3)

29 surf(fx,fy,abs(G)) %display transform magnitude

30 camlight left; lighting phong

31 colormap('gray')

32 shading interp

33 ylabel('fy (cyc/m)'); xlabel('fx (cyc/m)');

34

35 figure(4)

36 plot(fx,abs(G(M/2+1,:))); %fx slice profile

37 title('magnitude');

38 xlabel('fx (cyc/m)');

El comando de grafica “surf” se introduce para ilustrar otro método de

visualización para una matriz 2D. Los comandos lighting, shading, y colormap

se pueden utilizar para cambiar la visualización. La magnitud también se

podría mostrar en otras formas, tales como una imagen o un gráfico de

contorno. La fase del resultado no se muestra aquí, pero también se podría

mostrar en una variedad de maneras.

Page 22: Programación de funciones, vectores, matrices y ... · Programación de funciones, vectores, matrices y transformadas de Fourier con MATLAB Siguiendo los ejemplos presentados en

Figure 3.11 (a) Surface plot display and (b) profile of 2D FFT magnitude result.