2022-03-31 14:40:19 +02:00
import csv
import matplotlib . pyplot as plt
import os
import math
import sys
import numpy as np
from matplotlib import animation
import cmath
2022-03-31 15:23:46 +02:00
from scipy . fft import fft
2022-03-31 14:40:19 +02:00
2022-04-01 17:11:37 +02:00
def newtonpplus ( f , h , u ) :
2022-03-31 14:40:19 +02:00
# calcul de k:
g = 9.81
kh = 0.5
x = 0.001
2022-04-01 17:11:37 +02:00
u = - u
while abs ( ( kh - x ) / x ) > 0.00000001 :
2022-03-31 14:40:19 +02:00
x = kh
2022-04-01 17:11:37 +02:00
fx = x * math . tanh ( x ) - ( h / g ) * ( 2 * math . pi * f - ( u / h ) * x ) * (
2 * math . pi * f - ( u / h ) * x
)
fprimx = (
math . tanh ( x )
+ x * ( 1 - ( math . tanh ( x ) ) * * 2 )
+ ( 2 * u / g ) * ( 2 * math . pi * f - ( u / h ) * x )
)
kh = x - ( fx / fprimx )
k = kh / h
2022-03-31 14:40:19 +02:00
return k
2022-04-01 17:11:37 +02:00
def newtonpmoins ( f , h , u0 ) :
2022-03-31 14:40:19 +02:00
# calcul de k:
2022-04-01 17:11:37 +02:00
g = 9.81
kh = 0.5
x = 0.01
x = 6 * h
while np . abs ( ( kh - x ) / x ) > 0.00000001 :
x = kh
fx = x * math . tanh ( x ) - ( h / g ) * ( 2 * math . pi * f - ( u0 / h ) * x ) * (
2 * math . pi * f - ( u0 / h ) * x
)
fprimx = (
math . tanh ( x )
+ x * ( 1 - ( math . tanh ( x ) ) * * 2 )
+ ( 2 * u0 / g ) * ( 2 * math . pi * f - ( u0 / h ) * x )
)
kh = x - ( fx / fprimx )
k = kh / h
2022-03-31 14:40:19 +02:00
return k
2022-04-01 17:11:37 +02:00
# Calcul du vecteur d'onde a partir de la frÈquence
# kh : vecteur d'onde * profondeur d'eau
def newtonpropa ( hi , f ) :
2022-03-31 14:40:19 +02:00
# calcul de k:
2022-04-01 17:11:37 +02:00
g = 9.81
si = ( 2 * math . pi * f ) * * 2 / g
kh = 0.5
x = 0.001
while np . abs ( ( kh - x ) / x ) > 0.00000001 :
x = kh
fx = x * math . tanh ( x ) - si * hi
fprimx = math . tanh ( x ) + x * ( 1 - ( math . tanh ( x ) ) * * 2 )
kh = x - ( fx / fprimx )
kpropa = kh / hi
2022-03-31 14:40:19 +02:00
return kpropa
2022-04-01 17:11:37 +02:00
def reflex3S ( x1 , x2 , x3 , xs1 , xs2 , xs3 , h , mean_freq , fmin , fmax ) :
2022-03-31 14:40:19 +02:00
# Analyse avec transformee de fourier d un signal en sinus
# calcul du coefficient de reflexion en presence d un courant u
# tinit : temps initial
# tfinal : temps final
# deltat : pas de temps
# fech= 1/deltat : frequence d echantillonnage
# T : periode de la houle
# nbrepoints : nombre de points
# fmin : frequence minimale de recherche des maxima du signal de fourier
# fmax : frequence maximale de recherche des maxima du signal de fourier
# ampliseuil : amplitude minimale des maxima recherches
# valeur du courant (u > 0 correspond a un courant dans le sens
# des x croissants)
2022-04-01 17:11:37 +02:00
# u=0;
2022-03-31 14:40:19 +02:00
# h profondeur d'eau
2022-04-01 17:11:37 +02:00
# hold on;
# fech=16;
# fmin=0.1;fmax=4;ampliseuil=0.005;
# nbrepoints=fech*T*1000;
# deltat=1./fech;
# tinit=0;tfinal=tinit+deltat*(nbrepoints-1);
# aitheo=1;artheo=0.4;
# h=3;
# T=1.33;
# ftheo=1/T;
# fech=16;
# fmin=0.1;fmax=4;ampliseuil=0.005;
# nbrepoints=fech*T*1000;
# deltat=1./fech;
# tinit=0;tfinal=tinit+deltat*(nbrepoints-1);
# t = [tinit:deltat:tfinal];
# ktheo = newtonpropa(ftheo,h);
# Positions respectives sondes amonts entr'elles et sondes aval
2022-03-31 14:40:19 +02:00
# entr'elles
2022-04-01 17:11:37 +02:00
2022-03-31 14:40:19 +02:00
# xs1=0;xs2=0.80;xs3=1.30;
2022-04-01 17:11:37 +02:00
# ENTREES DONNEES DES 3 SONDES AMONT et des 2 SONDES AVAL
ampliseuil = 0.005
2022-03-31 14:40:19 +02:00
#'check'
2022-04-01 17:11:37 +02:00
# pause
# PAS DE TEMPS
deltat1 = 1 / mean_freq
deltat2 = 1 / mean_freq
deltat3 = 1 / mean_freq
# transformees de Fourier
Y1 = fft ( x1 , len ( x1 ) )
N1 = len ( Y1 )
Y2 = fft ( x2 , len ( x2 ) )
N2 = len ( Y2 )
Y3 = fft ( x3 , len ( x3 ) )
N3 = len ( Y3 )
# amplitudes normalisees, soit coef de fourier
amplitude1 = np . abs ( Y1 [ 1 : N1 / / 2 ] ) / ( N1 / / 2 )
nyquist = 1 / 2
freq1 = ( np . arange ( 1 , ( N1 / / 2 ) + 1 , 1 ) - 1 ) / ( N1 / / 2 ) / deltat1 * nyquist
amplitude2 = np . abs ( Y2 [ 1 : N2 / / 2 ] ) / ( N2 / / 2 )
nyquist = 1 / 2
freq2 = ( np . arange ( 1 , ( N2 / / 2 ) + 1 , 1 ) - 1 ) / ( N2 / / 2 ) / deltat2 * nyquist
amplitude3 = np . abs ( Y3 [ 1 : N3 / / 2 ] ) / ( N3 / / 2 )
nyquist = 1 / 2
freq3 = ( np . arange ( 1 , ( N3 / / 2 ) + 1 , 1 ) - 1 ) / ( N3 / / 2 ) / deltat3 * nyquist
# recherche de la phase
theta1 = np . angle ( Y1 [ 1 : N1 / / 2 ] )
theta2 = np . angle ( Y2 [ 1 : N2 / / 2 ] )
theta3 = np . angle ( Y3 [ 1 : N3 / / 2 ] )
# pas de frequence deltaf
deltaf = 1 / ( N1 / / 2 ) / deltat1 * nyquist
nbrefreq = len ( freq1 )
# Caracteristiques fondamentaux,sondes canaux 1 et 3
# distances entre les sondes
x12 = xs2 - xs1
x13 = xs3 - xs1
x23 = xs3 - xs2
# Debut calcul des coefficients de reflexion
indmin = np . min ( np . where ( freq1 > 0.02 ) )
indfmin = np . min ( np . where ( freq1 > fmin ) )
indfmax = np . max ( np . where ( freq1 < fmax ) )
2022-03-31 14:40:19 +02:00
T = [ ]
fre = [ ]
aincident12 = [ ]
aincident23 = [ ]
aincident13 = [ ]
areflechi12 = [ ]
areflechi23 = [ ]
areflechi13 = [ ]
r13 = [ ]
ai = [ ]
ar = [ ]
Eincident123 = [ ]
Ereflechi123 = [ ]
count = 0
for jj in np . arange ( indfmin , indfmax , 1 ) :
2022-04-01 17:11:37 +02:00
f = freq1 [ jj ]
# periode
T . append ( 1 / f )
2022-03-31 14:40:19 +02:00
fre . append ( f )
2022-04-01 17:11:37 +02:00
# calcul des vecteurs d'onde
kplus = newtonpplus ( f , h , 0 )
kmoins = newtonpmoins ( f , h , 0 )
k = newtonpropa ( h , f )
deltaku = k - ( kmoins + kplus ) / 2
# amplitude des signaux pour la frequence f:
a1 = amplitude1 [ jj ]
a2 = amplitude2 [ jj ]
a3 = amplitude3 [ jj ]
# dephasages entre les signaux experimentaux des 3 sondes amont
phi1 = theta1 [ jj ]
phi2 = theta2 [ jj ]
phi3 = theta3 [ jj ]
phi12 = phi2 - phi1
phi13 = phi3 - phi1
phi23 = phi3 - phi2
# evolution theorique entre les sondes de la phase pour une onde progressive
delta12p = - kplus * x12
delta13p = - kplus * x13
delta23p = - kplus * x23
delta12m = - kmoins * x12
delta13m = - kmoins * x13
delta23m = - kmoins * x23
# calcul du coefficient de reflexion a partir des sondes 1 et 2
aincident12 . append (
math . sqrt ( a1 * a1 + a2 * a2 - 2 * a1 * a2 * math . cos ( phi12 + delta12p ) )
/ ( 2 * np . abs ( math . sin ( ( delta12p + delta12m ) / 2 ) ) )
)
areflechi12 . append (
math . sqrt ( a1 * a1 + a2 * a2 - 2 * a1 * a2 * math . cos ( phi12 - delta12m ) )
/ ( 2 * np . abs ( math . sin ( ( delta12p + delta12m ) / 2 ) ) )
)
# r12(jj)=areflechi12(jj)/aincident12(jj);
# calcul du coefficient de reflexion a partir des sondes 2 et 3
aincident23 . append (
math . sqrt ( a2 * a2 + a3 * a3 - 2 * a2 * a3 * math . cos ( phi23 + delta23p ) )
/ ( 2 * np . abs ( math . sin ( ( delta23p + delta23m ) / 2 ) ) )
)
areflechi23 . append (
math . sqrt ( a2 * a2 + a3 * a3 - 2 * a2 * a3 * math . cos ( phi23 - delta23m ) )
/ ( 2 * np . abs ( math . sin ( ( delta23p + delta23m ) / 2 ) ) )
)
# r23(jj)=areflechi23(jj)/aincident23(jj);
# calcul du coefficient de reflexion a partir des sondes 1 et 3
aincident13 . append (
math . sqrt ( a1 * a1 + a3 * a3 - 2 * a1 * a3 * math . cos ( phi13 + delta13p ) )
/ ( 2 * np . abs ( math . sin ( ( delta13p + delta13m ) / 2 ) ) )
)
areflechi13 . append (
math . sqrt ( a1 * a1 + a3 * a3 - 2 * a1 * a3 * math . cos ( phi13 - delta13m ) )
/ ( 2 * np . abs ( math . sin ( ( delta13p + delta13m ) / 2 ) ) )
)
# r13.append(areflechi13[jj]/aincident13[jj])
# calcul du coefficient de reflexion par methode des 3 sondesavec moindres carres
delta1m = 0
delta2m = delta12m
delta3m = delta13m
delta1p = 0
delta2p = delta12p
delta3p = delta13p
s1 = (
cmath . exp ( - 1 j * 2 * delta1m )
+ cmath . exp ( - 1 j * 2 * delta2m )
+ cmath . exp ( - 1 j * 2 * delta3m )
)
s2 = (
cmath . exp ( + 1 j * 2 * delta1p )
+ cmath . exp ( + 1 j * 2 * delta2p )
+ cmath . exp ( + 1 j * 2 * delta3p )
)
s12 = (
cmath . exp ( 1 j * ( delta1p - delta1m ) )
+ cmath . exp ( 1 j * ( delta2p - delta2m ) )
+ cmath . exp ( 1 j * ( delta3p - delta3m ) )
)
s3 = (
a1 * cmath . exp ( - 1 j * ( phi1 + delta1m ) )
+ a2 * cmath . exp ( - 1 j * ( phi2 + delta2m ) )
+ a3 * cmath . exp ( - 1 j * ( phi3 + delta3m ) )
)
s4 = (
a1 * cmath . exp ( - 1 j * ( phi1 - delta1p ) )
+ a2 * cmath . exp ( - 1 j * ( phi2 - delta2p ) )
+ a3 * cmath . exp ( - 1 j * ( phi3 - delta3p ) )
)
s5 = s1 * s2 - s12 * s12
ai . append ( abs ( ( s2 * s3 - s12 * s4 ) / s5 ) )
ar . append ( abs ( ( s1 * s4 - s12 * s3 ) / s5 ) )
# refl[jj]=ar[jj]/ai[jj];
# Calcul de l'energie, on divise par le pas de frequence deltaf
# calcul de l'energie incidente sans ponderation avec les voisins
Eincident123 . append ( 0.5 * ai [ count ] * ai [ count ] / deltaf )
Ereflechi123 . append ( 0.5 * ar [ count ] * ar [ count ] / deltaf )
count + = 1
return ai , ar , Eincident123 , Ereflechi123 , indfmin , indfmax , fre