<jupyter_start><jupyter_text><NAME> 81883 **1.Calcule a transformada rapida de Fourier dos dados contidos no arquivo 'series.mat' (enviado por email), plote o seu periodograma, e identifique os picos de frequencia na referida figura. Os dados correspondem a uma serie sintética de tamanho N e um vetor de tempo que se inicia em t = 0 até t = N −1. Plote as figuras que julgue necessarias para a compreensão da análise (e.g. série temporal, etc.).**<jupyter_code># Importando as bibliotecas
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy.io import loadmat
%matplotlib inline
# Importando os dados
data = loadmat('series.mat')
# Identificando cada tipo de chave no arquivo data
for key in data.keys():
    print(key, "\t", type(data[key]) )
# Dataframe dos dados
df = pd.DataFrame(columns = ['t', 'y'])
df['t'] = data['t'].T.squeeze()
df['y'] = data['y'].T.squeeze()
df.head()
# Eixo x (tempo) e y (dados)
x = df['t'] 
y = df['y']
# Plot da série temporal de dados aleatórios
plt.figure(figsize=(10,5))
plt.plot(x, y, color = 'black')
plt.title('Série temporal dos dados aleatórios', fontdict={'size':20})
plt.xlabel('Tempo', fontdict={'size':15})
plt.ylabel('y', fontdict={'size':15})
plt.show()
# Tamanho da amostra
N = len(df['y'])
N
# Encontrar potência de 2 ideal para a fft
n = int(2**np.ceil(np.log2(N)))
n
# Remover a média dos dados
y = y[:] - df['y'].mean()
# fft
fft = np.fft.fft(y, n)
# Potência
pt = (fft.conjugate() * fft) / n
pt = pt.real
# Frequências
m = n // 2
delta_t = (N-1) / N
fc = 1 / (2 * delta_t) #  frequência crítica
f = fc * np.arange(0, m+1) # vetor frequência de potência
pt = pt[:m+1]
pt[1:] = 2 * pt[1:]
# Picos de frequência e seus índices
sort = pt.copy()
sort[::-1].sort()
sort = pd.Series(sort)
i = np.zeros(3)

for c in range(0, 3):
    i[c] = np.where(pt==sort[c])[0]
i = np.intp(i)
# Maiores potências e respectivas frequências
print(sort[:3])
print(pd.Series(f[i]))
# Periodograma
strg = ['1','2','3']
plt.figure(figsize=(10,5))
plt.loglog(f[1:], pt[1:], color='black')
for c in range(0,3):
    plt.annotate(strg[c],xy=[f[i[c]],pt[i[c]]],arrowprops=dict(arrowstyle = "->",connectionstyle = "angle,angleA=45,angleB=0,rad=10"))
plt.title('Periodograma', fontdict={'size':20})
plt.xlabel('Frequência (hr-¹)', fontdict={'size':15})
plt.ylabel('Potência (m²)', fontdict={'size':15})
plt.show()<jupyter_output><empty_output><jupyter_text>**2. Vamos agora utilizar o arquivo 'woods_hole_tides_2005_05.dat' para realizar uma análise espectral de um dado real, conforme visto em sala de aula.**- **Calcule a FFT dos dados e plote o seu periodograma. Lembro sempre devemos informar o que representa cada um dos eixos de uma figura, assim como a unidade dos mesmos.**- **Encontre os 8 picos mais energeticos e represente-os no seu periodograma. Discuta se estes picos sao real realíticos do ponto de vista dos dados de entrada utilizados, ou seja, eles fazem sentido?**- **Por fim, prove que o teorema de Parseval é válido.**<jupyter_code># Importando os dados
data = np.loadtxt('woods_hole_tides_2005_05.dat')
# Dimensão dos dados
data.shape
# Organizando os dados em um dataframe
col = ['station ID', 'year', 'month', 'day', 'hour', 'minute', 'predMLLW', 'verMLLW']
df = pd.DataFrame(data, columns = col)
df.head()
# Ajustando a data
date = pd.DataFrame(df[col[1:6]])
date = pd.to_datetime(date, format='%Y-%m-%D %H:%M')
df['Date'] = date
del (df['year'], df['month'], df['day'], df['hour'], df['minute'])
df.head()
# Tamanho da amostra
N = len(df['verMLLW'])
N
# Potência de 2 ideal
n = int(2**np.ceil(np.log2(N)))
n
# Remover a média dos dados
y = df['verMLLW'][:] - df['verMLLW'].mean()
# fft
fft = np.fft.fft(y, n)
# Potência
pt = (fft.conjugate() * fft)/n
pt = pt.real
# Frequências
m = n // 2
delta_t = (N-1) / N
fc = 1 / (2 * delta_t) #  frequência crítica
f = fc * np.arange(0, m+1) # vetor frequência de potência 
pt = pt[:m+1]
pt[1:] = 2 * pt[1:]
# Oito picos de frequência mais energéticos
sort = pt.copy()
sort[::-1].sort()
sort = pd.Series(sort)
i = np.zeros(8)

for c in range(0, 8):
    i[c] = np.where(pt==sort[c])[0]
i = np.intp(i)
# Periodiograma
strg = ['1','2','3', '4', '5', '6', '7', '8']
plt.figure(figsize=(10,5))
plt.loglog(f[1:], pt[1:], color='black')
for c in range(0,8):
    plt.annotate(strg[c],xy=[f[i[c]],pt[i[c]]],arrowprops=dict(arrowstyle = "->",connectionstyle = "angle,angleA=45,angleB=0,rad=10"))
plt.title('Periodograma Maré', fontdict={'size':20})
plt.xlabel('Frequência (hr-¹)', fontdict={'size':15})
plt.ylabel('PSD (m²)', fontdict={'size':15})
plt.show()
# Periodo dos picos
p = pd.Series(1/f[i])
print(p)
# Retorna a mensagem se o teorema de Parseval for válido
if(np.round(sum(abs(y)**2),4)==np.round(sum(pt),5)):
    print('O teorema de Parseval é valido.')<jupyter_output>O teorema de Parseval é valido.
{'fraction_non_alphanumeric': 0.18363107602825093, 'fraction_numerical': 0.025135022850020772, 'mean_word_length': 5.026282853566959, 'pattern_counts': {'":': 0, '<': 9, '<?xml version=': 0, '>': 11, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '2', 'dir': 'jupyter-structured-clean-dedup', 'id': '451369', 'license': 'MIT', 'n_tokens_mistral': 2032, 'n_tokens_neox': 1969, 'n_words': 547, 'path': 'lista5.ipynb', 'repo_name': 'otaviosanluz/MMAO', 'size': '4821'}