Parfait!
Si je jeux resserrer un peu le domaine en X pour le Ymin : ou puis-je modifier pour passer à plus de 10%?
Thanks.
Version imprimable
Parfait!
Si je jeux resserrer un peu le domaine en X pour le Ymin : ou puis-je modifier pour passer à plus de 10%?
Thanks.
En Ligne 20
AvecCode:For i = Ind(1, j) + 4 To Ind(1, j) + Ind(2, j) - 5
j: le N° du créneau positif
Ind(1,j): l'abscisse Xj du créneau j avec Yj>0 (correspondant au point Nj)
Ind(2,j): le nombre de points du créneau j (on va l'appeler n)
Pour parcourir toute la largeur du créneau, on aurait fais
Or, pour ne pas prendre en considération les paliers montants et descendant pour rechercher le Ymin (sinon, ça serait toujours 0), la recherche commence 4 points plus tard et se termine 4 points avant la fin du créneau)Code:For i = Nj To Nj + n -1
Si tu veux encore serrer, au lieu du 4 mets un nombre plus grand qui te convient.Code:For i = Nj +4 To Nj + n -1 - 4
PS: J'avais commencé par calculer le Ymin en fonction d'un pourcentage de Ymax pour chaque créneau. Mais, il y a des créneaux où le Ymin n'est pas le réel.
La boucle commence en Xi
Ci-joint code légèrement modifié et qui prends en compte la moyenne de chaque créneau (ci-après Y_MoyCr en colonne F) et non la moyenne entre le Ymax et Ymin de chaque créneau (Colonne E).
En effet, en présence de pics, le moyenne entre Ymin et Ymax ne reflète pas la topologie véritable du graphique.
Aussi, la variable N permet de déterminer le pas (décalage en nombres de points) à ne pas prendre en considération lors du calcul du Ymin et du Y_MoyCr.
La fonction Maxim est légèrement modifiée pour plus de clarté.
Code:
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 Sub Lissage() Dim LastLig As Long, i As Long, j As Long Dim P As Double, Q As Double, S As Double Dim Tb, Ind() Dim N As Byte Application.ScreenUpdating = False N = 3 'Nombre de points de décallage pour la recherche du Ymin de chaque créneau positif With ThisWorkbook.Worksheets("Feuil5") .Range("C:F").ClearContents LastLig = .Cells(.Rows.Count, "A").End(xlUp).Row Tb = .Range("A1:F" & LastLig) Tb(1, 3) = "Y_Max": Tb(1, 4) = "Y_Min": Tb(1, 5) = "Y_Moy (Ymax-Ymin)/2": Tb(1, 6) = "Y_MoyCr" Ind = Maxim(Tb) For j = 1 To UBound(Ind, 2) - 1 P = Ind(3, j) Q = Ind(3, j) S = 0 For i = Ind(1, j) + N To Ind(2, j) - N Q = IIf(Tb(i, 2) < Q, Tb(i, 2), Q) S = S + Tb(i, 2) Next i S = S / (Ind(2, j) - Ind(1, j) - 2 * N + 1) For i = Ind(1, j) To Ind(1, j + 1) - 1 Tb(i, 3) = P 'Ymax Tb(i, 4) = Q 'Ymin Tb(i, 5) = (P + Q) / 2 'Moyenne Ymin/ Ymax Tb(i, 6) = S 'Moyenne créneau Next i Next j .Range("A1:F" & LastLig) = Tb End With End Sub Private Function Maxim(Tb) As Variant Dim i As Long, k As Long, Pos As Long Dim First As Boolean Dim P As Double Dim Temp() For i = 2 To UBound(Tb, 1) If Tb(i, 2) > 0 Then If Not First Then Pos = i P = IIf(Tb(i, 2) > P, Tb(i, 2), P) First = True Else If First Then k = k + 1 ReDim Preserve Temp(1 To 3, 1 To k) Temp(1, k) = Pos 'Début de Créneaux positif Temp(2, k) = i - 1 'Fin de Créneaux positif Temp(3, k) = P 'Valeur maximale de Créneaux positif First = False P = 0 End If End If Next i Maxim = Temp End Function
En effet, c'est encore mieux!
Si je comprends bien, plus N est grand et plus on resserre le domaine en X pour la détermination de Ymin? et qui modifie par conséquent la valeur de YmoyCr?
Merci
Supposons qu'on un créneau comportant 27points
p1=0, p2>0....p26>0,p27=0
-Pour N=0 on calcul Ymin de p1 à p27 (forcément Ymin=0)
-Pour N=1, on calcul Ymin de p2 à p26
-Pour N=2, on calcul Ymin de p3 à p25
Le choix de N dépend des résultats souhaités et vue tes courbes, si N est assez grands, on réduit beaucoup notre échantillon et tu vas te trouver avec des situations fausses.
J'ai fais des tests, Pour N=3...5, le résultat est satisfaisant pour tous les créneaux.
Parfait!
Thanks
Bonjour,
Le signal en question est souvent décentré sur Y! Il faudrait le centré sur O donc généré un Ycentré puis à partir de X brute et Ycentré calculer YmoyCrêtes seulement comme précédemment pour lisser la courbe.
Sauf que le signal ne débute pas forcément à X=0 pour finir à X=fin, le code doit me permettre de choisir l'intervalle.
Dans le cas ou le signal débute à X=0 jusqu'au dernier point puis dans le cas par exemple où X=300 jusqu'à X=1500 en prenant bien soin de faire la correction en Y trouvé sur le signal pour les points allant de 0 à 300 et 1500 au dernier point.
Voilà comment je procède sinon : je sélectionne le signal puis j'ajoute une courbe de tendance linéaire, l'ordonné à l'origine trouvée je modifie les valeurs de Ybrute.
Merci!
No idea?
Thx!