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)
Pourrirez-vous me dire ce qui ne va pas dans mon approche ou mon code ?
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;
Partager