Modelação Numérica 2016/17

Exercícios de revisão

Tópico 1. Análise digital de séries temporais.

Mestrado Integrado em Engenharia da Energia e do Ambiente
Licenciatura em Meteorologia, Oceanografia e Geofísica
Licenciatura em Engenharia Geoespacial

DEGGE-FCUL
Departamento de Engenharia Geográfica, Geofísica e Energia
Faculdade de Ciências da Universidade de Lisboa

Conteúdos

  1. Teorema da amostragem.
  2. Decomposição de Fourier.
  3. Transformada discreta de Fourier, directa e inversa.
  4. Espectro de amplitude e de fase.
  5. Convolução e correlação.
  6. Filtros de média móvel.
  7. Filtros no domínio espectral.
  8. Espectrogramas.

Materiais de estudo

A referência principal para estudo são os slides das aulas teóricas.

Como material auxiliar, diponibilizam-se também os anotamentos da cadeira desenvolvidos pelo Prof. Fernando Santos. Note-se que apesar da grande sobreposição entre as aulas deste ano e os anotamentos, a sobreposição não é completa. Os anotamentos cobrem algumas matérias que não foram dadas este ano (e que, portanto, não serão avaliadas). Por outro lado, também houve tópicos cobertos nas aulas que não estão nos anotamentos (e que poderão ser avaliados). Notas sobre análise de Fourier.

Sugestões

No exame não haverá acesso a computador. No entanto, para estudar, pode ser vantajoso utilizar o computador para manipular os códigos aqui apresentados, bem como os códigos apresentados nas aulas, para melhor os perceber.

Exercício 1.

Observa o código que se segue, bem como o seu output:

In [23]:
import matplotlib.pyplot as plt
import numpy as np
from numpy import pi as pi
%matplotlib inline

plt.rcParams['figure.figsize'] = 10, 8

ti=0. 
tf=500. 
T1=50. 
T2=250. 
T3=10. 

dt=2.

t = np.arange(ti, tf+dt, dt)
f1 = 1.7 * np.cos(2*pi * t/T1)
f2 = np.cos(2*pi * t/T2 + pi/4)
f3 = .5 * np.cos(2*pi * t/T3 + pi/4)

f=f1+f2+f3

plt.close() 
plt.plot(t, f)
plt.grid()
plt.xlabel(u'Tempo (s)')
plt.ylabel(u'Função f(t)')
Out[23]:
<matplotlib.text.Text at 0x1180bf590>

1. Comenta o código acima, indicando o significado de cada linha/bloco de código e de cada parâmetro.

2. Escreve a expressão analítica da função f(t) representada no gráfico.

3. Desenha o espectro de amplitudes da função f(t).

4. Se quiseres re-amostrar este sinal, de modo a reduzir o volume de dados, qual a taxa de amostragem mínima que podes utilizar de forma a não perderes a informação contida neste sinal? Justifica a tua resposta.

5. Utilizando a taxa de amostragem deste sinal, qual é a frequência mais elevada que pode ser bem representada?

Observa o código e a figura abaixo:

In [25]:
plt.close() 
plt.plot(t, f, t, f2)
plt.grid()
plt.xlabel(u'Tempo (s)')
plt.ylabel(u'Função f(t)')
Out[25]:
<matplotlib.text.Text at 0x11838fd10>

6. Como farias para filtrar o sinal azul, de modo a obter o sinal verde, utilizando um filro no domínio do tempo? Se necessário, utiliza gráficos para ajudar a descrever o método.

7. E utilizando um filtro no domínio espectral?

8. Desenha um filtro espectral que pudesses utilizar para obter o sinal vermelho (abaixo) a partir do sinal azul.

In [26]:
plt.close() 
plt.plot(t, f, t, f1, 'red')
plt.grid()
plt.xlabel(u'Tempo (s)')
plt.ylabel(u'Função f(t)')
Out[26]:
<matplotlib.text.Text at 0x1188c0c50>

Exercício 2.

Considera o código seguinte, bem como o seu output:

In [27]:
import matplotlib.pyplot as plt
import numpy as np
from numpy import pi as pi
%matplotlib inline

plt.rcParams['figure.figsize'] = 10, 8

ti=0. 
tf=1000. 
T1=5. 
T3=50. 
dt=1.

t = np.arange(ti, tf+dt, dt)
f1 = 2*np.cos(2*pi * t/T1)
f1[:100]=0.
f1[200:]=0.
f2 = 5 * np.random.rand(len(t))
f3 = 2 * np.cos(2*pi * t/T3) + 1.5
f=f1+f2+f3

#%% Plots
plt.close()
plt.subplot(2,1,1)
plt.plot(t, f1, t, f2, t, f3)
plt.grid()
plt.xlabel(u'Tempo (s)')
plt.ylabel(u'Funções f1, f2 ef3')

#%% Plots
plt.subplot(2,1,2)
plt.plot(t, f)
plt.grid()
plt.xlabel(u'Tempo (s)')
plt.ylabel(u'Função f = f1+f2+f3')
Out[27]:
<matplotlib.text.Text at 0x117ce7710>

1. Comenta o código acima, indicando o significado de cada linha/bloco de código e de cada parâmetro.

2. Qual dos gráficos abaixo é o espectrograma da função f acima representada? Justifica a tua resposta.

Espectrograma A. Espectrograma A

Espectrograma B. Espectrograma B

Espectrograma C. Espectrograma C

3. O gráfico abaixo mostra a correlação entre a função f1 (considerando apenas o segmento da função f1 que é diferente de zero) e a função f. Como interpretas a curva de correlação?

In [28]:
f1b=f1[100:200]
cc=np.correlate(f,f1b, 'full')

plt.close()
plt.subplot(2,1,1)
plt.plot(t, f, t[:len(f1b)], f1b)

plt.subplot(2,1,2)
plt.plot(cc)
plt.grid()

4. Dá um exemplo de uma possível aplicação da correlação.

5. Dá um exemplo de uma possível aplicação da convolução.

Exercício 3.

As figuras abaixo mostram uma série temporal da energia consumida nos EUA ao longo de aproximadamente um mês (fonte: EIA), bem como o seu espectro.

1. Qual/quais a(s) periodicidade(s) dominante(s) que consegues identificar na série temporal, com base no sinal visualizado no domínio do tempo?

2. E com base no espectro?

3. Porque é que o espectro tem um pico em f=0? Que tipo de processamento poderias aplicar para remover este pico?

4. Identifica no primeiro gráfico (domínio do tempo) a amplitude da variação diurna do consumo de energia. Assinala no gráfico como mediste a amplitude. Corresponde ao valor indicado no espectro?

5. Faz o mesmo para a variação semanal.

In [ ]: