Bonjour,

J'ai un vieux programme fonctionnant sous DOS qui reste très pertinent dans le calcul de marées.
J'ai donc récupéré toutes les hauteurs de 12H en 12H sur la période 01/01/2000 à 31/12/2020 voici le lien vers mon fichier de données Vecteurs.xlsx

Je m'étais dit qu'il serait possible de retrouver les coefficient de la transformée de Fourier en ayant ces données. Mais j'arrive à n'importe quoi (en même temps c'est la 1ere fois que j'utilise Matlab).

Pensez-vous que ce soit réalisable ?



J'ai donc Dans mon fichier Matlab un fichier Vecteurs.xlsx à 5 colonnes du type :
jour mois annee haut. temps en Heure
1 1 2000 4,07 0
1 1 2000 4,18 12
2 1 2000 4,09 24
2 1 2000 4,18 36
3 1 2000 4,07 48


Pour récupérer les hauteurs et heures (passées depuis le 01 janvier 2000), je fais ceci :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
[numData] = xlsread('Vecteurs.xlsx', 'Vecteurs', 'A:E');	
	%% Télécharge les colonnes de A à E de la page nommée Vecteurs du fichier Vecteurs.xlsx
	%% Ces 5 colonnes seront du type nombre (réels). (textData pour du texte)
 
>> jours = numData(:,1);   					%% (: toutes les lignes)
								%% (,1 de la 1ere colonne)
>> mois = numData(:,2);
>> annees = numData(:,3);
>> hauteurs = numData(:,4);
>> heures = numData(:,5);

Dans le but de déterminer les Fréquences et Amplitudes significatives je fais ceci :
En retour j'obtien un tableau nommé tableau_resultat de 2 colonnes les contenants (mais beaucoup trop grand à mon avis).

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
>> % Données de temps et de hauteur (votre exemple)
% Échantillonnage temporel régulier
N = length(heures);
ts = heures(2) - heures(1);
fs = 1 / ts;
N_fft = 2^nextpow2(N); % Prochaine puissance de 2
heures_regular = linspace(0, (N - 1) * ts, N_fft);
 
% Interpolation des hauteurs pour échantillonnage régulier
hauteurs_regular = interp1(heures, hauteurs, heures_regular, 'linear');
 
% Calcul de la FFT
hauteurs_fft = fft(hauteurs_regular, N_fft);
frequencies = linspace(0, fs, N_fft);
 
% Extraction des fréquences et amplitudes significatives
seuil_amplitude = 100; % Par exemple, un seuil d'amplitude pour filtrer les composantes insignifiantes
indices_significatifs = find(abs(hauteurs_fft) > seuil_amplitude);
 
frequences_significatives = frequencies(indices_significatifs);
amplitudes_significatives = abs(hauteurs_fft(indices_significatifs));
 
% Tracé de la FFT
figure;
plot(frequencies, abs(fftshift(hauteurs_fft)), 'b', 'linewidth', 2);
xlabel('Fréquence (Hz)');
ylabel('Amplitude');
title('FFT des données de marées interpolées');
grid on;
 
% Création d'un tableau des fréquences et amplitudes significatives
tableau_resultat = [frequences_significatives', amplitudes_significatives'];
 
% Affichage du tableau
disp('Tableau des Fréquences et Amplitudes Significatives :');
disp(tableau_resultat);


Puis pour voir l'allure générale de la courbe en vue de la comparer à ma courbe d'origine je fais ceci :
(Mais ça n'a rien à voir)

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
>> % Vecteurs de fréquences et d'amplitudes
frequences = tableau_resultat(:, 1);
amplitudes = tableau_resultat(:, 2);
 
% Vecteur de temps (à définir en fonction de votre plage temporelle)
t = linspace(0, 150000, 1000); % Exemple : plage temporelle de 0 à 1
 
% Initialisation de la somme des sinus
signal_reconstructed = zeros(size(t));
 
% Ajout des termes sinusoïdaux
for i = 1:length(frequences)
    signal_reconstructed = signal_reconstructed + amplitudes(i) * sin(2 * pi * frequences(i) * t);
end
 
% Tracé du signal reconstruit
figure;
plot(t, signal_reconstructed, 'b', 'linewidth', 2);
xlabel('Temps');
ylabel('Amplitude');
title('Reconstruction de la fonction somme de sinus à partir de fréquences et amplitudes');
grid on;
Pourrirez-vous me dire ce qui ne va pas dans mon approche ou mon code ?