Transformée de fourrier (pas fft)

Soyez le premier à donner votre avis sur cette source.

Vue 6 228 fois - Téléchargée 593 fois

Description

Module (mFourrier.bas) permetant de calculer les coefficients de fourrier pour une fonction f() as integer

Le module permet également de faire le chemin inverse : transformée de fourrier inverse.

ces deux fonctions permettent, avec l'ajout d'un tout petit algorithme, de filtrer un signal.

Source / Exemple :


Option Explicit

Private Const pi = 3.14159265
'*********************************************************
Public Type COMPLEXE
    Reel As Double  'an dans fourrier
    Img As Double   'bn dans fourrier
End Type
'---------------------------------------------------------
Public Type FT
    periode As Integer
    Nmax As Integer
    coef() As COMPLEXE
End Type
'---------------------------------------------------------
Public Function Norme(C As COMPLEXE) As Double
    Norme = Sqr(C.Reel * C.Reel + C.Img * C.Img)
End Function
'---------------------------------------------------------
Public Function Phase(C As COMPLEXE) As Double
    Phase = Atn(C.Img / C.Reel)
End Function
'*********************************************************

Public Function Fourrier_Transform(f() As Integer, Nmax As Integer) As FT
    Fourrier_Transform.periode = UBound(f) - LBound(f) + 1
    Fourrier_Transform.Nmax = Nmax
    ReDim Fourrier_Transform.coef(0 To Nmax)
    
    Dim n As Integer
    For n = 0 To Nmax Step 1
        Fourrier_Transform.coef(n).Reel = An(f, n)
        Fourrier_Transform.coef(n).Img = Bn(f, n)
        
        If (Fourrier_Transform.coef(n).Reel > 1) Or _
            (Fourrier_Transform.coef(n).Img > 1) Then
            Fourrier_Transform.Nmax = n
        End If
    Next
    
    ReDim Preserve Fourrier_Transform.coef(0 To Fourrier_Transform.Nmax)
End Function

Public Function Fourrier_Transform_Inv(f As FT, ift() As Integer)
    Dim min As Integer: min = 1
    Dim max As Integer: max = f.periode
    ReDim ift(1 To max - min + 1)
    
    Dim i As Integer
    Dim n As Integer
    For i = min To max
        ift(i) = f.coef(0).Reel 'A0
        For n = 1 To f.Nmax
            ift(i) = ift(i) + f.coef(n).Reel * Cos(2 * pi * n * i / f.periode)
            ift(i) = ift(i) + f.coef(n).Img * Sin(2 * pi * n * i / f.periode)
        Next
    Next
End Function

Private Function An(f() As Integer, n As Integer) As Double
    Dim i As Integer
    Dim t As Integer
        t = (UBound(f) - LBound(f) + 1)
        
    If (n = 0) Then
        For i = LBound(f) To UBound(f)
            An = An + f(i)
        Next
        An = An / t
    Else
        For i = LBound(f) To UBound(f)
            An = An + (f(i) * Cos(2 * pi * n * i / t))
        Next
        An = An * 2 / t
    End If
End Function

Private Function Bn(f() As Integer, n As Integer) As Double
    Dim i As Integer
    Dim t As Integer
        t = (UBound(f) - LBound(f) + 1)
        
    If (n = 0) Then
        Bn = 0
    Else
        For i = LBound(f) To UBound(f)
            Bn = Bn + (f(i) * Sin(2 * pi * n * i / t))
        Next
        Bn = Bn * 2 / t
    End If
End Function

Conclusion :


fonctions assez lentes mais sans contraintes de dimensions

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
1263
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
24 juillet 2013
6
Par sécurité les EXE ne sont pas inclus dans les fichiers ZIP des sources
Messages postés
1064
Date d'inscription
lundi 19 mars 2007
Statut
Membre
Dernière intervention
23 avril 2018

Moué, par contre je vois toujours pas d'exe ?!
Messages postés
307
Date d'inscription
lundi 17 juillet 2006
Statut
Membre
Dernière intervention
27 mai 2012
3
pour être tout a fait honeste, je ne sais jamais donner un niveau à mes sources.
Peut être que c'est parsque je ne sais déja pas évoluer mon propre niveau ^^
Messages postés
1064
Date d'inscription
lundi 19 mars 2007
Statut
Membre
Dernière intervention
23 avril 2018

Merci, çà me fait assez rire, :)
Tu classe ta source en débutant, je la trouve déjà pas trop mal.
Messages postés
307
Date d'inscription
lundi 17 juillet 2006
Statut
Membre
Dernière intervention
27 mai 2012
3
voila, exe ajouté
Afficher les 6 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.