D Cálculo de series y transformadas de Fourier usando Mathematica En este apéndice se presenta una forma sencilla de calcular los coeficientes de Fourier y las transformadas usando Mathematica. No pretende ser una introducción a un programa tan sofisticado, sino proveer algunas herramientas para evitar laboriosos cálculos manuales. La principal función a utilizar es Integrate[]. El comando Integrate[f, {x, xmin, xmax}] devuelve la integral definida siguiente ejemplo. R xmáx xmı́n f ( x ) dx. El uso de otros comandos se ilustra en el Fig. D.1. Señal periódica x̃ (t). E JEMPLO D.1. Cálculo de la serie de Fourier de un tren de pulsos triangulares Se desea calcular los coe…cientes de Fourier del tren de pulsos triangulares que se muestra en la Fig. D.1. La expresión de los coe…cientes está dada por la ecuación (2.30), (página 85) ck = 1 T0 Z T0 x (t)e j 2π T kt 0 dt, y en este caso es necesario separar la integral en seis partes, una para cada una de las rectas de 293 D. Cálculos con Mathematica 294 Fig. D.2. Detalle de un período del tren de pulsos triangular. pendientes ck 12A/T0 como se representa en la Fig. D.2. Entonces, = Z T0 /6 1 T0 T0 /4 Z 1 0 T0 T0 /12 Z T0 /6 1 T0 T0 /12 Z T0 /12 1 j 2π kt 12A t A e T0 dt + T 0 T0 T0 /6 Z T0 /12 2π 1 j T kt j 2π kt 12A 12A 0 dt + t + A e T0 dt + T0 t + A e T 0 T0 0 Z 2π 1 T0 /4 j T kt j 2π kt 12A 12A 0 dt + t A e t + 3A e T0 dt. T0 T 0 T0 T0 /6 12A T0 t + 3A j 2π T kt e 0 dt + El código en Mathematica para calcular esta integral es casi una copia de la expresión anterior: In[1]:= ck = (Integrate[((12 A /T0)t + 3A)Exp[-(I 2 π k/T0)t], {t, -T0/4, -T0/6}] + Integrate[(-(12 A/T0)t - A)Exp[-(I 2 π k/T0)t], {t, -T0/6, -T0/12}] + Integrate[((12 A/T0)t + A)Exp[-(I 2 π k/T0)t], {t, -T0/12, 0}] + Integrate[(-(12 A/T0)t + A)Exp[-(I 2 π k/T0)t], {t, 0, T0/12}] + Integrate[((12 A/T0)t - A)Exp[-(I 2 π k/T0)t], {t, T0/12, T0/6}] + Integrate[(-(12 A/T0)t + 3A)Exp[-(I 2 π k/T0)t], {t, T0/6, T0/4}])/T0 Las letras griegas se pueden ingresar utilizando la tecla ‹Esc› y la letra latina equivalente: por ejemplo, π se ingresa como ‹Esc›p‹Esc›, α como ‹Esc›a‹Esc›, etc. La etiqueta “In[1]:=” es agregada por el programa cuando comienza a evaluar el comando, lo que ocurre apenas se presiona la tecla ‹Intro› del teclado numérico, o la combinación ‹Mayus›+‹Intro› del teclado común. Luego de algunos segundos, el programa responde con: Out[1]:= 0 BA 6 1 B ck= T0 @ ! 6 I kπ T0 I e 6 kπ 2k 2 π 2 I kπ 6 I kπ T0 I 2e 3 k π k 2 π 2 + 2k 2 π 2 6 + 6e + I I Ae 3 k π 6 6e 6 kπ +I kπ T0 I A 6 6e 6 kπ +I kπ T0 I Ae 6 kπ A I 6+e 6 kπ (6 I k π ) T0 A + 2k 2 π 2 + 2k 2 π 2 I 6+e 6 kπ (6 I kπ ) T0 I 2e 2 k π k 2 π 2 1 A Esta expresión se puede reducir utilizando el comando Simplify[] o FullSimplify[]: In[2]:= Ck = Simplify[ck] y, nuevamente, luego de algunos segundos, se obtiene Out[2]:= Ck = 12A 1 + 2Cos[ π3k ] Sin[ π12k ]2 Procesamiento Digital de Señales k2 π 2 U.N.S. 2011 295 Fig. D.3. Grá…co de los 10 primeros coe…cientes de Fourier, para A = 1. En Mathematica, los nombres de las funciones se escriben con mayúscula, y el argumento queda encerrado entre corchetes. Por ejemplo, la expresion Cos[π/2] devuelve 0, pero cos(π/2) devuelve (cos π )/2, que evidentemente es incorrecta. La expresión de los coe…cientes ck se puede simpli…car aún más (esta vez “a mano”), y …nalmente se obtiene que ih i2 A h k ck = 1 + 2 cos πk sinc 12 3 12 La función Sinc[] no está disponible en Mathematica, pero se puede de…nir de la siguiente manera: In[3]:= Sinc[x_]:=If[x==0,1,Sin[πx]/(πx)]; De esta forma, se puede de…nir los coe…cientes de Fourier como: In[4]:= A 1 + 2Cos Ck = 12 h πk 3 i h i k Sinc 12 2 ; Algunos valores de los coe…cientes se pueden generar utilizando el comando Table[]. En el siguiente fragmento de código, este comando está incluido dentro de la instrucción FullSimplify[] para obtener expresiones numéricas más sencillas: In[5]:= TCk = FullSimplify[Table[Ck,{k,0,10}] ] Out[5]:= ( A , 12 p 6( 2 + 3)A , 0, π2 p 2A 6(2 + 3)A A , 0, , 2, 3π 2 25π 2 π p 6(2 + 3)A , 0, 49π 2 2A ,0 27π 2 ) Los coe…cientes se pueden gra…car en función de k utilizando el comando ListPlot[]: ListPlot[Table[{k,Ck/.A->1},{k,0,10}], PlotStyle -> PointSize[0.02] ] obteniéndose el grá…co que se muestra en la Fig. D.3. Finalmente, se puede gra…car la aproximación utilizando el comando Plot[]. En este caso, dentro del comando Plot[] se efectúa la suma de un número …nito de términos de la serie. Si se supone A = 1 y T0 = 1, las instrucciones necesarias para gra…car la aproximación son: 1 k ])2 Exp[I 2 π k t], {k, -10, 10}], {t, -1, 1}, Plot[Sum[ 12 (1+2Cos[ k3π ]) (Sinc[ 12 PlotPoints -> 50, PlotRange -> All] El grá…co de la aproximación para la suma de 21 términos de la serie se muestra en la Fig. D.4( a) , y para 101 términos en la Fig. D.4(b) . Este ejemplo también muestra que el uso de las propiedades de la serie y la transformada facilita el cálculo de los coeficientes, como se detalla a continuación. Procesamiento Digital de Señales U.N.S. 2011 D. Cálculos con Mathematica 296 Fig. D.4. Reconstrucción del tren de pulsos triangulares a partir de la suma de 2 y 2 50 + 1 (b) términos de la serie de Fourier. 10 + 1 ( a) E JEMPLO D.2. Cálculo de los coe…cientes de Fourier del tren de pulsos triangulares utilizando propiedades La idea en este caso es calcular la transformada X ( f ) de un período de la señal periódica (por ejemplo, la que se muestra en la Fig. D.2), y a partir de ella calcular los coe…cientes de la serie, ck = 1 X ( f )j f =k/T0 . T0 La manera más sencilla parecer ser comenzando con la transformada de Fourier del pulso triangular que se extiende desde T0 /12 hasta T0 /12. Esta transformada p se puede calcular a partir de la convolución de dos pulsos rectangulares de ancho T0 /12, y alto A, como se propone en el Ejercicio 17. Aplicando la propiedad de convolución, se encuentra que la transformada de este único pulso triangular es h i2 T0 0 sinc f . X1 ( f ) = AT 12 12 Los transformadas de los dos pulsos triangulares a la izquierda y a la derecha del pulso central se calculan aplicando la propiedad de desplazamiento. El pulso de la izquierda está adelantado τ = T0 /6 unidades de tiempo y el pulso de la derecha está atrasado en la misma cantidad. Por lo tanto, la transformada del pulso de la izquierda es X2 ( f ) = e j2π T0 6 f X1 ( f ) y la del pulso de la derecha X3 ( f ) = e j2π T0 6 f X1 ( f ) . Combinando estos tres resultados, X( f ) = AT0 12 = AT0 12 1 + e j2π h T0 6 f j2π +e 1 + 2 cos 2π T60 f T0 6 ih f h sinc T0 12 f T0 12 i2 . sinc f i2 Finalmente, evaluando la transformada en f = k/T0 , y escalando por 1/T0 se encuentra que ck = A 12 h 1 + 2 cos π 3k ih sinc k 12 que evidentemente coincide con el resultado del ejemplo anterior. Procesamiento Digital de Señales i2 , U.N.S. 2011