Harmoniques

Soyez le premier à donner votre avis sur cette source.

Vue 5 976 fois - Téléchargée 451 fois

Description

Electronique:
Etude de forme de signal en ajoutant des harmoniques sur une sinus de base.
N'ayant pas trouvé de prog sur le Net pour visualiser et étudier l'effet des harmoniques , j'en ai fait un;
l'affichage se fait sur 2 périodes .

Afin de faire ressortir les formes de signaux remarquables carré (paires), tiangle (impaires) , dent de scie (paires et impaires)

H0 = fondamentale
H2 à H10 harmoniques

Regler les "slider"
Check box , "efface", pour effacer à chaque changement, ou laisser pour voir les anciennes traces.

Source / Exemple :


Option Explicit
Dim cosx, siny As Single
Const PI = 3.14159

Private Sub Command1_Click()
    Dim i, positionX, positionY As Integer
    Dim H2, H3, h4, h5, h6, h7, h8, h9, h10, h11, h12 As Integer
    If Check1.Value = Checked Then Line (200, 2500)-(16000, 8000), , BF
    siny = 6.28 / 360
    cosx = cosx - 50
    For i = 1 To 720
        Me.DrawWidth = 1
        positionX = (i * 10) + 4000
        H2 = Sin(siny * (i * 2)) * 10 * (100 - Slider1.Value)
        H3 = Sin(siny * (i * 3)) * 10 * (100 - Slider2.Value)
        h4 = Sin(siny * (i * 4)) * 10 * (100 - Slider3.Value)
        h5 = Sin(siny * (i * 5)) * 10 * (100 - Slider4.Value)
        h6 = Sin(siny * (i * 6)) * 10 * (100 - Slider5.Value)
        h7 = Sin(siny * (i * 7)) * 10 * (100 - Slider6.Value)
        h8 = Sin(siny * (i * 8)) * 10 * (100 - Slider7.Value)
        h9 = Sin(siny * (i * 9)) * 10 * (100 - Slider8.Value)
        h10 = Sin(siny * (i * 10)) * 10 * (100 - Slider9.Value)
        
        positionY = Sin(siny * i) * (10 * (100 - Slider0.Value)) + H2 + H3 + h4 + h5 + h6 + h7 + h8 + h9 + h10 + 5000
        PSet (positionX, positionY), vbGreen
    Next i
    DoEvents

End Sub

Private Sub Command2_Click()
 Line (200, 200)-(16000, 10000), , BF

End Sub

Private Sub Command3_Click()
Slider0 = 0
Slider1 = 100
Slider2 = 100
Slider3 = 100
Slider4 = 100
Slider5 = 100
Slider6 = 100
Slider7 = 100
Slider8 = 100
Slider9 = 100
'Slider10 = 100

End Sub

Private Sub Command8_Click()
End
End Sub

Private Sub Slider0_Change()
Command1_Click
End Sub

Private Sub Slider1_Change()
Command1_Click

End Sub

Private Sub Slider2_Change()
Command1_Click
End Sub

Private Sub Slider3_Change()
Command1_Click
End Sub

Private Sub Slider4_Change()
Command1_Click
End Sub

Private Sub Slider5_Click()
Command1_Click
End Sub

Private Sub Slider6_Change()
Command1_Click
End Sub

Private Sub Slider7_Change()
Command1_Click
End Sub

Private Sub Slider8_Change()
Command1_Click
End Sub

Private Sub Slider9_Change()
Command1_Click
End Sub

Private Sub Timer1_Timer()
Timer1.Enabled = False
Command1_Click

End Sub

Conclusion :


c'est juste une ébauche , on pourrait ajouter d'autre chose,
L'effacement notament est un peu à améliorer...

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
280
Date d'inscription
jeudi 24 mars 2005
Statut
Membre
Dernière intervention
18 mars 2009

je me suis donné quelques temps pour améliorer ta source (boucles limitées aux additions et multiplications et tu pourras facilement généraliser à n harmoniques). Il faudrait déjà utiliser un groupe de contrôles pour les slider.
Ci-dessous le code complet à copier dans form1, je n'ai pas trouvé l'intérêt du timer:

Option Explicit
Dim Coef As Double
Private PI As Double, SinA As Double, CosA As Double


'Soient Uki=sin(Coef*k*i) et Vki=Cos(Coef*k*i) avec Coef=2*PI/360
'Pour k=1 on Mi=U1i=sin(Coef*i) et Ni=V1i=Cos(Coef*i)
'Soient les constantes SinA=Sin(Coef) et CosA=Cos(Coef)
'On a M0=0 et N0=1
'M(i+1)=Mi*CosA + Ni*SinA et N(i+1)=Ni*CosA - Mi*SinA
'U(k+1)i=Uki*Ni + Vki*Mi et V(k+1)i=Vki*Ni - Uki*Mi

Private Sub Command1_Click()
Dim i As Long, k As Long
Dim positionX As Long, positionY As Integer
Dim Mi As Double, Mi_ As Double, Ni As Double
Dim Uki As Double, Uki_ As Double, Vki As Double
Dim Hki As Double


If Check1.Value = Checked Then Command2_Click

Mi 0: Ni 1
positionX = 4000
For i = 1 To 720
Me.DrawWidth = 1
positionX = positionX + 10
Mi_ Mi: Mi Mi * CosA + Ni * SinA
Ni = Ni * CosA - Mi_ * SinA
Uki Mi: Vki Ni 'en effet Mi=Uki pour k=1 et Ni=Vki pour k=1
'Calcul de H2 + H3 + ... +H10
Hki = 0
For k = 2 To 10
Uki_ Uki: Uki Uki * Ni + Vki * Mi
Vki = Vki * Ni - Uki_ * Mi
Hki = Hki + Uki * 10 * (100 - Slider(k - 1).Value)
Next k

positionY = Mi * (10 * (100 - Slider(0).Value)) + Hki + 5000
PSet (positionX, positionY), vbGreen
Next i
DoEvents
End Sub

Private Sub Command2_Click()
Me.Cls
End Sub

Private Sub Command3_Click()
Slider(0) = 0
Slider(1) = 100
Slider(2) = 100
Slider(3) = 100
Slider(4) = 100
Slider(5) = 100
Slider(6) = 100
Slider(7) = 100
Slider(8) = 100
Slider(9) = 100
'Slider(10) = 100
Call Command1_Click
End Sub

Private Sub Command8_Click()
Unload Me
End Sub

Private Sub Form_Load()
PI = 4 * Atn(1)
Coef = 2 * PI / 360
SinA = Sin(Coef)
CosA = Cos(Coef)
Call Command1_Click
End Sub

'La courbe se redessine auto quand l'utilisateur scroll
Private Sub Slider_Scroll(Index As Integer)
Command1_Click
End Sub
Messages postés
20
Date d'inscription
samedi 9 octobre 2004
Statut
Membre
Dernière intervention
20 janvier 2008

Merci pour tous vos commentaires interessants, j'en tiendrais compte si j'améliore ce prog et surtout pour d'autres applis du mème genre.
Messages postés
473
Date d'inscription
mercredi 7 août 2002
Statut
Membre
Dernière intervention
10 juin 2015

un petit truc tout bête, mais tellement utile :
Pi = Atn(1) * 4
La précision du nombre en est considérablement augmentée.
Messages postés
20
Date d'inscription
samedi 9 octobre 2004
Statut
Membre
Dernière intervention
20 janvier 2008

Dim a, b As Integer
a = " test"
b = "test"

C'est vrai le second déclenche une erreur.
Habitué aux déclarations en C, je n'ai pas vérifié , bien qu'ayant un doute tout de même en lisant certaines sources.

pour pi , oui , toujours distrait
ainsi que cosx qui sert à rien ...

For i=0 To 9
Slider(i).Value=100
Next i
Oui, j'y ai pensé , mais les valeurs ne sont pas toutes à 100 , notamment le premier qui est à 0, de plus j'ai pensé ajouté des boutons pour des formes remarquables obligeant le renseiggnement une à une les variables , donc aucun avantage.
De plus la numérotation à un trou pour l'index 1 qui n'existe pas.
J'ai choisie cette solution.A tort ou à raison, je ne sais pas,
pour les plus;
Les fonctions change seraient regrouper
pour les moins
Les cas particuliers des index 0 et 1 complique le traitement général.
Messages postés
280
Date d'inscription
jeudi 24 mars 2005
Statut
Membre
Dernière intervention
18 mars 2009

Au lieu de prendre Vk(i+1)=sqr(1-Uk(i+1)^2), c'est mieux d'avoir Vk(i+1)=Cos(A*k)*Vki - Sin(A*k)*Uki. En effet la fonction sqr (racine carrée est également autant complexe que les fonctions sin et cos.
Afficher les 11 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.