Está en la página 1de 9

Transformadas discretas con aplicaciones al procesamiento de señales

Práctica 3: Transformada Discreta de Fourier

3. De una función periódica de período 2𝜋 se conocen los valores en los puntos 0, 𝜋/2, 𝜋
y 3𝜋/2 que son, respectivamente, 2; 4; 6; y 8. Usando la transformada discreta de Fourier,
calcular el valor aproximado de dicha función en 𝜋/4 interpolando mediante un polinomio
trigonometrico.

In [2]: 1 import matplotlib.pyplot as plt


2 import numpy as np

In [12]: 1 x=[0,np.pi/2,np.pi,3*np.pi/2]
2 y=[2,4,6,8]
3 dy=np.fft.fft(y) #DFT
4 #print(dy)
5 ​
6 plt.scatter(x, y, label='Puntos de la funcion') #Puntos dados de la fun
7 ​
8 c=[]
9 for i in np.arange(0,2*np.pi,0.2):
10 a=5-2*np.cos(i)-2*np.sin(i)-np.cos(2*i) #se calculo el polinomio a
11 c.append(a)
12 ​
13 f=5-2*np.cos(np.pi/4)-2*np.sin(np.pi/4)-np.cos(2*np.pi/4)
14 plt.plot(np.arange(0,2*np.pi,0.2), c, 'r', label='Polinomio trigonometri
15 plt.scatter(np.pi/4, f,label='Polinomio trigonometrico evaluado en pi/4
16 plt.legend(bbox_to_anchor=(1.9, 1), loc='upper right')
17 plt.grid(True)

5. Se registran las𝑜 siguientes temperaturas en intervalos de 6 horas a partir de la


medianoche: 11 , 17 , 32 y 23𝑜 . Por medio de la transformada discreta de Fourier
𝑜 𝑜
interpolar la temperatura a las 9 y a las 15 horas.
In [16]: 1 x=[0,6,12,18]
2 y=[11,17,32,23]
3 dy=np.fft.fft(y) #DFT
4 ​
5 plt.scatter(x, y, label='Puntos de la funcion') #Puntos dados de la fun
6 ​
7 T=24 #periodo
8 w=2*np.pi/T #calculo de W
9 ​
10 c=[]
11 for i in np.arange(0,24,0.2): #calculo de polinomio trigonometrico
12 a=dy[0]/4+2*np.real(dy[1])/4*np.cos(w*i)-2*np.imag(dy[1])/4*np.sin(w
13 c.append(a)
14 ​
15 plt.plot(np.arange(0,24,0.2), c, 'y', label='Polinomio trigonometrico')
16 plt.grid(True)
17 ​
18 y9=20.75-10.5*np.cos(np.pi/12*9)-3*np.sin(np.pi/12*9)+0.75*np.cos(2*np.p
19 #print(y9)
20 y15=20.75-10.5*np.cos(np.pi/12*15)-3*np.sin(np.pi/12*15)+0.75*np.cos(2*n
21 #print(y15)
22 plt.scatter([9,15], [y9,y15],c="red", label='Polinomio trigonometrico ev
23 plt.legend(bbox_to_anchor=(2, 1), loc='upper right')

C:\Users\Usuario\anaconda3\lib\site-packages\matplotlib\cbook\__init__.py:1
298: ComplexWarning: Casting complex values to real discards the imaginary
part
return np.asarray(x, float)

Out[16]: <matplotlib.legend.Legend at 0x18ae6061970>

6. Consideramos la función 𝑓(𝑥) = 𝑥(𝑥 − 2)𝑒𝑥 definida para 𝑥 ∈ [0; 2] y extendida


periódicamente a toda la recta real.

a) Determinar el polinomio trigonometrico T8 que interpola a f en los puntos 𝑡𝑛 = 0;25𝑛


con 𝑛 = 0; 1 : : : ; 7 [0; 2]
, del intervalo .

b) Determinar el polinomio trigonometrico T16 que interpola a 𝑓 en los puntos


𝑡𝑛 = 0;125𝑛 𝑛 = 0; 1 : : : ; 15
con [0; 2].
, del intervalo
6 c) Comparar T8 con T16 truncado en el octavo termino.
In [22]: 1 x1=np.arange(0,2,0.25) #Puntos para T8
2 x2=np.arange(0,2,0.125) #Puntos para T16
3 ​
4 def polinomio_trigonometrico(x,N,T): #Funcion para calcular Polinomio tr
5 #x=vector de puntos a evaluar, N= n
6 y=x*(x-2)*np.e**x #Funcion
7 dy=np.fft.fft(y) #DTF
8 plt.figure(4,figsize=(16, 8))
9 plt.scatter(x, y, label=f'{N} puntos de la funcion equi-espaciados')
10
11 M=int(N/2) #Elementos para calcular el Polinomio trigonometrico
12 w=2*np.pi/T
13 a0=dy[0]/N #Coeficiente ao
14 am=dy[M]/N #Coeficiente am
15
16 result=[]
17 acumulado=[]
18 for t in np.arange(0,T,0.01): #Calculo del Polinomio trigonometric
19 for i in np.arange(1,M,1):
20 a3=2*np.real(dy[i])/N*np.cos(i*w*t)-2*np.imag(dy[i])/N*np.si
21 acumulado.append(a3)
22 suma=a0+np.sum(acumulado)+am*np.cos(M*w*t) #Calculo de la sumato
23 result.append(suma) #Vector que contiene cada uno de los resulta
24 acumulado=[] # en puntos equiespaciados en 0.01
25 return result
26 ​
27 x3=np.arange(0,2,0.01)
28 plt.plot(x3,polinomio_trigonometrico(x2,16,2),'r',label='Polinomio trigo
29 plt.plot(x3,polinomio_trigonometrico(x1,8,2),'g',label='Polinomio trigon
30 plt.plot(x3,x3*(x3-2)*np.e**x3,'y',label='Funcion original')
31 plt.legend(bbox_to_anchor=(1.3, 1), loc='upper right')
32 plt.grid(True)

C:\Users\Usuario\anaconda3\lib\site-packages\matplotlib\cbook\__init__.py:1
298: ComplexWarning: Casting complex values to real discards the imaginary
part
return np.asarray(x, float)
C:\Users\Usuario\anaconda3\lib\site-packages\matplotlib\cbook\__init__.py:1
298: ComplexWarning: Casting complex values to real discards the imaginary
part
return np.asarray(x, float)

Observacion:
En el caso del polinomio que se genera con 16 muestras encontramos un mayor parecido
con la funcion original, lo cual demuestra que tomando una mayor cantidad de muestras
generaremos un Polinomio Trigonometrico cada vez mas parecido al comportamiento de la
funcion que muestreamos, incluso en este caso con solo 8 muestras se ve un
comportamiento bastante parecido a la funcion original, por lo que con solo 8 muestras

In [ ]: 1 ​
In [32]: 1 y=(-3.9894, 4.7119, 1.4207, -3.5892, 2.0137, -3.5936, 1.4349, 4.6775,-3
2 -1.3816, 0.9882) #Puntos de la funcion
3 N=16 #numero de muestras
4 T=1 #periodo
5 dy=np.fft.fft(y) #DFT
6 #print(len(y))
7 M=int(N/2) #Elementos para calcular el Polinomio trigonometrico
8 w=2*np.pi/T
9 a0=dy[0]/N #Coeficiente ao
10 am=dy[M]/N #Coeficiente am
11 ​
12 a=[]
13 b=[]
14 for r in np.arange(1,M,1): #Calculo de coeficientes an y bn
15 an=2*np.real(dy[r])/N
16 bn=-2*np.imag(dy[r])/N
17 a.append(an)
18 b.append(bn)
19 print(a) #Se muestran los coeficientes an y bn
20 print(b)
21 ​
22 result=[]
23 acumulado=[]
24 for t in np.arange(0,T,0.001):
25 for i in np.arange(1,M,1):
26
27 if np.abs(a[i-1])<0.01: #Se desprecian los coeficientes menores
28 a[i-1]=0
29 else:
30 a[i-1]=a[i-1]
31 if np.abs(b[i-1])<0.01:
32 b[i-1]=0
33 else:
34 b[i-1]=b[i-1]
35
36 a3=a[i-1]*np.cos(i*w*t)+b[i-1]*np.sin(i*w*t) #Calculo de la suma
37 acumulado.append(a3)
38 suma=a0+np.sum(acumulado)+am*np.cos(M*w*t) #Calculo de la sumatoria
39 result.append(suma) #Vector que contiene cada uno de los resultados
40 acumulado=[]
41 ​
42 result1=[]
43 acumulado1=[]
44 for t in np.arange(0,T,0.001): #Se toman todos los coeficientes.
45 for i in np.arange(1,M,1):
46 a2=a[i-1]*np.cos(i*w*t)+b[i-1]*np.sin(i*w*t)
47 acumulado1.append(a2)
48 suma1=a0+np.sum(acumulado1)+am*np.cos(M*w*t)
49 result1.append(suma1)
50 acumulado1=[]
51 ​
52 result2=[]
53 for t in np.arange(0,T,0.001): #Comprobando resultado, tomo los coef
54 # y b3=1.9990449807184132
55 cal=a0-4*np.cos(6*w*t)+2*np.sin(3*w*t)
56 result2.append(cal)
57
58
59 plt.figure(4,figsize=(14, 8))
60 plt.plot(np.arange(0,T,0.001),result,'r',
61 label='Polinomio trigonometrico para 16 muestras despreciando l
62 plt.plot(np.arange(0,T,0.001),result1,'g',
63 label='Polinomio trigonometrico para 16 muestras sin despreciar
64 plt.plot(np.arange(0,T,0.001),result2,'b',
65 label='Polinomio trigonometrico para 16 muestras despreciando c
66 plt.scatter(np.arange(0,T,0.0625),y,label='16 muestras de la funcion')
67 plt.legend(bbox_to_anchor=(1.54, 1), loc='upper right')
68 plt.grid(True)
69 ​

[-0.001225172749758613, 0.00500432955425012, -0.008502114750264578, 0.00048


75000000000018, 0.0011457439003662584, -4.00087932955425, -0.00386845640034
2918]
[-0.008268149419088905, -0.0005581398858872932, 1.9990449807184132, 0.01308
750000000003, 0.0015804852625591614, 0.008141860114112692, -0.0046326448749
42832]

C:\Users\Usuario\anaconda3\lib\site-packages\matplotlib\cbook\__init__.py:1
298: ComplexWarning: Casting complex values to real discards the imaginary
part
return np.asarray(x, float)
C:\Users\Usuario\anaconda3\lib\site-packages\matplotlib\cbook\__init__.py:1
298: ComplexWarning: Casting complex values to real discards the imaginary
part
return np.asarray(x, float)
C:\Users\Usuario\anaconda3\lib\site-packages\matplotlib\cbook\__init__.py:1
298: ComplexWarning: Casting complex values to real discards the imaginary
part
return np.asarray(x, float)
In [25]: 1 # E-9)
2 ​
3 t=np.arange(0,15,0.2)
4 y=t**4*np.e**(-t)
5 ​
6 plt.figure(1,figsize=(12, 4))
7 plt.plot(t,y,label='Funcion')
8 plt.legend(bbox_to_anchor=(1.2, 1), loc='upper right')
9 plt.grid(True)
10 ​
11 #La funcion se hace cero para valores mayores que t=15 y menores que t=0
12 ​
13 t=np.arange(0,15,0.2) #75 muestras
14 y=t**4*np.e**(-t)
15 N=75
16 dy=np.fft.fft(y)
17 ​
18 ​
19 def transformada_w(w):
20 c=[]
21 DFT=[]
22 for k in np.arange(0,N,1):
23 for n in np.arange(0,N,1):
24 d=y[n]*((np.e**(-w*1j))**(n*k))
25 c.append(d)
26 DFT.append(np.sum(c))
27 c=[]
28 return DFT
29 ​
30 plt.plot(t,transformada_w(2*np.pi/N),label='DFT W')
31 plt.scatter(t,dy,label='DFT fft')
32 plt.legend(bbox_to_anchor=(1.2, 1), loc='upper right')
33 ​
34 plt.figure(2,figsize=(12, 4))
35 plt.plot(t,transformada_w(0),label='DFT w=0')
36 plt.plot(t,transformada_w(1),label='DFT w=1')
37 plt.plot(t,transformada_w(2),label='DFT w=2')
38 plt.plot(t,transformada_w(3),label='DFT w=3')
39 plt.legend(bbox_to_anchor=(1.2, 1), loc='upper right')
40 plt.grid(True)
C:\Users\Usuario\anaconda3\lib\site-packages\matplotlib\cbook\__init__.py:1
298: ComplexWarning: Casting complex values to real discards the imaginary
part
return np.asarray(x, float)
C:\Users\Usuario\anaconda3\lib\site-packages\matplotlib\collections.py:200:
ComplexWarning: Casting complex values to real discards the imaginary part
offsets = np.asanyarray(offsets, float)
C:\Users\Usuario\anaconda3\lib\site-packages\matplotlib\cbook\__init__.py:1
298: ComplexWarning: Casting complex values to real discards the imaginary
part
return np.asarray(x, float)
C:\Users\Usuario\anaconda3\lib\site-packages\matplotlib\cbook\__init__.py:1
298: ComplexWarning: Casting complex values to real discards the imaginary
part
return np.asarray(x, float)
C:\Users\Usuario\anaconda3\lib\site-packages\matplotlib\cbook\__init__.py:1
298: ComplexWarning: Casting complex values to real discards the imaginary
part
return np.asarray(x, float)
C:\Users\Usuario\anaconda3\lib\site-packages\matplotlib\cbook\__init__.py:1
298: ComplexWarning: Casting complex values to real discards the imaginary
part
return np.asarray(x, float)

In [ ]: 1 ​

También podría gustarte