Accueil > > > TRANSFORMEE DE FOURIER DANS LES APPLICATIONS AUDIO-NUMERIQUES
TRANSFORMEE DE FOURIER DANS LES APPLICATIONS AUDIO-NUMERIQUES
Information sur la source
Description
Le module Fourier comprend les fonctions utiles dans les applications destinees à manipuler le son numerique. Les commentaires fournissent les definitions de base et expliquent le principe. La transformee de Fourier sert a analyser le spectre de fréquences d'un echantillon sonore. La transformee inverse permet de calculer le son apres filtrage des magnitudes.
Source
- Module ModuleFourier
-
- ' Utilitaires pour calculs audio-numériques
-
- ' FFT (Fast Fourier Transform) : TRANSFORMEE RAPIDE DE FOURIER
-
- ' PCM (Pulse Code Modulation) : modulation par impulsions
- ' Sampling-Rate : Cadencement (Fréquence des impulsions)
-
- ' La transformée de Fourier permet de calculer le spectre de fréquences
- ' correspondant à l'échantillon PCM de longueur 2^P2 .
- ' Exemple pour un bloc de 8192 impulsions (2^13),dans un échantillon cadencé à 44100 hz
- ' on aura une fréquence de base de 44100 / 8192 = 5.38330078125 Hz
- ' C'est à dire des magnitudes et angles correspondants aux fréquences :
- ' 10.76 , 16.14 , 21.53 , 26.91 , 32.29 , 37.68 , 43.06 , 48.44 , 53.83 ...
- ' ... 430.66 , 436.04 , 441.43 , 446.81 ... jusqu'à 22050 Hz (fréquence de Nyquist)
- ' REMARQUE : On ne connaitra jamais la magnitude exacte du " La 440 " par exemple (diapason)
- ' Pour celà , il faudrait un échantillon cadencé à : (440 / 82) * 8192 = 43957 Hz
-
- Public Structure NombreComplex
- Public Réel As Double
- Public Imaginaire As Double
- End Structure
-
- Public Function Fourier(ByVal Suite() As NombreComplex) As NombreComplex()
-
- 'Calcule la transformée d'une suite de nombres complexes
-
- Dim Nbr As Integer ' Nombre de complexes dans la suite
- Dim P2 As Byte ' Puissance de 2 du nombre entier Nbr
- Dim ISuit, ITrans As Integer ' Compteurs de boucles
- Dim Fin, Taille As Integer ' Butées
- Dim dAngl, dAr As Double
- Dim Alpha, Beta As Double
- Dim k, I, J, L As Integer
- Dim AR, TR, Ti, AI As Double
-
- ' Nbr est la taille de la suite à transformer
- Nbr = UBound(Suite) + 1 ' Obligatoirement: une puissance de 2
- P2 = Puissance(Nbr)
-
- Dim Transformée(Nbr - 1) As NombreComplex
-
- For ISuit = 0 To Nbr - 1
- ITrans = Ivrs(ISuit, P2)
- Transformée(ITrans).Réel = Suite(ISuit).Réel
- Transformée(ITrans).Imaginaire = Suite(ISuit).Imaginaire
- Next ISuit
-
- Fin = 1
- Taille = 2
- Do While (Taille <= Nbr)
- dAngl = 2 * Math.PI / Taille
- Alpha = 2 * ((System.Math.Sin(0.5 * dAngl)) ^ 2)
- Beta = System.Math.Sin(dAngl)
-
- I = 0
- Do While (I < Nbr)
- AR = 1 ' Cosinus(0)
- AI = 0 ' Sinus(0)
-
- J = I
- For L = 1 To Fin
- k = J + Fin
- TR = AR * Transformée(k).Réel - AI * Transformée(k).Imaginaire
- Ti = AI * Transformée(k).Réel + AR * Transformée(k).Imaginaire
- Transformée(k).Réel = Transformée(J).Réel - TR
- Transformée(k).Imaginaire = Transformée(J).Imaginaire - Ti
- Transformée(J).Réel = Transformée(J).Réel + TR
- Transformée(J).Imaginaire = Transformée(J).Imaginaire + Ti
- dAr = Alpha * AR + Beta * AI
- AI = AI - (Alpha * AI - Beta * AR)
- AR = AR - dAr
- J = J + 1
- Next L
- I = I + Taille
- Loop
- Fin = Taille
- Taille = Taille * 2
- Loop
- Return Transformée
- End Function
-
- Public Function Inverse(ByVal Transformée() As NombreComplex) As NombreComplex()
-
- 'Calcule la transformée inverse d'une suite de nombres complexes
-
- Dim Nbr As Integer ' Nombre de complexes dans la suite
- Dim P2 As Byte ' Puissance de 2 du nombre entier Nbr
- Dim ISuit, ITrans As Integer ' Compteurs de boucles
- Dim Fin, Taille As Integer ' Butées
- Dim dAngl, dAr As Double
- Dim Alpha, Beta As Double
- Dim k, I, J, L As Integer
- Dim AR, TR, Ti, AI As Double
-
- ' Nbr est la taille de la Transformée à transformer
- Nbr = UBound(Transformée) + 1 ' Obligatoirement: une puissance de 2
- P2 = Puissance(Nbr)
-
- Dim Suite(Nbr - 1) As NombreComplex
-
- For ISuit = 0 To Nbr - 1
- ITrans = Ivrs(ISuit, P2)
- Suite(ITrans).Réel = Transformée(ISuit).Réel
- Suite(ITrans).Imaginaire = Transformée(ISuit).Imaginaire
- Next ISuit
-
- Fin = 1
- Taille = 2
- Do While (Taille <= Nbr)
- dAngl = -2 * Math.PI / Taille
- Alpha = 2 * ((System.Math.Sin(0.5 * dAngl)) ^ 2)
- Beta = System.Math.Sin(dAngl)
-
- I = 0
- Do While (I < Nbr)
- AR = 1 ' Cosinus(0)
- AI = 0 ' Sinus(0)
-
- J = I
- For L = 1 To Fin
- k = J + Fin
- TR = AR * Suite(k).Réel - AI * Suite(k).Imaginaire
- Ti = AI * Suite(k).Réel + AR * Suite(k).Imaginaire
- Suite(k).Réel = Suite(J).Réel - TR
- Suite(k).Imaginaire = Suite(J).Imaginaire - Ti
- Suite(J).Réel = Suite(J).Réel + TR
- Suite(J).Imaginaire = Suite(J).Imaginaire + Ti
- dAr = Alpha * AR + Beta * AI
- AI = AI - (Alpha * AI - Beta * AR)
- AR = AR - dAr
- J = J + 1
- Next L
- I = I + Taille
- Loop
- Fin = Taille
- Taille = Taille * 2
- Loop
- For I = 0 To UBound(Suite)
- Suite(I).Réel = 2 * Suite(I).Réel \ Nbr
- Suite(I).Imaginaire = 2 * Suite(I).Imaginaire \ Nbr
- Next I
- Return Suite
- End Function
-
- Public Function Magnitude(ByVal Transformée() As NombreComplex) As Double()
- Dim Id As Integer
- Id = UBound(Transformée) \ 2
- Dim M(Id) As Double
- For Id = 0 To UBound(M)
- M(Id) = Math.Sqrt(Math.Pow(Transformée(Id).Réel, 2) + Math.Pow(Transformée(Id).Imaginaire, 2))
- Next
- Return M
- End Function
-
- Public Function Ivrs(ByVal IdPuls As Integer, ByVal P2 As Byte) As Integer
- Dim I As Short
- Ivrs = 0
-
- For I = 1 To P2
- Ivrs = (Ivrs * 2) Or (IdPuls And 1)
- IdPuls = IdPuls \ 2
- Next I
-
- End Function
-
- Public Function Puissance(ByVal Entier As Integer) As Byte
- Return Int(Math.Log(Entier) / Math.Log(2))
- End Function
-
- End Module
Module ModuleFourier
' Utilitaires pour calculs audio-numériques
' FFT (Fast Fourier Transform) : TRANSFORMEE RAPIDE DE FOURIER
' PCM (Pulse Code Modulation) : modulation par impulsions
' Sampling-Rate : Cadencement (Fréquence des impulsions)
' La transformée de Fourier permet de calculer le spectre de fréquences
' correspondant à l'échantillon PCM de longueur 2^P2 .
' Exemple pour un bloc de 8192 impulsions (2^13),dans un échantillon cadencé à 44100 hz
' on aura une fréquence de base de 44100 / 8192 = 5.38330078125 Hz
' C'est à dire des magnitudes et angles correspondants aux fréquences :
' 10.76 , 16.14 , 21.53 , 26.91 , 32.29 , 37.68 , 43.06 , 48.44 , 53.83 ...
' ... 430.66 , 436.04 , 441.43 , 446.81 ... jusqu'à 22050 Hz (fréquence de Nyquist)
' REMARQUE : On ne connaitra jamais la magnitude exacte du " La 440 " par exemple (diapason)
' Pour celà , il faudrait un échantillon cadencé à : (440 / 82) * 8192 = 43957 Hz
Public Structure NombreComplex
Public Réel As Double
Public Imaginaire As Double
End Structure
Public Function Fourier(ByVal Suite() As NombreComplex) As NombreComplex()
'Calcule la transformée d'une suite de nombres complexes
Dim Nbr As Integer ' Nombre de complexes dans la suite
Dim P2 As Byte ' Puissance de 2 du nombre entier Nbr
Dim ISuit, ITrans As Integer ' Compteurs de boucles
Dim Fin, Taille As Integer ' Butées
Dim dAngl, dAr As Double
Dim Alpha, Beta As Double
Dim k, I, J, L As Integer
Dim AR, TR, Ti, AI As Double
' Nbr est la taille de la suite à transformer
Nbr = UBound(Suite) + 1 ' Obligatoirement: une puissance de 2
P2 = Puissance(Nbr)
Dim Transformée(Nbr - 1) As NombreComplex
For ISuit = 0 To Nbr - 1
ITrans = Ivrs(ISuit, P2)
Transformée(ITrans).Réel = Suite(ISuit).Réel
Transformée(ITrans).Imaginaire = Suite(ISuit).Imaginaire
Next ISuit
Fin = 1
Taille = 2
Do While (Taille <= Nbr)
dAngl = 2 * Math.PI / Taille
Alpha = 2 * ((System.Math.Sin(0.5 * dAngl)) ^ 2)
Beta = System.Math.Sin(dAngl)
I = 0
Do While (I < Nbr)
AR = 1 ' Cosinus(0)
AI = 0 ' Sinus(0)
J = I
For L = 1 To Fin
k = J + Fin
TR = AR * Transformée(k).Réel - AI * Transformée(k).Imaginaire
Ti = AI * Transformée(k).Réel + AR * Transformée(k).Imaginaire
Transformée(k).Réel = Transformée(J).Réel - TR
Transformée(k).Imaginaire = Transformée(J).Imaginaire - Ti
Transformée(J).Réel = Transformée(J).Réel + TR
Transformée(J).Imaginaire = Transformée(J).Imaginaire + Ti
dAr = Alpha * AR + Beta * AI
AI = AI - (Alpha * AI - Beta * AR)
AR = AR - dAr
J = J + 1
Next L
I = I + Taille
Loop
Fin = Taille
Taille = Taille * 2
Loop
Return Transformée
End Function
Public Function Inverse(ByVal Transformée() As NombreComplex) As NombreComplex()
'Calcule la transformée inverse d'une suite de nombres complexes
Dim Nbr As Integer ' Nombre de complexes dans la suite
Dim P2 As Byte ' Puissance de 2 du nombre entier Nbr
Dim ISuit, ITrans As Integer ' Compteurs de boucles
Dim Fin, Taille As Integer ' Butées
Dim dAngl, dAr As Double
Dim Alpha, Beta As Double
Dim k, I, J, L As Integer
Dim AR, TR, Ti, AI As Double
' Nbr est la taille de la Transformée à transformer
Nbr = UBound(Transformée) + 1 ' Obligatoirement: une puissance de 2
P2 = Puissance(Nbr)
Dim Suite(Nbr - 1) As NombreComplex
For ISuit = 0 To Nbr - 1
ITrans = Ivrs(ISuit, P2)
Suite(ITrans).Réel = Transformée(ISuit).Réel
Suite(ITrans).Imaginaire = Transformée(ISuit).Imaginaire
Next ISuit
Fin = 1
Taille = 2
Do While (Taille <= Nbr)
dAngl = -2 * Math.PI / Taille
Alpha = 2 * ((System.Math.Sin(0.5 * dAngl)) ^ 2)
Beta = System.Math.Sin(dAngl)
I = 0
Do While (I < Nbr)
AR = 1 ' Cosinus(0)
AI = 0 ' Sinus(0)
J = I
For L = 1 To Fin
k = J + Fin
TR = AR * Suite(k).Réel - AI * Suite(k).Imaginaire
Ti = AI * Suite(k).Réel + AR * Suite(k).Imaginaire
Suite(k).Réel = Suite(J).Réel - TR
Suite(k).Imaginaire = Suite(J).Imaginaire - Ti
Suite(J).Réel = Suite(J).Réel + TR
Suite(J).Imaginaire = Suite(J).Imaginaire + Ti
dAr = Alpha * AR + Beta * AI
AI = AI - (Alpha * AI - Beta * AR)
AR = AR - dAr
J = J + 1
Next L
I = I + Taille
Loop
Fin = Taille
Taille = Taille * 2
Loop
For I = 0 To UBound(Suite)
Suite(I).Réel = 2 * Suite(I).Réel \ Nbr
Suite(I).Imaginaire = 2 * Suite(I).Imaginaire \ Nbr
Next I
Return Suite
End Function
Public Function Magnitude(ByVal Transformée() As NombreComplex) As Double()
Dim Id As Integer
Id = UBound(Transformée) \ 2
Dim M(Id) As Double
For Id = 0 To UBound(M)
M(Id) = Math.Sqrt(Math.Pow(Transformée(Id).Réel, 2) + Math.Pow(Transformée(Id).Imaginaire, 2))
Next
Return M
End Function
Public Function Ivrs(ByVal IdPuls As Integer, ByVal P2 As Byte) As Integer
Dim I As Short
Ivrs = 0
For I = 1 To P2
Ivrs = (Ivrs * 2) Or (IdPuls And 1)
IdPuls = IdPuls \ 2
Next I
End Function
Public Function Puissance(ByVal Entier As Integer) As Byte
Return Int(Math.Log(Entier) / Math.Log(2))
End Function
End Module
Conclusion
Remerciements: Don Cross et Jean Debord
Historique
- 02 mars 2006 20:39:22 :
- Modification du libellé et dans la formulation de la présentation. Remplacement de Pi = 3.14159265358979 par Math.PI (suggéré par Patrice99 dans les commentaires)
- 28 décembre 2008 00:42:30 :
- La valeur de magnitude était injustement divisée par deux
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Fmod et les fréquences dans le spectre. Comment savoir quelle fréquence correspond à quelle donnée ? [ par azerty25 ]
Hello allVous connaissez peut etre la librairie sonnore Fmod, qui permet de lire des fichiers son mais aussi de pouvoir créer un spectre à partir des
Plusieurs courbes sur le même graph MSChart [ par merif ]
Bonjour à tous !Je dispose d'un graph MSChart de type 2dXY sur lequel je souhaite tracer des spectres que j'acquiers les un après les autres. A chaque
Analyse de la fréquence d'une source audio [ par Yanou60 ]
Bonjour,je souhaiterai pouvoir analyser un son wav ou mp3, en donnant un fréquence d'échantillonage et récupérer les fréquences.Quelqu'un peut il m'ai
Comment faire un spectre [ par unrealgun ]
Bonjour,Comment je peux faire un spectre pour mon player ?merci d'avance.The DAMIRATOR
FFT [ par cubinou ]
salut je suis a la recherche d'une code soource me permettant de passer d'une FFT 1D a une FFT 2D. J'ai deja une fonction qui me permet de faire la F
FFT 1D a 2D en JAVA [ par cubinou ]
Salut a tous Je suis a la recherche du petit bout de code me manquant pour passer d'une FFT 1D A une FFT 2D. C'est pourdu traitement d'image. Et j'ai
Comment générer le spectre d'un son ? [ par sydailly ]
Salut tout le monde, Je cherche à générer le
Recherche Transformé de Fourrier en VB 6.0 [ par avillenave ]
Bonjour à tous,J'ai besoin d'une fonction : La fft -> la transformée de FourrierJe ne m'interresse qu'à la partie réelle du r&#
Frequence de rafraichissement dans un .exe [ par darksoul551 ]
Bonjour a tous, j'ai une petite question a poser, j'ai cherché sur les sources et sur google mais j'ai pas trouvé; je la
Analyse fréquence audio sur carte son [ par f8bpz ]
Salut,Je souhaite creer une application qui analyserai la frequence des sons présents sur l'entree de la carte son (mic. ou aux.). Après de
|
Derniers Blogs
XNA IS DEAD!XNA IS DEAD! par richardc
Depuis la semaine dernière (et grâce aux TechDays 2012), je me penche activement sur la nouvelle version de Windows, aka Windows 8. Vous me direz, il était temps puisque la première preview date de Septembre dernier.
OK. Remarquez, on n'en est qu'aux...
Cliquez pour lire la suite de l'article par richardc TECHDAYS PARIS 2012 : WINDOWS SERVER "8" QUOI DE 9 !TECHDAYS PARIS 2012 : WINDOWS SERVER "8" QUOI DE 9 ! par ROMELARD Fabrice
Speakers: Fabrice Meillon et Stanislas Quastana Cette session est basée entièrement sur celle donnée lors de la BUILD cet hiver. Il n'y a pas d'ajout d'information en rapport avec cet évènement passé. Windows 8 Server sera intégralem...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice [HTML5] AUTOUR DU W3C : NOUVEAUX STANDARDS ET WEB MOBILE (LILLE)[HTML5] AUTOUR DU W3C : NOUVEAUX STANDARDS ET WEB MOBILE (LILLE) par Gio
Je m'y prends un peu tard je sais, mais bon je suis développeur web et donc hyper fainéant ! Toujours dans le cadre des technologies émergentes, ici HTML5, parce qu'on aime HTML5 chez Wyg , nous seront présent, le vieux ( Aurélien V.) et moi, pour pr...
Cliquez pour lire la suite de l'article par Gio [WP7] DYNAMICALLY CHANGE STARTUP PAGE[WP7] DYNAMICALLY CHANGE STARTUP PAGE par KooKiz
Let's say that you want to allow the user to customize the startup page of your application. You can easily change the startup page by editing the 'NavigationPage' attribute in the manifest file. But the manifest cannot be modified once the applicatio...
Cliquez pour lire la suite de l'article par KooKiz
Logiciels
DocTranslate (V3.1.0.0)DOCTRANSLATE (V3.1.0.0)DocTranslate est un traducteur de document Microsoft Word, PowerPoint et Excel. Il permet d'autom... Cliquez pour télécharger DocTranslate Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler OneSwarm (2012)ONESWARM (2012)Le peer-to-peer qui protège votre vie privée, c'est OneSwarm.
Ce logiciel de peer-to-peer crypté... Cliquez pour télécharger OneSwarm PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System
|