#numero de amostras
    a=np.unique(dd.ens)[:-2]

    dd1 = {}
    epr = {}
    evx = {}
    evy = {}
    evz = {}

    #separa os dados e calcula os espectros
    for v in range(len(a)): #varia as horas de cada dia

        dd1[str(v)] = dd.ix[pl.find(dd.ens == a[v]),:]
        nfft = int(dd1[str(v)].shape[0] / 2)
        epr[str(v)] = espec.espec1(dd1[str(v)].pr,nfft,fs)
        evx[str(v)] = espec.espec1(dd1[str(v)].vx,nfft,fs)
        evy[str(v)] = espec.espec1(dd1[str(v)].vy,nfft,fs)
        evz[str(v)] = espec.espec1(dd1[str(v)].vz,nfft,fs)

    pl.figure(figsize=(16,10))
    cont = 0
    for i in range(0,len(a),1):
        print(i)
        cont += 2
        pl.subplot(1,4,1)
        pl.semilogy(epr[str(i)][:,0],cont+epr[str(i)][:,1])
        pl.xlim(0,0.2), pl.ylim(0,45)
        pl.xlabel('Frequency (Hz)')
        pl.ylabel('Spectral Density (m^2/Hz)')
        pl.title('Pressure', fontname="Times New Roman Bold")
Exemple #2
0
    pr, vx, vy, vz = dd[:, [14, 2, 3, 4]].T

    eta = np.concatenate((eta, vz), axis=1)

    #processamento no dominio do tempo
    hs, h10, hmax, tmed, thmax = proconda.ondat(t, vz, h)

    #processamento no dominio da frequencia
    #hm0_pr, tp_pr, dp_pr, sigma1, sigma2, sigma1p, sigma2p, freq, df, k, sn_pr, snx,sny, snn, snnx, snny, snxny, snxnx, snyny, a1, b1, a2, b2, dire1_pr, dire2 = proconda.ondaf(
    #pr,vx,vy,h,nfft,fs) ##pressao

    hm0, tp, dp, sigma1, sigma2, sigma1p, sigma2p, freq, df, k, sn, snx, sny, snn, snnx, snny, snxny, snxnx, snyny, a1, b1, a2, b2, dire1, dire2 = proconda.ondaf(
        vz, vx, vy, h, nfft, fs)

    #calcula os espectros de pr, vz, vx e vy
    apr = espec.espec1(pr, nfft, fs)
    avz = espec.espec1(vz, nfft, fs)
    avx = espec.espec1(vx, nfft, fs)
    avy = espec.espec1(vy, nfft, fs)

    #corrige a declinacao magnetica
    dp = dp - 23
    dire1 = dire1 - 23
    dire2 = dire2 - 23

    #calcula o espectro de fase (fase e coerencia)
    #acha o indice da fp
    indfp = pl.find(sn[:, 0] == sn[sn[:, 1] == max(sn[:, 1]), 0])

    fase_nnx.append(np.real(snnx[indfp, 4])[0])  #fase de heave e dspx
    fase_nny.append(np.real(snny[indfp, 4])[0])  #fase de heave e dspx
Exemple #3
0
def ondaf(eta,etax,etay,h,nfft,fs):

	"""
	#======================================================================#
	
	Calcula parametros de onda no dominio da frequencia
	
	Dados de entrada: eta - vetor de elevacao
	                  etax - vetor de deslocamento em x
	                  etay - vetor de deslocamento em y
						h - profundidade
						nfft - Numero de pontos utilizado para o calculo da FFT
	                  fs - frequencia de amostragem
	
	Dados de saida: pondaf = [hm0 tp dp]	
	
	#======================================================================#
	"""

	#espectro simples
	sn = espec.espec1(eta,nfft,fs)
	snx = espec.espec1(etax,nfft,fs)
	sny = espec.espec1(etay,nfft,fs)

	#espectros cruzados
	snn = espec.espec2(eta,eta,nfft,fs)
	snnx = espec.espec2(eta,etax,nfft,fs)
	snny = espec.espec2(eta,etay,nfft,fs)
	snxny = espec.espec2(etax,etay,nfft,fs)
	snxnx = espec.espec2(etax,etax,nfft,fs)
	snyny = espec.espec2(etay,etay,nfft,fs)

	#vetor de frequencia
	f = sn[:,0]

	#deltaf
	df = f[1] - f[0]

	#calculo do numero de onda
	k = numeronda(h,f,len(f))
	k = np.array(k)

	#calculo dos coeficientes de fourier - NDBC 96_01 e Steele (1992)
	c = snx[:,1] + sny[:,1]
	cc = np.sqrt(sn[:,1] * (c))

	a1 = snnx[:,3] / cc
	b1 = snny[:,3] / cc

	a2 = (snx[:,1] - sny[:,1]) / c
	b2 = 2 * snxny[:,2] / c

	#calcula direcao de onda
	#mean direction
	dire1 = np.array([np.angle(np.complex(b1[i],a1[i]),deg=True) for i in range(len(a1))])

	#principal direction
	dire2 = 0.5 * np.array([np.angle(np.complex(b2[i],a2[i]),deg=True) for i in range(len(a2))])

	#condicao para valores maiores que 360 e menores que 0
	dire1[np.where(dire1 < 0)] = dire1[np.where(dire1 < 0)] + 360
	dire1[np.where(dire1 > 360)] = dire1[np.where(dire1 > 360)] - 360

	dire2[np.where(dire2 < 0)] = dire2[np.where(dire2 < 0)] + 360
	dire2[np.where(dire2 > 360)] = dire2[np.where(dire2 > 360)] - 360

	#acha o indice da frequencia de pico
	ind = np.where(sn[:,1] == np.max(sn[:,1]))[0]

	#periodo de pico
	tp = (1. / f[ind])[0]

	#momento espectral de ordem zero total - m0
	m0 = np.sum(sn[:,1]) * df

	#calculo da altura significativa
	hm0 = 4.01 * np.sqrt(m0)

	#direcao do periodo de pico
	dp = dire1[ind][0]

	#Espalhamento direcional
	#Formula do sigma1 do livro Tucker&Pitt(2001) "Waves in Ocean Engineering" pags 196-198
	c1 = np.sqrt(a1 ** 2 + b1 **2)
	c2 = np.sqrt(a2 ** 2 + b2 ** 2)
	
	s1 = c1 / (1-c1)
	s2 = (1 + 3 * c2 + np.sqrt(1 + 14 * c2 + c2 ** 2)) / (2 * (1 - c2))
	
	sigma1 = np.sqrt(2 - 2 * c1) * 180 / np.pi
	sigma2 = np.sqrt((1 - c2) / 2) * 180 / np.pi

	sigma1p = np.real(sigma1[ind])[0]
	sigma2p = np.real(sigma2[ind])[0]

	# pondaf = np.array([hm0, tp, dp, sigma1p, sigma2p])

	return hm0, tp, dp, sigma1, sigma2, sigma1p, sigma2p, f, df, k, sn, snx, sny, snn, snnx, snny, snxny, snxnx, snyny, a1, b1, a2, b2, dire1, dire2
#hora = ['1400','1430','1500','1530','1600','1630','1700','1730','1800','1830','1900','1930','2000','2030','2100','2130','2200','2230','2300','2330','0000','0030','0100','0130','0200','0230','0300','0330','0400','0430','0500','0530','0600','0630','0700','0730','0800','0830','0900','0930','1000'][:-9]#41
#hora = ['0800','0845','0930','1015','1100','1145','1230','1315','1400','1445','1530','1615','1700','1745','1830','1915','2000','2045'][2:-3]
#hora = ['0730','0800','0830','0900','0930','1000','1030','1100','1130','1200','1230','1300','1330','1400','1430','1500','1530','1600','1630','1700','1730','1800','1830','1900','1930','2000','2030','2100','2130'][1:-4]
#hora = ['0730','0745','0800','0815','0830','0845','0900','0915','0930','0945','1000','1015','1030','1045','1100','1115','1130','1145','1200','1215','1230','1245','1300','1315','1330','1345','1400','1415','1430','1445','1500','1515','1530','1545','1600','1615','1630','1645','1700','1715','1730','1745','1800','1815'][4:-6]

#hora = (len(dd))
dd1 = {}
epr = {}
evx = {}
evy = {}
evz = {}

#separa os dados e calcula os espectros
for i in range(len(a)):
    dd1[hora[i]] = dd.ix[pl.find(dd.ens == a[i]), :]
    epr[hora[i]] = espec.espec1(dd1[hora[i]].pr, nfft, fs)
    evx[hora[i]] = espec.espec1(dd1[hora[i]].vx, nfft, fs)
    evy[hora[i]] = espec.espec1(dd1[hora[i]].vy, nfft, fs)
    evz[hora[i]] = espec.espec1(dd1[hora[i]].vz, nfft, fs)

pl.figure()

cont = 0
for i in range(0, len(a), 1):
    cont += 1
    pl.subplot(1, 4, 1)
    pl.plot(epr[hora[i]][:, 0], cont + epr[hora[i]][:, 1])
    pl.xlim(0, 0.2), pl.ylim(0, 15)
    pl.xlabel('Frequency (Hz)')
    pl.ylabel('Spectral Density (m2/Hz')
    pl.title('Pressure')
Exemple #5
0
    # a wavelet sera gerada com as regras acima

    # serao calculadas as energias em cada faixa mencionada a partir do
    # espectro de uma dimensao considerando que o espalhamento entre cada
    # frequencia seja de 1/T

    #calculo do espectro de uma dimensao

    ww55 = zeros((10,1))

    han = 1 #aplicacao da janela: han = 1 hanning ; han = 0 retangular

    gl = 32

    qq1 = espec.espec1(co,nfft,fs)

    f1 = qq1[:,0]

    qq1 = qq1[:,1] #auto-espectro

    #faixas em segundos
    #2     3    4
    #4     6    7.2
    #7.14  8    10.8
    #10.3  16   20.0

    #intervalo de frequencia
    df = f1[1] - f1[0]

    #onda significativa (coloca a altura na primeira linha de ww5)
def ondaf(eta, etax, etay, h, nfft, fs):
    """
	#======================================================================#
	
	Calcula parametros de onda no dominio da frequencia
	
	Dados de entrada: eta - vetor de elevacao
	                  etax - vetor de deslocamento em x
	                  etay - vetor de deslocamento em y
						h - profundidade
						nfft - Numero de pontos utilizado para o calculo da FFT
	                  fs - frequencia de amostragem
	
	Dados de saida: pondaf = [hm0 tp dp]	
	
	#======================================================================#
	"""

    #espectro simples
    sn = espec.espec1(eta, nfft, fs)
    snx = espec.espec1(etax, nfft, fs)
    sny = espec.espec1(etay, nfft, fs)

    #espectros cruzados
    snn = espec.espec2(eta, eta, nfft, fs)
    snnx = espec.espec2(eta, etax, nfft, fs)
    snny = espec.espec2(eta, etay, nfft, fs)
    snxny = espec.espec2(etax, etay, nfft, fs)
    snxnx = espec.espec2(etax, etax, nfft, fs)
    snyny = espec.espec2(etay, etay, nfft, fs)

    #vetor de frequencia
    f = sn[:, 0]

    #deltaf
    df = f[1] - f[0]

    #calculo do numero de onda
    k = numeronda(h, f, len(f))
    k = np.array(k)

    #calculo dos coeficientes de fourier - NDBC 96_01 e Steele (1992)
    c = snx[:, 1] + sny[:, 1]
    cc = np.sqrt(sn[:, 1] * (c))

    a1 = snnx[:, 3] / cc
    b1 = snny[:, 3] / cc

    a2 = (snx[:, 1] - sny[:, 1]) / c
    b2 = 2 * snxny[:, 2] / c

    #calcula direcao de onda
    #mean direction
    dire1 = np.array(
        [np.angle(np.complex(b1[i], a1[i]), deg=True) for i in range(len(a1))])

    #principal direction
    dire2 = 0.5 * np.array(
        [np.angle(np.complex(b2[i], a2[i]), deg=True) for i in range(len(a2))])

    #condicao para valores maiores que 360 e menores que 0
    dire1[np.where(dire1 < 0)] = dire1[np.where(dire1 < 0)] + 360
    dire1[np.where(dire1 > 360)] = dire1[np.where(dire1 > 360)] - 360

    dire2[np.where(dire2 < 0)] = dire2[np.where(dire2 < 0)] + 360
    dire2[np.where(dire2 > 360)] = dire2[np.where(dire2 > 360)] - 360

    #acha o indice da frequencia de pico
    ind = np.where(sn[:, 1] == np.max(sn[:, 1]))[0]

    #periodo de pico
    tp = (1. / f[ind])[0]

    #momento espectral de ordem zero total - m0
    m0 = np.sum(sn[:, 1]) * df

    #calculo da altura significativa
    hm0 = 4.01 * np.sqrt(m0)

    #direcao do periodo de pico
    dp = dire1[ind][0]

    #Espalhamento direcional
    #Formula do sigma1 do livro Tucker&Pitt(2001) "Waves in Ocean Engineering" pags 196-198
    c1 = np.sqrt(a1**2 + b1**2)
    c2 = np.sqrt(a2**2 + b2**2)

    s1 = c1 / (1 - c1)
    s2 = (1 + 3 * c2 + np.sqrt(1 + 14 * c2 + c2**2)) / (2 * (1 - c2))

    sigma1 = np.sqrt(2 - 2 * c1) * 180 / np.pi
    sigma2 = np.sqrt((1 - c2) / 2) * 180 / np.pi

    sigma1p = np.real(sigma1[ind])[0]
    sigma2p = np.real(sigma2[ind])[0]

    # pondaf = np.array([hm0, tp, dp, sigma1p, sigma2p])

    return hm0, tp, dp, sigma1, sigma2, sigma1p, sigma2p, f, df, k, sn, snx, sny, snn, snnx, snny, snxny, snxnx, snyny, a1, b1, a2, b2, dire1, dire2
Exemple #7
0
			#parameters for spectral calculation
			depth = di['pres'][:,i].mean() + 0.9
			nfft = len(di['pres']) / dft
			fs = 2 #sample freq
				
			#calcula parametros de ondas
			hm0, tp, dp, sigma1, sigma2, sigma1p, sigma2p, freq, df, k, sn, snx,sny, snn, snnx, snny, snxny, snxnx, snyny, a1, b1, a2, b2, dire1, dire2 = proconda.ondaf(
				di['vzu'][:,i],di['vxe'][:,i],di['vyn'][:,i],depth,nfft,fs)

			#concatena os parametros de onda
			aux_hm0.append(hm0)
			aux_tp.append(tp)
			aux_dp.append(dp)

			#concatena os espectros
			aux_esp_pr.append(espec.espec1(di['pres'][:,i], nfft, fs)[:,1])
			aux_esp_vx.append(espec.espec1(di['vxe'][:,i],  nfft, fs)[:,1])
			aux_esp_vy.append(espec.espec1(di['vyn'][:,i],  nfft, fs)[:,1])
			aux_esp_vz.append(espec.espec1(di['vzu'][:,i],  nfft, fs)[:,1])

			#cria array com os parametros e espectros concatenados
			hm0 = np.array(aux_hm0)
			tp = np.array(aux_tp)
			dp = np.array(aux_dp)
			esp_pr = np.array(aux_esp_pr).T
			esp_vx = np.array(aux_esp_vx).T
			esp_vy = np.array(aux_esp_vy).T
			esp_vz = np.array(aux_esp_vz).T
			
			##################################################
Exemple #8
0
def daat1(pathname,listap,nfft,fs,ncol,p0,p1):

	tic = time.clock()

	dire = np.zeros((10,ncol)) #direcao (2 valores, ate 5 faixas)
	espe = np.zeros((10,ncol)) #espectros (2 valores, ate 5 faixas)
	energ = np.zeros((10,ncol)) #Hs + 5 energias (uma por faixa), 4 picos (maiores)
	dire1 = np.copy(dire)
	espe1 = np.copy(espe)

	#tabela de senos e cossenos para o metodo da maxima entropia
	#cria variaveis a23 e a24, com 360 linhas (no matlab eh colunas),
	#que faz um circulo de 1 a -1
	ar, ai, br, bi = np.loadtxt('lyg2.txt', unpack=True)

	a23 = ar + 1j * ai
	a24 = br + 1j * bi

	#mesmo circulo agora com 460 linhas (no matlab eh colunas)
	a26 = np.array( list(a23[310:360]) + list(a23) + list(a23[0:50]) )
	a27 = np.array( list(a24[310:360]) + list(a24) + list(a24[0:50]) )

	#cria vetor de 0 a 360 iniciando em 311 e terminando em 50
	a30 = np.array( range(311,361) + range(1,361) + range(1,51) )

	#??
	grad1 = 0.0175 ; grad2 = 180/pi

	#para o caso de usar matr1 (matriz de ocorrencias)
	# sa=[.5,.5,.5,.5,0.1]

	#o objetivo aqui eh ter wavelets prontas para usa-las de acordo com
	#o pico das faixas; caso nao haja pico em uma faixa, usa-se  wavelets
	#correspondentes a: faixa 1 - 14.28 s (55 pontos), faixa 2 - 9.52 s
	#(37 pontos), faixa 3 - 7.76 s (30 pontos ) e faixa 5- 3 s (12 pontos)
	# ES - 12 graus
	# mm=[60;55;50;46;43;40;38;35;33;32;30;29;27;26;25;24;23;22;21;21;20;19;...
	#     19;18;18;17;17;16;16;15;15;15;14;14;14;13;13;13;12;12;12;12;12;11;...
	#     11;11;11;11;10;10;10;10;10;10;9];
	# ES - 32 graus

	#cria vetor com o tamanho das wavelets
	# mm=[64;50;48;44;38;32;30;27;25;24;21;19;18;17;16;15;14;13;12;11;11;10;10;9;9;8;8;8;7;7;...
	#     7;7;6;6;6];

	mm = range(64,5,-1)
	ms=[];

	#cria vetores de dim 64,34
	wavecos = np.zeros((64,len(mm)))
	wavesen = np.copy(wavecos)

	for i in range(len(mm)):

	    mn = mm[i]
	    ms.append(mn)

	    #cria vetor de -pi a pi do tamanho de mn que eh o tamanho da wavelet
	    out2 = np.array([np.linspace(-3.14,3.14,mn)][:])

	    #cria janela de hanning para o tamanho da wavelet
	    gau = np.hanning(mn) ; gau = resize(gau,(1,len(gau)))

	    #cria wavelet cos
	    out1 = (gau * cos(3 * out2)).T

	    #cria wavelet sen
	    out3 = (gau * sin(3 * out2)).T

	    #coloca em cada coluna a wavelet de determinado
	    #tamanho. cria 34 wavelets?
	    wavecos[0:mn,i] = out1[:,0]
	    wavesen[0:mn,i] = out3[:,0]

	#intervalo de amostragem
	dt = 0.78

	#tempo de amostragem, pq 64? devido ao g.l?
	x = dt * 64

	#carrega lista com o nome dos arquivos
	#z3 = lista com o nomes

	# lista = carrega_axys.lista_hne(pathname)
	lista = listap


	kkl = 0

	#for ik in range(0,len(lista),3):
	# for ik in range(p0,p1,3): #pula 3 arquivos para cada arq processado
	for ik in range(len(listap)):

	    # print ik

	    #for ik in range(1):

	    #atribui o nome do arquivo a variavel 'arq'
	    #arq = lista[ik]

	    #atribui as variaveis em 'dados' e a data em 'data'
	    dados, data = loadhne.dados_hne(pathname,listap[ik])

	    eta = dados[0:1024,1]
	    dspy = dados[0:1024,2]
	    dspx = dados[0:1024,3]

	    co = eta
	    dd = dspx
	    dc = dspy

	    ano = int(data[0])
	    mes = int(data[1])

	    #limite superior (3db) e limite inferior (3 db)
	    # 1) 20     11.1
	    # 2) 11.1   8.69
	    # 3) 8.69   7.4
	    # 4) 7.4    4.0
	    # 5) 4.0    end

	    # a wavelet sera gerada com as regras acima

	    # serao calculadas as energias em cada faixa mencionada a partir do
	    # espectro de uma dimensao considerando que o espalhamento entre cada
	    # frequencia seja de 1/T

	    #calculo do espectro de uma dimensao

	    ww55 = zeros((10,1))

	    han = 1 #aplicacao da janela: han = 1 hanning ; han = 0 retangular

	    gl = 32

	    qq1 = espec.espec1(co,nfft,fs)

	    f1 = qq1[:,0]

	    qq1 = qq1[:,1] #auto-espectro

	    #faixas em segundos
	    #2     3    4
	    #4     6    7.2
	    #7.14  8    10.8
	    #10.3  16   20.0

	    #intervalo de frequencia
	    df = f1[1] - f1[0]

	    #onda significativa (coloca a altura na primeira linha de ww5)
	    ww55[0] = 4 * sqrt(sum(qq1) * df)

	    #espectros nas 4 faixas - 32 gl
	    ww55[1] = sum(qq1[1:5])
	    ww55[2] = sum(qq1[5:7])
	    ww55[3] = sum(qq1[7:14])
	    ww55[4] = sum(qq1[14:33])

	    #picos1 eh o valor da duracao da wavelet que sera usada
	    #correspondendo a 3 ciclos do periodo de interesse

	    #quando nao ha pico na faixa: 48=16s ; 27=9s ; 
	    #18=6s ; 9=3s
	    picos1 = np.array([48,27,18,9])

	    #calcula a diferenca do vetor qq1 (ex: qq1[2] - qq1[1] = g1[1] )
	    g1 = np.diff(qq1)

	    #coloca 1 p/ valores >1, 0 p/ =0 e -1  <0
	    g1 = np.sign(g1)

	    #calcula a diferenca
	    g1 = np.diff(g1)

	    #acrescenta um valor no inicio de g1
	    g1 = np.array( [0] + list(g1) )

	    #acha indices dos picos
	    g1 = pl.find(g1 == -2)

	    #serao calculados os 4 maiores picos

	    #acha os valores dos picos (g4) e indices dos picos (g5)
	    g4 = sort(qq1[g1])

	    g5 = argsort(qq1[g1])

	    #g5 = range(len(g4)-1,-1,-1)

	    #fica igual ao g1 (matriz com picos em ordem crescente)
	    g6 = flipud(g1[g5])

	    #comeca criando a matriz com picos , pq??
	    #g6 = array( list(g6)+[0,0,0,0] )

	    #escolhe os 4 primeiros maiores?
	    #g6 = g6[0:4]

	    #retira valores maiores que 14 (pra tirar os picos em alta freq?)
	    g7 = g6[g6<14]

	    #cria faixas de frequencia (periodo) - pq nao usa faixa 4?
	    #no matlab esta transposto
	    faixa1 = np.array([3,4])
	    faixa2 = np.array([5,6])
	    faixa3 = np.array(range(7,14))

	    #colocacao dos picos nas primeiras faixas para determinacao das wavelets
	    picos2 = np.zeros((4,1))

	    for gh in range(len(g7)):

	        #se o valor de g7[gh] estiver dentro da faixa1
	        if g7[gh] in array(faixa1):

	            #acha o indice da faixa1 que esta o g7(gh)
	            #g8 = find(g7[gh] == faixa1)

	            picos2[0] = g7[gh]

	            faixa1 = 0        	

	        if g7[gh] in array(faixa2):

	            #acha o indice da faixa1 que esta o g7(gh)
	            #g8 = find(g7[gh] == faixa2)

	            picos2[1] = g7[gh]

	            faixa2 = 0

	        if g7[gh] in array(faixa3):

	            #g8 = find(g7[gh] == faixa3)

	            picos2[2] = g7[gh]

	            faixa3 = 0
	    	# print gh

	    picos3 = picos1

	    # # o que faz isso? (esta dando erro no proc do mes de maio de 2009)
	    # for gh in range(4):

	    #     if picos2[gh] > 0:

	    #         picos1[gh] = round(3 * 1./f1[int(picos2[gh])-1])

	    #valores dos picos para o arquivo final
	    g5 = flipud(g5)
	    g5 = g1[g5]
	    g5 = list(g5) + [0,0,0,0]
	    g5 = array(g5[0:4])
	    g = find(g5 > array(0))

	    #correcao henrique
	    g5aux = []
	    for i in range(len(g)):

	        g5aux.append(64 / float(g5[i]))

	    
	    if len(g5aux) < 4:

	        g5 = array(g5aux + [0,0,0,0])
	        g5 = g5[0:4]

	    #transforma em matriz de 4 col e 1 lin
	    g5 = resize(g5,(len(g5),1))

	    #preparo final do energ
	    ww55[6:11] = g5

	    energ[:,kkl] = ww55[:,0]

	    #serao calculadas 5 faixas com wavelets
	    #para cada wavelet calcula-se uma matriz de direcao
	    #e desvio padrao obtendo-se um D(teta) para cada faixa

	    for iwq in range(4):

	        #acha dentro de mm o indice do valor de picos[iwq]
	        g11 = find(picos1[iwq] == mm)

	        #acha o valor do periodo? da wavelet
	        m = mm[g11[0]]

	        #cria variavel out com a wavelet a ser utilizada (pega
	        #as linhas e colunas da wavelet)

	        out1 = wavecos[0:m,g11[0]]
	        out3 = wavesen[0:m,g11[0]]

	        #cria matriz com valores 1
	        matr1 = ones((20,90))

	        #perguntar p parente??
	        m1 = 1024 - m

	        #parametros para o calculo de tet2 e sp2
	        m3 = m1 ; m1 = m1 - 1 ; m3 = m1
	        m4 = 2 * dt / (m * 0.375) #para corrigir a janela de hanning
	        #como eu ja corrigi em espec1, preciso fazer?

	        m2 = m - 1

	# ==============================================================================#
	#daatRS21_32.m

	        #chama subrotina da daat

	        #CODE daatwaverider21w calculates the main direction
	        #for each segment with wavelet (morlet type);
	        #the formulatuio of Lygre and Krogstad is used

	        #usa-se a convolucao com a wavelet complexa

	        a1 = lfilter((out1 - 1j * out3), 1, co)
	        a2 = lfilter((out1 - 1j * out3), 1, dd)
	        a3 = lfilter((out1 - 1j * out3), 1, dc)

	        m4 = 2*dt / (m*0.375) #precisa fazer?

	        #pq pegar a partir de m?
	        a1 = a1[m-1:1025]
	        a2 = a2[m-1:1025]
	        a3 = a3[m-1:1025]

	        #espectros cruzados
	        z41 = a1
	        z42 = a2
	        z43 = a3

	        #espectros cruzados
	        a4 = m4 * (z41 * conj(z41))
	        a8 = m4 * imag(z41 * (- conj(z42)))
	        a9 = m4 * imag(z41 * (- conj(z43)))

	        a20 = m4 * (z42 * conj(z42))
	        a21 = m4 * (z43 * conj(z43))

	        a25 = a20 + a21
	        a7 = sqrt(a4 * a25)

	        a12 = m4 * real(z42 * conj(z43))

	        # #a8 eh o cosseno, projecao no eixo W-E
	        # #a9 eh o seno, projecao no wixo S-N
	        # #o angulo c0 calculado eh em relacao ao eixo horizontal

	        c0 = a8 + 1j * a9

	        c1 = c0 / a7

	        c01 = cos(c0)
	        c02 = sin(c0)
	        c03 = angle(mean(c01) + 1j * mean(c02))
	        c03 = ceil(c03 * 360 / (2 * pi))

	        c2 = (a20 - a21 + 1j * 2 * a12) / a25
	        c0 = angle(c0) * 360 / (2 * pi)
	        c0 = ceil(c0)

	        # c00 = find(c0<=0)         ##pra que utiliza??
	        # c0[c00] = c0[c00] + 360   ## nenhuma variavel criada aqui esta sendo utilizada
	        # pq = ceil(mean(c0)) ##nao utiliza
	        # pq = c03
	        # g = find(pq <= 0)
	        # pq[g] = pq[g] + 360

	        p1 = (c1 - c2 * conj(c1)) / (1 - abs(c1) ** 2)
	        p2 = c2 - c1 * p1

	        tet2 = zeros((1,m3+2))

	        #in order to avoid the ambiguity caused by 2teta the main 
	        #direction calculated by Fourier techniques is used 
	        #as a reference; the mem value is calculated in an interval
	        #of 100 degrees around this value;

	        for kl in range(m3+2):

	            p3 = ceil(c0[kl])

	            d = list(arange(p3,p3+100))

	            z1 = 1 - p1[kl] * conj(a26[d]) - p2[kl] * conj(a27[d])

	            z1 = z1 * conj(z1)

	            #z1 = array([round(v,7) for v in real(z1)])

	            #minimum of denominator is sufficient to
	            #determine the maximum

	            p5 = find(z1 == min(z1))
	            p5 = p5[0]
	            p7 = a30[p3 + p5 - 1]

	            tet2[0,kl] = grad1 * p7


	        tet2 = tet2.T

	        sp2 = a4

	# # ==============================================================================#
	# #daatRS22_32.m

	        #CODE daatbcampos22.m to select the segments for
	        #the directional spectrum composition
	        ################################################
	        #Prepared by C.E. Parente
	        ################################################

	        it = 2 * (iwq - 1 + 1) + 1 #verificar, que teria que dar 1 e ta dando -1

	        q1 = cos(tet2).T
	        q2 = sin(tet2).T

	        #Preparing ensembles of m segments advancing one sample

	        #fr3 ia a matrix of cos and fr5 of sines of the segments whose direction
	        #stability will be investigated
	        #fr4 is the spectrum matrix

	        pm = len(arange(round(m/2.0),m1-(m-round(m/2.0))))+1

	        fr3 = zeros((round(m/2.0),pm))

	        fr5 = copy(fr3)
	        fr4 = copy(fr3)

	        for ip in arange(round(m/2.0)):

	            fr3[ip,:] = q1[0,ip:m1-(m-ip)+1]
	            fr5[ip,:] = q2[0,ip:m1-(m-ip)+1]
	            fr4[ip,:] = real(sp2[ip:m1-(m-ip)+1])

	        #using the mean and the standard circular deviation
	        #to select the segments with a given stability

	        fr2a = mean(fr3.T, axis=1)
	        fr2b = mean(fr5.T, axis=1)

	        r = sqrt(fr2a ** 2 + fr2b ** 2)

	        #circular deviation
	        fr9 = sqrt(2 * (1 - r))

	        #espectro medio por coluna
	        fr45 = mean(fr4.T, axis=1)

	        fr2 = angle(fr2a + 1j * fr2b)

	        #correcao para os valores ficarem entre 0 e 2pi
	        g = find(fr2 < 0) ; fr2[g] = fr2[g] + 2 * pi
	        g = find(fr2 > 2 * pi) ; fr2[g] = fr2[g] - 2 * pi

	        #g vai ser o comprimento do vetor
	        g = len(fr2)

	        a15 = 0
	        zm = 0.5

	        #segments with values of the standard deviations smaller
	        #than the threshold are selected

	        er5 = copy(fr45)

	        b7 = find(fr9 < zm)

	        a15 = fr2[b7]

	        er4 = mean(fr4[:,b7], axis=0)

	        #Correcting for declination
	        # a15 is the final vector with selected direction values

	        a15 = ceil(a15 * 360 / (2 * pi))

	        #a15 = 90 + a15 - 14 (waverider santa catarina)
	        #a15 = 90 + a15 - 21 (waverider de arraial)
	        #Boia ES dmag -23
	        #usando o EtaEW e EtaNS ja esta descontado a dmag

	        a15 = 270 - a15
	        g = find(a15<0) ; a15[g] = a15[g] + 360
	        g = find(a15>360) ; a15[g] = a15[g] - 350

	        #caixas para acumulo e obtencao de D(teta)

	        w1 = zeros((360,1)) #direcao principal
	        w2 = zeros((360,1)) #ocorrencias

	        a16 = copy(a15)

	        if len(a15) > 1: #caso existam valores selecionados

	            b1 = find(a15<=0) ; a15[b1] = a15[b1] + 360
	            b1 = find(a15>360) ; a15[b1] = a15[b1] - 360

	            #a15 = round(a15)

	            for k in range(len(a15)):

	                bb = a15[k]
	                w1[bb-1] = w1[bb-1] + real(sp2[k])
	                w2[bb-1] = w2[bb-1] + 1

	        [b,t1] = butter(6,0.075)
	        #b = resize(b,(len(b),1))
	        #t1 = resize(t1,(len(t1),1))

	        #filtrando w1 para determinar o D(teta)
	        xx = array(list(w1[321:361]) + list(w1) + list(w1[0:41]))
	        xx = xx[:,0]

	        x = filtfilt(b,t1,xx)
	        x = x[41:401]
	        g = find(x<0)
	        x[g] = 0

	        #calculando as duas direcoes
	        g1 = diff(x)
	        g1 = sign(g1)
	        g1 = diff(g1)
	        g1 = array([0] + list(g1) )
	        g1 = find(g1 == -2)

	        p1 = sort(x[g1])
	        p2 = argsort(x[g1])

	        if len(p1) > 0:

	            p = array(list(flipud(g1[p2])) + [0])
	            p = p[0:2]

	            e = array(list(flipud(p1)) + [0])
	            e = e[0:2]

	        #joga fora valores espacados menos de 50 graus
	        if abs(p[0] - p[1]) < 20:

	            p[1] = 0
	            p[1] = 0

	        elif e[1] < 0.1 * e[0]:

	            e[1] = 0
	            p[1] = 0

	        z1 = ww55[iwq + 1]

	        p = array(list(p) + [0,0,0])
	        p = p[0:2]

	        e = array(list(p) + [0,0,0])
	        e = e[0:2]

	        e = e * z1 / sum(e)

	        dire1[it-1:it+1,kkl] = p
	        espe1[it-1:it+1,kkl] = e

	    kkl = kkl + 1

	toc = time.clock()
	texec = toc - tic

	print 'Tempo de execucao DAAT (s): ', texec
	return espe1, energ, dire1
Exemple #9
0
dados = np.loadtxt(os.environ['HOME'] + '/Dropbox/lioc/dados/pnboia/triaxys/rio_grande/HNE/200912130600.HNE',
	    skiprows = 11)

t = dados[:,0] - dados[0,0]
eta = dados[:,1]


# ------------------------------------------------- #
#calcula parametros de onda para a serie normal
#param =  [Hs,H10,Hmax,Tmed,THmax]

#parametros de onda no tempo
etat = proconda.ondat(t,eta,200)

#parametros de onda na frequencia
etaf = espec.espec1(eta,328,1.28)
hm0 = 4.01 * sp.sqrt(sum(etaf[:,1]) * (etaf[0,0]))

# ------------------------------------------------- #

#cria serie perturbada
etap = cp.copy(eta)
#etap1 = cp.copy(eta)

#numero de perturbacoes
npt = 50

#duracao da perturbacao
dpt = 50

#posicoes aleatorias das perturbacoes
Exemple #10
0
#coloca data em datetime
df.index = pd.to_datetime(df.date, format='%d/%m/%Y %H:%M')
dfp.index = df.index

#mare mateorologica
dfp.mm = df.mare - dfp.prev
mmm = df.mare - dfp.prev

#dfp.index = pd.to_datetime(dfp.date, format='%d/%m/%Y %H:%M')

fs = 1.0 / (5.0 / 60 / 24)
nfft = len(df) / 2

#calculo do espectro
aa = espec.espec1(df.mare, nfft, fs)

#espectro mare meteo
aamm = espec.espec1(dfp.mm, nfft, fs)
aap = espec.espec1(dfp.prev, nfft, fs)

#achar a onda de mare meteo
dfp.Mareonda = pd.rolling_mean(dfp.mm, 1080)
onda = dfp.Mareonda - np.mean(dfp.Mareonda)

pl.figure()
pl.plot(df.index, df.mare)

pl.figure()
pl.semilogx(aa[:, 0], aa[:, 1], 'b')
pl.semilogx(aamm[:, 0], aamm[:, 1], 'r')