Exercício 8 de IA639-2009

Autor: Matias
Data: 15/05/2009
  1. Estudar as funções da toolbox ia636: iacos, iadft, iadftview
  2. Estudar a demonstração iadftdecompose e procurar fazer a demonstração inversa, isto é, começar a reconstruir parcialmente a função original, adicionando-se as cossenóides, de menor frequência.
  3. Repetir parte do exercício que o Prof. Clésio demonstrou em classe usando as funções iadft

Questão 1

iacos()

A função iacos() cria uma onda senoidal em uma dimensão, replicando os valores no eixo perpendicular a onda.

Alguns exemplos:

1 imagem = ianormalize(iacos([200,200],200,0,0),[0,255])
2 adshow(imagem,title='iacos(), periodo=200,theta=0,fase=0')
3 imagem = ianormalize(iacos([200,200],200,0,pi),[0,255])
4 adshow(imagem,title='iacos(), periodo=200,theta=0,fase=pi')
5 imagem = ianormalize(iacos([200,200],20,pi/4,0),[0,255])
6 adshow(imagem,title='iacos(), periodo=20,theta=pi/4,fase=0')
7 imagem = ianormalize(iacos([200,200],5,pi/2,0),[0,255])
8 adshow(imagem,title='iacos(), periodo=5,theta=pi/2,fase=0')

iacos(), periodo=200,theta=0,fase=0

iacos(), periodo=200,theta=0,fase=pi

iacos(), periodo=20,theta=pi/4,fase=0

iacos(), periodo=5,theta=pi/2,fase=0

iadft()

Dada uma função discreta f(x), a função iadft() calcula a transformada de Fourier para essas amostras.

 1 passo = pi/8
 2 
 3 f = cos(arange(0,2*pi,passo))
 4 F = iadft(f)
 5 
 6 print "f(x) = ", f.round(2)
 7 print "F(x) = ", F.round(2)
 8 
 9 mmplot([[f]],ptitle='f(x) = cos(x): passo pi/8')
10 mmplot([[abs(F)]],ptitle='F(x)')
11 
12 passo = pi/16
13 
14 g1 = cos(arange(0,2*pi,passo))
15 g2 = sin(arange(0,2*pi,passo)*4)
16 g = g1 + g2
17 G = iadft(g)
18 
19 print "g(x) = ", g.round(2)
20 print "G(x) = ", G.round(2)
21 
22 mmplot([[g]],ptitle='g(x) = cos(x)+sen(4x): passo pi/16')
23 mmplot([[abs(G)]],ptitle='G(x)')
f(x) =  [ 1.    0.92  0.71  0.38  0.   -0.38 -0.71 -0.92 -1.   -0.92 -0.71 -0.38
 -0.    0.38  0.71  0.92]
F(x) =  [[-0.+0.j]
 [ 8.-0.j]
 [ 0.+0.j]
 [ 0.+0.j]
 [ 0.+0.j]
 [ 0.+0.j]
 [ 0.+0.j]
 [ 0.+0.j]
 [ 0.-0.j]
 [ 0.-0.j]
 [ 0.+0.j]
 [ 0.-0.j]
 [-0.+0.j]
 [-0.+0.j]
 [-0.+0.j]
 [ 8.-0.j]]
g(x) =  [ 1.    1.69  1.92  1.54  0.71 -0.15 -0.62 -0.51 -0.    0.51  0.62  0.15
 -0.71 -1.54 -1.92 -1.69 -1.   -0.27  0.08 -0.12 -0.71 -1.26 -1.38 -0.9  -0.
  0.9   1.38  1.26  0.71  0.12 -0.08  0.27]
G(x) =  [[ -0. +0.j]
 [ 16. -0.j]
 [  0. -0.j]
 [  0. -0.j]
 [ -0.-16.j]
 [  0. -0.j]
 [ -0. +0.j]
 [  0. -0.j]
 [  0. +0.j]
 [  0. +0.j]
 [ -0. -0.j]
 [ -0. +0.j]
 [  0. +0.j]
 [  0. -0.j]
 [  0. -0.j]
 [ -0. -0.j]
 [  0. -0.j]
 [ -0. -0.j]
 [  0. -0.j]
 [  0. +0.j]
 [  0. -0.j]
 [ -0. -0.j]
 [ -0. -0.j]
 [ -0. +0.j]
 [  0. -0.j]
 [  0. -0.j]
 [  0. +0.j]
 [  0. +0.j]
 [ -0.+16.j]
 [  0. -0.j]
 [  0. -0.j]
 [ 16. +0.j]]

iadftview()

Esta função gera uma imagem representando o espectro da transformada de Fourier criada, por exemplo, pela função iadft()

 1 imagem = ianormalize(iacos([200,200],50,0,0),[0,255])
 2 F =  iadft(imagem)
 3 adshow(imagem)
 4 adshow(ianormalize(iadftview(F),[0,255]))
 5 
 6 i1 = iacos([200,200],20,0,0)
 7 i2 = iacos([200,200],20,pi/2,0)
 8 imagem = ianormalize(i1+i2,[0,255])
 9 F =  iadft(imagem)
10 adshow(imagem)
11 adshow(ianormalize(iadftview(F),[0,255]))
12 
13 imagem = mmreadgray('boat.ppm')
14 F =  iadft(imagem)
15 adshow(imagem)
16 adshow(ianormalize(iadftview(F),[0,255]))

Questão 2

 1 f = ones((128, 128)) * 50
 2 x, y = [], map(lambda k:k%128, range(-32,32))
 3 for i in range(128): x = x + (len(y) * [i])
 4 y = 128 * y
 5 put(f, iasub2ind([128,128], x, y), 200)
 6 
 7 F = iadft(f)
 8 F[:,2:126]=0
 9 adshow(iaidft(F),title='f(x) reconstruída')
10 adshow(ianormalize(iadftview(F),[0,255]),title='F(x), frequências (-1) - (1)')
11 
12 F = iadft(f)
13 F[:,4:124]=0
14 adshow(iaidft(F),title='f(x) reconstruída')
15 adshow(ianormalize(iadftview(F),[0,255]),title='F(x), frequências (-3) - (3)')
16 
17 F = iadft(f)
18 F[:,8:120]=0
19 adshow(iaidft(F),title='f(x) reconstruída')
20 adshow(ianormalize(iadftview(F),[0,255]),title='F(x), frequências (-7) - (7)')
21 
22 F = iadft(f)
23 F[:,42:86]=0
24 adshow(iaidft(F),title='f(x) reconstruída')
25 adshow(ianormalize(iadftview(F),[0,255]),title='F(x), frequências (-41) - (41)')
26 
27 F = iadft(f)
28 F[:,62:66]=0
29 adshow(iaidft(F),title='f(x) reconstruída')
30 adshow(ianormalize(iadftview(F),[0,255]),title='F(x), frequências (-61) - (61)')
31 
32 adshow(f, title='f(x)')
33 F = iadft(f)
34 adshow(ianormalize(iadftview(F),[0,255]),title='F(x), todas as frequências')

f(x) reconstruída

F(x), frequências (-1) - (1)

f(x) reconstruída

F(x), frequências (-3) - (3)

f(x) reconstruída

F(x), frequências (-7) - (7)

f(x) reconstruída

F(x), frequências (-41) - (41)

f(x) reconstruída

F(x), frequências (-61) - (61)

f(x)

F(x), todas as frequências

Questão 3

 1 passo = pi/4
 2 passo_original = pi/32
 3 f_original = cos(arange(0,2*pi,passo_original))
 4 f = cos(arange(0,2*pi,passo))
 5 F = iadft(f)
 6 
 7 mmplot([[f_original]],['set yrange [-2:2]'], ptitle='f(x)=cos(x)')
 8 mmplot([[iaidft(F)]],['set yrange [-2:2]'],ptitle='f(x) reconstruida, passo pi/4')
 9 
10 f_original = cos(arange(0,2*pi,passo_original)*2)
11 f = cos(arange(0,2*pi,passo)*2)
12 F = iadft(f)
13 mmplot([[f_original]],['set yrange [-2:2]'], ptitle='f(x)=cos(2x)')
14 mmplot([[iaidft(F)]],['set yrange [-2:2]'],ptitle='f(x) reconstruida, passo pi/4')
15 
16 f_original = cos(arange(0,2*pi,passo_original)*4)
17 f = cos(arange(0,2*pi,passo)*4)
18 F = iadft(f)
19 mmplot([[f_original]],['set yrange [-2:2]'], ptitle='f(x)=cos(4x)')
20 mmplot([[iaidft(F)]],['set yrange [-2:2]'],ptitle='f(x) reconstruida, passo pi/4')
21 
22 f_original = cos(arange(0,2*pi,passo_original)*8)
23 f = cos(arange(0,2*pi,passo)*8)
24 F = iadft(f)
25 mmplot([[f_original]],['set yrange [-2:2]'], ptitle='f(x)=cos(8x)')
26 mmplot([[iaidft(F)]],['set yrange [-2:2]'],ptitle='f(x) reconstruida, passo pi/4')