Bonjour,
Je cherche à partir d'un signal de courant mesuré en mer à séparer les différents processus, courants de marée, courants dus au vent qui interviennent à des fréquences différentes.
Mon but est donc de passer dans le domaine spectral pour sélectionner des bandes spectrales, par exemple entre 11h et 13h pour isoler le signal de marée. Jusqu’à présent je mettais assez brutalement les valeurs en dehors de la bande à zéro, mais le signal récupéré en sortie n'est pas toujours très propre.
Par exemple sur la Figure 1 je crée trois signaux sinusoïdaux avec des fréquences de trois jours, 17h et 12h. je les somme. le but est de les recomposer le mieux possible en filtrant les autres.

Figure 1:


Pour vérifier que je ne fais pas de bêtise, je passe dans le domaine spectral (fft) et je repasse en temps (ifft) sans rien enlever. Le spectre est présenté sur le premier subplot de la Figure 2. On retrouve bien les trois pics aux fréquences des trois signaux additionnés. Si je passe en temps, je retrouve bien mon signal original (subplot 2 Figure 2, en vert le signal recomposé et en noir le signal initial). Le subplot 3 est juste un zoom du subplot 2.

Figure 2:


Maintenant si j'essaie de récupérer le signal à 17h (je vous montre celui-ci car c'est le pire, le signal filtré à 3j est bon celui par contre). Donc en gros ma méthode: je mets à zéro ce qui est en dehors de la bande [15h 19h] de chaque côté du spectre. Voila ce que ça donne:

Figure 3:


Donc en gros c'est pas mal sauf au début et à la fin du signal ou c'est pas bon.
J'ai essayé d'utiliser un filtre passe bande comme expliqué dans la faq mais j'ai du me gourer quelque part, ça filtrait rien du tout...

voila le bout de 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
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
clear all
scrsz = get(0,'ScreenSize');
%longueur du signal 2mois donc 2*30jours de 24h -1
lend=2*30*24-1;
%echantillonage de 1h
T = 3600;
t=(1:lend-1)*T;tmin=min(t);tmax=max(t);
 
%Définition des fréquences des signaux
f1=(3*24*3600);
f2=(17*3600);
f3=(12*3600);
 
%creation des signaux
u1=0.20*sin(2*pi/f1*t);
u2=0.10*sin(2*pi/f2*t);
u3=0.12*sin(2*pi/f3*t);
 
%signal complet
y1=(u1+u2+u3)';
L = size(y1,1); 
 
 
 
%plot des signaux
k=figure('Position',[-1 -80 scrsz(3)/1.2 scrsz(4)])
subplot(4,1,1,'fontsize',16)
plot(t(1:L),u1,'k')
title('u1=0.20*sin(2*pi/f1*t)')
subplot(4,1,2,'fontsize',16)
plot(t(1:L),u2,'k')
title('u2=0.10*sin(2*pi/f2*t)')
subplot(4,1,3,'fontsize',16)
plot(t(1:L),u3,'k')
title('u3=0.12*sin(2*pi/f3*t)')
subplot(4,1,4,'fontsize',16)
plot(t(1:L),y1,'k')
title('u1+u2+u3')
 
 
 
Fs= 1/T;
f1 = Fs/2*linspace(0,1,floor(L/2));
Y1 = fft(y1)/L;
 
k19=1/(19*3600);
ik19=max(find((f1<k19)));
k15=1/(15*3600);
ik15=max(find((f1<k15)));
 
 
 
 
%signal complet
r1=real(ifft(Y1)*L); 
 
k=figure('Position',[-1 -80 scrsz(3)/1.2 scrsz(4)])
subplot(3,1,1,'fontsize',12)
    plot(f1,2*abs(Y1(1:floor(L/2),: )),'k','linewidth',2)
    set(gca,'XScale','log')
    xlim([f1(1) f1(floor(L/2))])
    legend('Spectre sélectionné')
 
sb1=subplot(3,1,2,'fontsize',12)
    plot(t(1:L),y1,'k','linewidth',2);
    hold on
    plot(t(1:L),r1','--g','linewidth',2);
    xlim([tmin-1 tmax+1])
 
sb1=subplot(3,1,3,'fontsize',12)
    plot(t(1:L),y1,'k','linewidth',2);
    hold on
    plot(t(1:L),r1','--g','linewidth',2);
    legend('signal initial','signal filtré recomposé')
    xlim([tmin-1 (tmax+1)/5])
 
 
 
 
%Filtrage autour de 17h
Y12=Y1;
%je supprime les périodes plus grandes que 19h des deux côtés du spectre
Y12(1:ik19,: )=0;
Y12(end-ik19:end,: )=0;
% je supprime les périodes plus petites que 15h
Y12(ik15:end-ik15,: )=0;
 
 
lt1=real(ifft(Y12)*L); 
 
k=figure('Position',[-1 -80 scrsz(3)/1.2 scrsz(4)])
subplot(3,1,1,'fontsize',12)
    plot(f1,2*abs(Y12(1:floor(L/2),: )),'k','linewidth',2)
    set(gca,'XScale','log')
    xlim([f1(1) f1(floor(L/2))])
    legend('Spectre sélectionné')
 
sb1=subplot(3,1,2,'fontsize',12)
    plot(t(1:L),u2,'k','linewidth',2);
    hold on
    plot(t(1:L),lt1','--g','linewidth',2);
    xlim([tmin-1 tmax+1])
 
sb1=subplot(3,1,3,'fontsize',12)
    plot(t(1:L),u2,'k','linewidth',2);
    hold on
    plot(t(1:L),lt1','--g','linewidth',2);
    legend('signal initial','signal filtré recomposé')
    xlim([tmin-1 (tmax+1)/5])
J'ai une question en plus, quand on part d'un signal pair, à quoi correspond le réel au milieu du spectre? Ne sachant pas ce que c'était je suis parti de signaux impairs et de cette manière je n'ai pas de réels au centre.

J'espère que vous pourrez m'aider, je suis en fin de thèse et je suis à la bourre......
merci beaucoup