Transformée de Fourier bidimensionnelle discrète c. Description de la boîte à outils de traitement d'image

Je crois que tout est aperçu général connaître l'existence d'un outil mathématique aussi merveilleux que la transformée de Fourier. Cependant, pour une raison quelconque, elle est si mal enseignée dans les universités que relativement peu de gens comprennent comment fonctionne cette transformation et comment elle doit être utilisée correctement. Pendant ce temps, les mathématiques de cette transformation sont étonnamment belles, simples et élégantes. J'invite tout le monde à en apprendre un peu plus sur la transformée de Fourier et sur le sujet connexe, à savoir comment signaux analogiques peuvent être efficacement convertis en fichiers numériques pour le traitement informatique.

Ne sert à rien formules complexes et Matlab, je vais essayer de répondre aux questions suivantes :

  • FT, DTF, DTFT - quelles sont les différences et comment des formules apparemment complètement différentes donnent-elles des résultats conceptuellement similaires ?
  • Comment interpréter correctement les résultats conversion rapide Fourier (FFT)
  • Que faire si vous recevez un signal de 179 échantillons et que la FFT nécessite une séquence d'entrée de longueur également deux
  • Pourquoi, lorsqu'on essaie d'obtenir le spectre d'une sinusoïde à l'aide de Fourier, au lieu du « bâton » unique attendu, un étrange gribouillis apparaît sur le graphique et que peut-on y faire ?
  • Pourquoi les filtres analogiques sont-ils placés avant l'ADC et après le DAC ?
  • Est-il possible de numériser un signal ADC avec une fréquence supérieure à la moitié de la fréquence d'échantillonnage (la réponse de l'école est incorrecte, la bonne réponse est possible)
  • Comment restaurer le signal original à l'aide d'une séquence numérique

Je partirai de l'hypothèse que le lecteur comprend ce qu'est une intégrale, un nombre complexe (ainsi que son module et son argument), une convolution de fonctions, plus au moins une idée « pratique » de ce qu'est la fonction delta de Dirac. est. Si vous ne le savez pas, pas de problème, lisez les liens ci-dessus. Sous « produit de fonctions » dans ce texte Je comprendrai la « multiplication ponctuelle » partout

Nous devrions probablement commencer par le fait que conversion normale Fourier est une sorte de chose qui, comme son nom l'indique, transforme certaines fonctions en d'autres, c'est-à-dire qu'elle associe chaque fonction d'une variable réelle x(t) à son spectre ou image de Fourier y(w) :

Si nous donnons des analogies, alors un exemple de transformation de sens similaire peut être, par exemple, la différenciation, transformant une fonction en sa dérivée. Autrement dit, la transformée de Fourier est essentiellement la même opération que la dérivée, et elle est souvent notée de la même manière, en dessinant un « capuchon » triangulaire sur la fonction. Contrairement à la différenciation, qui peut également être définie pour les nombres réels, la transformée de Fourier « fonctionne » toujours avec des nombres complexes plus généraux. Pour cette raison, des problèmes surviennent constamment lors de l'affichage des résultats de cette transformation, car les nombres complexes ne sont pas déterminés par une, mais par deux coordonnées sur le plan d'exploitation. nombres réels graphique. En règle générale, il est plus pratique de représenter les nombres complexes sous la forme d'un module et d'un argument et de les dessiner séparément sous forme de deux graphiques distincts :

Le graphique d'un argument de valeur complexe est souvent appelé dans dans ce cas"spectre de phase" et le graphique du module - "spectre d'amplitude". Le spectre d’amplitude est généralement beaucoup plus intéressant et c’est pourquoi la partie « phase » du spectre est souvent ignorée. Dans cet article, nous nous concentrerons également sur les éléments « d’amplitude », mais il ne faut pas oublier l’existence de la partie phase manquante du graphique. De plus, au lieu du module de valeurs complexes habituel, il est souvent dessiné logarithme décimal multiplié par 10. Le résultat est un graphique logarithmique avec des valeurs affichées en décibels (dB).

Attention, pas grand-chose nombres négatifs le graphique logarithmique (-20 dB ou moins) correspond pratiquement zéro nombre sur le graphique « normal ». Par conséquent, les « queues » longues et larges de divers spectres sur de tels graphiques, lorsqu'elles sont affichées dans des coordonnées « ordinaires », disparaissent généralement pratiquement. La commodité d'une représentation aussi étrange à première vue vient du fait que les images de Fourier diverses fonctions il faut souvent se multiplier entre eux. Avec une telle multiplication ponctuelle d'images de Fourier à valeurs complexes, leurs spectres de phase sont ajoutés et leurs spectres d'amplitude sont multipliés. Le premier est facile à réaliser, tandis que le second est relativement difficile. Cependant, les logarithmes de l'amplitude s'additionnent en multipliant les amplitudes, donc graphiques logarithmiques les amplitudes, comme les graphiques de phase, peuvent être simplement ajoutées point par point. De plus, dans problèmes pratiques Il est souvent plus pratique d'opérer non pas avec « l'amplitude » du signal, mais avec sa « puissance » (le carré de l'amplitude). Sur échelle logarithmique les deux graphiques (amplitude et puissance) semblent identiques et ne diffèrent que par le coefficient - toutes les valeurs sur le graphique de puissance sont exactement deux fois plus grandes que sur l'échelle d'amplitude. En conséquence, pour tracer la répartition de la puissance par fréquence (en décibels), vous ne pouvez rien mettre au carré, mais calculer le logarithme décimal et le multiplier par 20.

Vous vous ennuyez ? Attendez encore un peu, nous en aurons bientôt fini avec la partie ennuyeuse de l'article expliquant comment interpréter les graphiques :). Mais avant cela, vous devez comprendre une chose extrêmement chose importante: Bien que tous les tracés spectraux ci-dessus aient été tracés pour certaines plages de valeurs limitées (nombres positifs en particulier), tous ces tracés continuent en réalité vers plus et moins l'infini. Les graphiques représentent simplement une partie « la plus significative » du graphique, qui est généralement reflétée pour valeurs négatives paramètre et est souvent répété périodiquement avec un certain pas lorsqu’il est considéré à plus grande échelle.

Après avoir décidé ce qui est dessiné sur les graphiques, revenons à la transformée de Fourier elle-même et à ses propriétés. Il y en a plusieurs différentes manières comment déterminer cette transformation, différant dans de petits détails (différentes normalisations). Par exemple, dans nos universités, pour une raison quelconque, ils utilisent souvent la normalisation de la transformée de Fourier, qui définit le spectre en termes de fréquence angulaire (radians par seconde). J'utiliserai une formulation occidentale plus pratique qui définit le spectre en termes de fréquence ordinaire (hertz). Les transformées de Fourier directe et inverse dans ce cas sont déterminées par les formules de gauche, et certaines propriétés de cette transformation dont nous aurons besoin sont déterminées par une liste de sept points à droite :

La première de ces propriétés est la linéarité. Si nous prenons une combinaison linéaire de fonctions, alors la transformée de Fourier de cette combinaison sera la même combinaison linéaire des images de Fourier de ces fonctions. Cette propriété permet de réduire fonctions complexes et leurs transformations de Fourier en des transformées plus simples. Par exemple, la transformée de Fourier d'une fonction sinusoïdale de fréquence f et d'amplitude a est une combinaison de deux fonctions delta situées aux points f et -f et de coefficient a/2 :

Si nous prenons une fonction constituée de la somme d'un ensemble de sinusoïdes de fréquences différentes, alors, selon la propriété de linéarité, la transformée de Fourier de cette fonction sera constituée d'un ensemble correspondant de fonctions delta. Cela permet de donner une interprétation naïve mais visuelle du spectre selon le principe « si dans le spectre d'une fonction la fréquence f correspond à l'amplitude a, alors la fonction originale peut être représentée comme une somme de sinusoïdes dont l'une sera une sinusoïde de fréquence f et d’amplitude 2a. À proprement parler, cette interprétation est incorrecte, puisque la fonction delta et le point sur le graphique sont des choses complètement différentes, mais comme nous le verrons plus tard, pour les transformées de Fourier discrètes, ce ne sera pas si loin de la vérité.

La deuxième propriété de la transformée de Fourier est l'indépendance du spectre d'amplitude par rapport au décalage temporel du signal. Si nous déplaçons une fonction vers la gauche ou la droite le long de l’axe des x, alors seule sa spectre de phase.

La troisième propriété est que l'étirement (compression) de la fonction d'origine le long de l'axe du temps (x) compresse (étire) proportionnellement son image de Fourier le long de l'échelle de fréquence (w). En particulier, le spectre d'un signal de durée finie est toujours infiniment large et, à l'inverse, le spectre de largeur finie correspond toujours à un signal de durée illimitée.

Les quatrième et cinquième propriétés sont peut-être les plus utiles de toutes. Ils permettent de réduire la convolution des fonctions à une multiplication ponctuelle de leurs images de Fourier, et vice versa - la multiplication ponctuelle des fonctions à la convolution de leurs images de Fourier. Un peu plus loin, je montrerai à quel point c'est pratique.

La sixième propriété parle de la symétrie des images de Fourier. En particulier, de cette propriété, il s'ensuit que dans la transformée de Fourier d'une fonction à valeur réelle (c'est-à-dire tout signal « réel »), le spectre d'amplitude est toujours même fonction, et le spectre de phase (s'il est amené à la plage -pi...pi) est impair. C’est pour cette raison que les spectres ne sont presque jamais représentés sur des graphiques. partie négative spectre - pour les signaux à valeur réelle, il ne fournit aucun nouvelles informations(mais, je le répète, ce n'est pas nul non plus).

Enfin, la dernière, septième propriété, dit que la transformée de Fourier préserve « l'énergie » du signal. Cela n'a de sens que pour les signaux de durée finie, dont l'énergie est finie, et suggère que le spectre de ces signaux à l'infini se rapproche rapidement de zéro. C'est précisément à cause de cette propriété que les graphiques de spectre ne représentent généralement que la partie « principale » du signal, qui transporte la part du lion de l'énergie - le reste du graphique tend simplement vers zéro (mais, encore une fois, n'est pas nul).

Armés de ces 7 propriétés, regardons les mathématiques de la « numérisation » d'un signal à traduire signal continu en une séquence de nombres. Pour ce faire, nous devons prendre une fonction connue sous le nom de « peigne de Dirac » :

Un peigne de Dirac est simplement une séquence périodique de fonctions delta avec un coefficient unité, commençant à zéro et procédant à l'étape T. Pour numériser les signaux, T est choisi un nombre aussi petit que possible, T<<1. Фурье-образ этой функции - тоже гребенка Дирака, только с гораздо большим шагом 1/T и несколько меньшим коэффициентом (1/T). С математической точки зрения, дискретизация сигнала по времени - это просто поточечное умножение исходного сигнала на гребенку Дирака. Значение 1/T при этом называют частотой дискретизации:

Au lieu d'une fonction continue, après une telle multiplication, on obtient une séquence d'impulsions delta d'une certaine hauteur. De plus, selon la propriété 5 de la transformée de Fourier, le spectre du signal discret résultant est une convolution du spectre original avec le peigne de Dirac correspondant. Il est facile de comprendre que, sur la base des propriétés de convolution, le spectre du signal original est pour ainsi dire « copié » un nombre infini de fois le long de l'axe des fréquences avec un pas de 1/T, puis additionné.

Notez que si le spectre original avait une largeur finie et que nous utilisions une fréquence d'échantillonnage suffisamment élevée, alors les copies du spectre original ne se chevaucheraient pas et ne s'additionneraient donc pas. Il est facile de comprendre qu'à partir d'un spectre aussi « effondré », il sera facile de restaurer celui d'origine - il suffira simplement de prendre la composante spectrale dans la région de zéro, en « coupant » les copies supplémentaires allant à l'infini. La manière la plus simple de procéder est de multiplier le spectre par une fonction rectangulaire égale à T dans la plage -1/2T...1/2T et zéro en dehors de cette plage. Une telle transformée de Fourier correspond à la fonction sinc(Tx) et selon la propriété 4, une telle multiplication équivaut à la convolution de la séquence originale de fonctions delta avec la fonction sinc(Tx)



Autrement dit, en utilisant la transformée de Fourier, nous disposons d'un moyen de reconstruire facilement le signal original à partir d'un signal échantillonné dans le temps, à condition d'utiliser une fréquence d'échantillonnage au moins double (en raison de la présence de fréquences négatives dans le spectre). supérieure à la fréquence maximale présente dans le signal d'origine. Ce résultat est largement connu et est appelé « théorème de Kotelnikov/Shannon-Nyquist ». Cependant, comme il est facile de le constater maintenant (en comprenant la preuve), ce résultat, contrairement à une idée fausse largement répandue, détermine suffisant, mais pas nécessaire condition de restauration du signal original. Il suffit de s'assurer que la partie du spectre qui nous intéresse après échantillonnage du signal ne se chevauche pas, et si le signal est à bande suffisamment étroite (a une petite « largeur » de la partie non nulle du spectre), alors ce résultat peut souvent être obtenu à une fréquence d'échantillonnage bien inférieure au double de la fréquence maximale du signal. Cette technique est appelée « sous-échantillonnage » (sous-échantillonnage, échantillonnage passe-bande) et est assez largement utilisée dans le traitement de toutes sortes de signaux radio. Par exemple, si nous prenons une radio FM fonctionnant dans la bande de fréquences de 88 à 108 MHz, alors pour la numériser, nous pouvons utiliser un CAN avec une fréquence de seulement 43,5 MHz au lieu des 216 MHz supposés par le théorème de Kotelnikov. Dans ce cas, cependant, vous aurez besoin d’un ADC de haute qualité et d’un bon filtre.

Permettez-moi de noter que la « duplication » des hautes fréquences avec des fréquences d'ordres inférieurs (aliasing) est une propriété immédiate de l'échantillonnage du signal qui « gâche » de manière irréversible le résultat. Par conséquent, si le signal peut, en principe, contenir des fréquences d'ordre élevé (c'est-à-dire presque toujours), un filtre analogique est placé devant l'ADC, « coupant » tout ce qui est inutile directement dans le signal d'origine (puisqu'après l'avoir échantillonné il sera trop tard pour le faire). Les caractéristiques de ces filtres, en tant qu'appareils analogiques, ne sont pas idéales, de sorte que certains « dommages » au signal se produisent toujours, et en pratique, il s'ensuit que les fréquences les plus élevées du spectre sont, en règle générale, peu fiables. Pour réduire ce problème, le signal est souvent suréchantillonné, en réglant le filtre analogique d'entrée sur une bande passante inférieure et en utilisant uniquement la partie inférieure de la plage de fréquences théoriquement disponible du CAN.

Soit dit en passant, une autre idée fausse courante est que le signal à la sortie du DAC est tracé par « étapes ». Les « étapes » correspondent à la convolution d'une séquence de signal échantillonnée avec une fonction rectangulaire de largeur T et de hauteur 1 :

Le spectre du signal avec cette transformation est multiplié par la transformée de Fourier de cette fonction rectangulaire, et pour une fonction rectangulaire similaire, il est à nouveau sinc(w), « étiré » d'autant plus que la largeur du rectangle correspondant est petite. Le spectre du signal échantillonné avec un tel « DAC » est multiplié point par point par ce spectre. Dans ce cas, les hautes fréquences inutiles avec des « copies supplémentaires » du spectre ne sont pas complètement coupées, mais la partie supérieure de la partie « utile » du spectre, au contraire, est atténuée.

Dans la pratique, bien entendu, personne ne fait cela. Il existe de nombreuses approches différentes pour construire un DAC, mais même dans les DAC de type pondération les plus proches, les impulsions rectangulaires du DAC, au contraire, sont choisies pour être aussi courtes que possible (se rapprochant de la séquence réelle des fonctions delta) afin pour éviter une suppression excessive de la partie utile du spectre. Les fréquences « supplémentaires » dans le signal à large bande résultant sont presque toujours annulées en faisant passer le signal à travers un filtre passe-bas analogique, de sorte qu'il n'y ait pas d'« étapes numériques » ni « à l'intérieur » du convertisseur, ni, surtout, à sa sortie.

Cependant, revenons à la transformée de Fourier. La transformée de Fourier décrite ci-dessus appliquée à une séquence de signal pré-échantillonnée est appelée transformée de Fourier en temps discret (DTFT). Le spectre obtenu par une telle transformation est toujours 1/T-périodique, donc le spectre DTFT est entièrement déterminé par ses valeurs sur le segment , n=0,…,N-1 - le signal complexe original constitué de N nombres complexes. Notons X[k], k=0,…N-1 - son spectre complexe, également constitué de N nombres complexes. Alors juste formules suivantes Transformées de Fourier directes et inverses :

Si nous décomposons un signal réel en un spectre à l'aide de ces formules, alors les premiers coefficients complexes N/2+1 du spectre coïncideront avec le spectre de la DFT réelle « habituelle », présentée sous forme « complexe », et les coefficients restants sera leur réflexion symétrique par rapport à la moitié de la fréquence d'échantillonnage. Pour les coefficients cosinus, la réflexion est paire et pour les coefficients sinus, elle est impaire.

TFD 2D

Pour les images qui constituent un signal bidimensionnel, le spectre est également un signal bidimensionnel. Les fonctions de base de la transformée de Fourier ont la forme :

De plus, les phases peuvent également être différentes. Dans l'image, chacune de ces fonctions de base représente une onde d'une certaine fréquence, d'une certaine orientation et d'une certaine phase.

Ici, N 1 xN 2 est la taille du signal original, qui est également la taille du spectre. k 1 et k 2 sont les nombres des fonctions de base (les nombres des coefficients de la TFD bidimensionnelle dans laquelle ces fonctions se trouvent). Puisque la taille du spectre est égale à la taille du signal original, alors k 1 = 0,...,N 1 -1 ; k 2 = 0,…,N 2 -1.

n 1 et n 2 sont des arguments variables des fonctions de base. Puisque le domaine de définition des fonctions de base coïncide avec le domaine de définition du signal, alors n 1 = 0,...,N 1 -1 ; n 2 = 0,…,N 2 -1.

La DFT bidimensionnelle (sous forme complexe) est définie par les formules suivantes (ici x est le signal original et X est son spectre) :

Le calcul direct d'une DFT bidimensionnelle à l'aide des formules ci-dessus nécessite d'énormes coûts de calcul. Cependant, il peut être prouvé que la DFT bidimensionnelle possède la propriété de séparabilité, c'est-à-dire : il peut être calculé séquentiellement à partir de deux dimensions.

Pour calculer une DFT bidimensionnelle, il suffit de calculer les DFT complexes unidimensionnelles de toutes les lignes de l'image, puis de calculer les DFT complexes unidimensionnelles de toutes les colonnes de « l'image » résultante.

Dans ce cas, les résultats de toutes les DFT complexes unidimensionnelles doivent être écrits à la place des données originales de ces DFT. Par exemple, lors du calcul de la DFT unidimensionnelle de la première ligne d'une image, vous devez écrire le résultat DFT dans la première ligne de cette image (elle a la même taille). Pour ce faire, vous devez stocker chaque « pixel » sous forme de nombre complexe.

Ainsi, un algorithme efficace pour calculer la DFT d’une image consiste à calculer les FFT unidimensionnelles d’abord à partir de toutes les lignes puis de toutes les colonnes de l’image.

La technologie de communication moderne ne peut être imaginée sans analyse spectrale. Représentation des signaux dans domaine fréquentiel nécessaires à la fois pour l'analyse de leurs caractéristiques et pour l'analyse des blocs et unités d'émetteurs-récepteurs des systèmes de communication radio. Pour convertir les signaux dans le domaine fréquentiel, une transformée de Fourier directe est utilisée. La formule généralisée de la transformée de Fourier directe s'écrit comme suit :

Comme le montre cette formule d'analyse de fréquence, la dépendance de corrélation entre le signal présenté dans le domaine temporel et l'exponentielle complexe avec une fréquence donnée est calculée. Dans ce cas, selon la formule d’Euler, l’exponentielle complexe est décomposée en une partie réelle et une partie imaginaire :

(2)

Un signal représenté dans le domaine fréquentiel peut être reconverti dans un domaine temporel à l'aide d'une transformée de Fourier inverse. La formule généralisée de la transformée de Fourier inverse s'écrit comme suit :

(3)

La formule de transformée de Fourier directe utilise l'intégration temporelle de moins l'infini à l'infini. Naturellement, il s’agit d’une abstraction mathématique. Dans des conditions réelles, nous pouvons effectuer l'intégration à partir d'un instant donné, que nous pouvons noter 0, jusqu'à l'instant T. La formule de la transformée de Fourier directe sera transformée sous la forme suivante :

(4)

Par conséquent les propriétés de la transformée de Fourier changent considérablement. Spectre de signal au lieu d'une fonction continue devient une série discrète de valeurs. Maintenant, la fréquence minimale et en même temps le pas des valeurs de fréquence du spectre du signal devient :

, (5)

Seuls sin et cos fonctionnent avec des fréquences k/T seront mutuellement orthogonaux, et c'est une condition indispensable pour la transformée de Fourier. L'ensemble des premières fonctions du développement en série de Fourier est représenté sur la figure 1. Dans ce cas, la durée des fonctions coïncide avec la durée de l'analyse. T.


Figure 1. Fonctions d'expansion de la série de Fourier

Le spectre du signal ressemblera désormais à celui illustré à la figure 2.



Figure 2. Spectre de fonction x(t) lorsqu'il est analysé sur un intervalle de temps limité

Dans ce cas, la formule de calcul de la transformée de Fourier directe (4) se transforme sous la forme suivante :

(6)

La formule de la transformée de Fourier inverse dans le cas de la détermination du spectre sur une période de temps limitée ressemblera à ceci :

(7)

De la même manière, vous pouvez déterminer la formule de la transformée de Fourier directe pour les échantillons de signaux numériques. Considérant qu'au lieu d'un signal continu, ses échantillons numériques sont utilisés, dans l'expression (6) l'intégrale est remplacée par une somme. Dans ce cas, la durée du signal analysé est déterminée par le nombre d'échantillons numériques N. La transformée de Fourier pour les échantillons de signaux numériques est appelée transformée de Fourier discrète. et s'écrit ainsi :

(8)

Voyons maintenant comment les propriétés de la transformée de Fourier discrète (TFD) ont changé par rapport à la transformée de Fourier directe sur un intervalle de temps limité. Lorsque nous avons examiné l'échantillonnage du signal analogique, nous avons appris que le spectre du signal d'entrée doit être limité en fréquence. Cette exigence limite le nombre de composantes discrètes du spectre du signal. Au départ, il peut sembler que l'on puisse limiter le spectre du signal à la fréquence f d/2, qui correspond au nombre de composantes fréquentielles K=N/2. Cependant, ce n’est pas vrai. Bien que le spectre du signal pour les échantillons de signal réels pour les fréquences positives et les fréquences négatives soit symétrique par rapport à 0, des fréquences négatives peuvent être nécessaires pour certains algorithmes de spectre, tels que . La différence est encore plus grande lors de l'exécution d'une transformée de Fourier discrète sur des échantillons complexes du signal d'entrée. En conséquence, pour décrire complètement le spectre d’un signal numérique, il faut Néchantillons de fréquence ( k = 0, ...,N/2).

Le code du programme pour la transformée de Fourier directe et inverse est donné. La transformée de Fourier rapide est considérée.

Conversion discrète La transformée de Fourier (DFT) est un outil d'analyse puissant largement utilisé dans le domaine du traitement du signal numérique (DSP). Il y a des directs et conversion inverse Fourier. La transformée de Fourier discrète directe convertit un signal du domaine temporel en domaine fréquentiel et est utilisée pour analyser le spectre de fréquence du signal. La conversion inverse fait exactement le contraire : en utilisant le spectre de fréquence du signal, elle reconstruit le signal dans le domaine temporel.

Pour calculer la transformée de Fourier, une procédure de calcul accélérée est généralement utilisée - ce qu'on appelle. transformée de Fourier rapide (FFT). Cela vous permet de réduire considérablement le temps processeur pour des calculs mathématiques assez complexes et gourmands en ressources.

1 Complexe Nombres

Tout d’abord, nous avons besoin d’une classe d’assistance qui décrira les nombres complexes. Les nombres complexes sont un type particulier de nombres en mathématiques. Chaque nombre complexe se compose de deux parties : réelle et imaginaire. Il nous suffit maintenant de connaître les nombres complexes par rapport à la DFT pour que la partie réelle d'un nombre complexe stocke des informations sur l'amplitude du signal et que la partie imaginaire stocke des informations sur la phase.

Code de classe pour décrire les nombres complexes(se retourne) """ """ Numéro complexe. """ Numéro complexe de classe publique """ """ Partie réelle d'un nombre complexe. """ Public Réel Comme Double = 0 """ """ Partie imaginaire d'un nombre complexe. """ Public Imaginaire As Double = 0 Public Sub New() Real = 0 Imaginaire = 0 End Sub """ """ Crée un nombre complexe. """ """ Partie réelle d'un nombre complexe. """ Partie imaginaire d'un nombre complexe. Public Sub New(ByVal r As Double, Facultatif ByVal im As Double = 0) Real = r Imaginary = im End Sub Private usCult As New Globalization.CultureInfo("en-US") "nous utilisons la culture "en-US" donc que les parties entières et fractionnaires étaient séparées par un point et non par une virgule """ """ Renvoie une chaîne composée d'une partie réelle et d'une partie imaginaire, séparées par un caractère de tabulation. """ Public remplace la fonction ToString() en tant que retour de chaîne (Real.ToString(usCult) & ControlChars.Tab & Imaginary.ToString(usCult)) Classe de fin de fonction de fin

2 Direct discret rapide Transformée de Fourier

Un tableau de nombres complexes est transmis à l’entrée de la fonction. Dont la partie réelle représente un signal discret arbitraire, avec des lectures à intervalles réguliers. La partie imaginaire contient des zéros. Le nombre d'échantillons dans le signal doit être égal à une puissance de deux. Si votre signal est plus court, complétez-le avec des zéros jusqu'à un multiple de 2 : 256, 512, 1024, etc. Plus le signal est long, plus la résolution en fréquence du spectre calculé est élevée.

Code pour calculer la transformée de Fourier rapide directe dans VB.NET(se retourne) """ """ Calcule le spectre d'un signal à l'aide de la méthode de transformée de Fourier rapide. Utilisez uniquement les valeurs de retour (N/2+1) (jusqu'à la moitié de la fréquence d'échantillonnage). """ """ Signal contenant un nombre d’échantillons multiple d’une puissance de deux et constitué d’une partie réelle et d’une partie imaginaire. Toutes les parties imaginaires du signal sont remplies de zéros. """ Renvoie un tableau de nombres de spectre complexes. """ Seuls les premiers N/2+1 sont significatifs, le reste est la partie symétrique correspondant aux fréquences négatives. """ La première valeur du spectre est la composante constante, la dernière correspond à la moitié de la fréquence d'échantillonnage (Nyquist fréquence). """ Valeurs supérieures à la moitié de la fréquence d'échantillonnage - ne pas utiliser. """ Fonction publique partagée FFT(ByVal signal As ComplexNumber()) As ComplexNumber() Dim order As Integer = signal.Length "DFT order CheckFftOrder(order) "Vérifiez que l'ordre est une puissance de deux Dim spectreLen As Integer = order \ 2 Dim j Comme entier = spectreLen "Tri inverse des bits : Pour i Comme entier = 1 Pour commander - 2 Si (i< j) Then Dim tmpRe As Double = signal(j).Real Dim tmpIm As Double = signal(j).Imaginary signal(j).Real = signal(i).Real signal(j).Imaginary = signal(i).Imaginary signal(i).Real = tmpRe signal(i).Imaginary = tmpIm End If Dim k As Integer = spectrumLen Do Until (k >j) j -= k k \= 2 Boucle j += k Suivant "Boucle à travers les niveaux d'expansion : Pour le niveau As Integer = 1 To CInt(Math.Log(order) / Math.Log(2)) Dim lvl As Integer = CInt (2 ^ niveau) Dim lvl2 As Integer = lvl \ 2 Dim tmp As Double = Math.PI / lvl2 Dim sr As Double = Math.Cos(tmp) Dim si As Double = -Math.Sin(tmp) Dim tr As Double = 0 Dim ur As Double = 1 Dim ui As Double = 0 For jj As Integer = 1 To lvl2 "Parcourir les spectres au sein d'un niveau For i As Integer = (jj - 1) To (order - 1) Step lvl "Parcourir "papillons" individuels Dim ip As Integer = i + lvl2 tr = signal(ip).Real * ur - signal(ip).Imaginary * ui "Opération papillon" Dim ti As Double = signal(ip).Real * ui + signal (ip).Imaginaire * ur signal(ip).Real = signal(i).Real - tr signal(ip).Imaginaire = signal(i).Imaginaire - ti signal(i).Real = signal(i).Real + tr signal(i).Imaginaire = signal(i).Imaginaire + ti Suivant tr = ur ur = tr * sr - ui * si ui = tr * si + ui * sr Suivant Suivant "Remplissez le tableau de nombres complexes traités par la FFT : Diminuer le spectre (ordre - 1) Comme ComplexNumber Pour i Comme Entier = 0 Pour commander - 1 Avec signal (i) spectre (i) = Nouveau ComplexNumber (.Real, .Imaginaire) Terminer par la fonction de fin du spectre de retour suivant

3 Inverse discrète rapide Transformée de Fourier

La transformée de Fourier discrète inverse (IDFT), une des étapes de calcul, comprend une TFD directe sur un tableau de nombres complexes, où la partie imaginaire est l'inversion par rapport à l'axe X de la partie imaginaire du spectre.

Code pour calculer la transformée de Fourier rapide inverse dans VB.NET(se retourne) """ """ Restaure un signal à partir de son spectre en utilisant la méthode de transformée de Fourier rapide inverse. """ """ Spectre de signal contenant un nombre d’échantillons multiple d’une puissance de deux et constitué d’une partie réelle et d’une partie imaginaire. Fonction publique partagée InverseFFT(ByVal Spectrum As ComplexNumber()) As ComplexNumber() Dim order As Integer = Spectrum.Length "Ordre DFT inverse. CheckFftOrder(order) "Changement du signe arithmétique des éléments de la partie imaginaire : For i As Integer = 0 Au spectre. Longueur - 1 spectre(i).Imaginaire = -spectre(i).Imaginaire Suivant "Calcul de la FFT directe : Dim directFFT As ComplexNumber() = FFT(spectre) "Division par ordre dans le domaine temporel avec changement le signe arithmétique de la partie imaginaire : Dim signal (directFFT.Length - 1) As ComplexNumber For i As Integer = 0 To directFFT.Length - 1 Dim ReX As Double = directFFT(i).Real / order Dim ImX As Double = - directFFT(i).Signal imaginaire/ordre(i) = Nouveau ComplexNumber(ReX, ImX) Signal de retour suivant Fonction de fin

Et bien sûr, décrivons la méthode utilisée, qui vérifie le nombre d'éléments du tableau passé :

"""

""" Vérifie si l'ordre FFT est une puissance de deux et, dans le cas contraire, lève une exception. """ """ Ordre FFT. Sous-privé partagé CheckFftOrder (ordre ByVal As Integer) Dim chk As Double = Math.Abs ​​(Math.Floor (Math.Log (order, 2)) - Math.Log (order, 2)) If (chk > 0.0001) Then Throw New ArgumentException(String.Format("La longueur du tableau ((0)) n'est pas une puissance de deux.", order)) End If End Sub

4 Vérification avant et arrière Transformée de Fourier

Vérifions maintenant que nos fonctions fonctionnent. Pour ce faire, faisons passer un signal arbitraire via le mécanisme de transformée de Fourier directe, puis « assemblons-le » à l'aide de la transformée de Fourier inverse. Le signal reconstruit doit être presque identique à celui d'origine. Des erreurs d'arrondi se produisent lorsque vous travaillez avec des nombres sur un ordinateur, de sorte que les signaux ne seront pas complètement identiques, mais leur écart les uns par rapport aux autres devrait être négligeable.

Par exemple, prenons la fonction sinus comme signal source et générons des données d'une longueur de 128 échantillons comme ceci :

Dim cn(127) As ComplexNumber For i As Integer = 0 To cn.Length - 1 cn(i) = New ComplexNumber(Math.Sin(i * 3 * Math.PI / 180)) Suivant

Nous obtenons ce signal :

Ici, l'axe X est le nombre d'échantillons dans le domaine temporel et l'axe Y est l'amplitude. Veuillez noter que le signal n'est constitué que de parties réelles et que la partie imaginaire sur tout le segment est égale à « 0 ».

Passons maintenant ce signal à l'entrée de la fonction FFT(). En utilisant les tableaux de nombres complexes obtenus lors de la transformée de Fourier directe, nous construirons deux graphiques - les parties réelle (Re) et imaginaire (Im) du spectre :


Ici, l'axe X représente les échantillons dans le domaine fréquentiel et l'axe Y représente l'amplitude. Pour obtenir les valeurs réelles de fréquence, il faut les calculer en tenant compte du fait que le "0" de l'axe Y correspond à la fréquence nulle, le maximum de l'axe Y correspond à la fréquence d'échantillonnage.

Nous transférerons le spectre du signal résultant vers la fonction de transformée de Fourier inverse IFFT(). Obtenons un tableau de nombres complexes, où la partie réelle contiendra le signal reconstruit :


Comme vous pouvez le constater, le signal reconstruit répète complètement celui d'origine.

transformées de Fourier

Il est pratique d’analyser de nombreux signaux en les décomposant en sinusoïdes (harmoniques). Il y a plusieurs raisons à cela. Par exemple, l’oreille humaine fonctionne de la même manière. Il décompose le son en vibrations individuelles de différentes fréquences. De plus, on peut montrer que les sinusoïdes sont " propres fonctions» les systèmes linéaires (puisqu'ils traversent systèmes linéaires, sans changer la forme, mais peut seulement changer la phase et l'amplitude). Une autre raison est que le théorème de Kotelnikov est formulé en termes de spectre de signal.

Transformée de Fourier ) est la décomposition des fonctions en sinusoïdes (ci-après nous appellerons également les fonctions cosinus sinusoïdes, car elles ne diffèrent des sinusoïdes « réelles » que par la phase). Il existe plusieurs types de transformée de Fourier.

1. Un signal continu non périodique peut être développé en une intégrale de Fourier.

2. Un signal continu périodique peut être étendu en une série de Fourier infinie.

3. Un signal discret non périodique peut être développé en une intégrale de Fourier.

4. Un signal discret périodique peut être développé en une série de Fourier finie.

Un ordinateur ne peut fonctionner qu’avec une quantité limitée de données. Il ne peut donc réellement calculer que le dernier type de transformée de Fourier. Regardons-le de plus près.

Signal réel DFT

Soit un signal discret x avoir une période de N points. Dans ce cas, il peut être représenté comme une série finie (c'est-à-dire une combinaison linéaire) de sinusoïdes discrètes :

2πk (n + ϕk)

x = ∑ C k cos

(série de Fourier)

k = 0

Notation équivalente (on décompose chaque cosinus en sinus et cosinus, mais maintenant sans phase) :

2 πkn

2 πkn

x = ∑A k cos

+ ∑ B k péché

(série de Fourier)

k = 0

k = 0

Riz. 6. Fonctions de base de la série de Fourier pour un signal discret à 8 points. À gauche se trouvent les cosinus, à droite les sinus. Les fréquences augmentent de haut en bas.

Les sinusoïdes basiques ont plusieurs fréquences. Le premier terme de la série (k =0) est une constante appelée composante constante(décalage CC). La toute première sinusoïde (k = 1) a une fréquence telle que sa période coïncide avec la période du signal d'origine lui-même. La composante de fréquence la plus élevée (k = N /2) a une fréquence telle que sa période est égale à deux comptes. CoefficientsA k et

B k est appelé spectre du signal (spectre). Ils montrent les amplitudes des si-

nusoïdes qui composent le signal. Le pas de fréquence entre deux sinusoïdes adjacentes du développement de Fourier est appelé résolution de fréquence spectre

Sur la fig. La figure 6 montre les sinusoïdes utilisées pour décomposer un signal discret à partir de 8 points. Chacune des sinusoïdes est constituée de 8 points, c'est-à-dire qu'il s'agit d'un signal discret régulier. Les sinusoïdes continues sont représentées sur la figure pour plus de clarté.

convertir le signal original en calculant la somme de la série de Fourier en chaque point. Décomposer un signal en sinusoïdes (c'est-à-dire obtenir des coefficients) s'appelle transformée de Fourier directe. Le processus inverse - synthèse du signal à l'aide de sinusoïdes - est appelé transformée de Fourier inverse(transformée de Fourier inverse).

L'algorithme de transformée de Fourier inverse est évident (il est contenu dans la formule de la série de Fourier ; pour réaliser la synthèse, il suffit d'y substituer les coefficients). Considérons l'algorithme de transformée de Fourier directe, c'est-à-dire trouver les coefficients A k et B k .

2 πkn

2 πkn

de l'argument n est l'or-

Système de fonction

K = 0,...,

base togonale dans l'espace des périodiques signaux discrets avec la période N. Cela signifie que pour y étendre n'importe quel élément d'espace (signal), vous devez calculer produits scalaires cet élément avec toutes les fonctions du système, et les coefficients résultants sont normalisés. Ensuite, la formule d'expansion de base avec les coefficients A k et B k sera valable pour le signal d'origine.

Ainsi, les coefficients A k et B k sont calculés sous forme de produits scalaires (en non-

dans le cas discontinu – intégrales du produit de fonctions, dans le cas discret

– sommes du produit de signaux discrets) :

N−1

2 π ki , pour k = 1,...,

Unk=

∑xcos

−1

N je = 0

N−1

Unk=

∑ x cos2 π ki , pour k = 0,

N je = 0

N−1

2πki

NB 0 et B N 2 sont toujours égaux à zéro (puisque le « de base » correspondant

les signaux sont identiques à zéro en des points discrets), et ils peuvent être ignorés lors du calcul de l'inverse et transformations directes Fourier.

Ainsi, nous avons constaté que la représentation spectrale du signal est tout à fait équivalente au signal lui-même. Vous pouvez vous déplacer entre eux à l’aide des transformations de Fourier avant et inverse. L'algorithme de calcul de ces transformations est contenu dans les formules données.

Le calcul des transformées de Fourier nécessite très grand nombre multiplications (environ N 2) et calculs de sinus. Il existe un moyen d'effectuer ces conversions beaucoup plus rapidement : en environ N log2 N multiplications.

Cette méthode est appelée transformée de Fourier rapide (FFT, transformée de Fourier rapide ). Il est basé sur le fait que parmi les facteurs (sinus), il existe de nombreuses valeurs répétitives (en raison de la périodicité du sinus). L'algorithme FFT regroupe les termes avec les mêmes facteurs, réduisant considérablement le nombre de multiplications. En conséquence, les performances de la FFT peuvent être des centaines de fois plus rapides que celles de l'algorithme standard (en fonction de N ). Il convient de souligner que l'algorithme FFT est précis. Il est encore plus précis que le standard, car en réduisant le nombre d'opérations, il en résulte moins d'erreurs d'arrondi.

Cependant, la plupart des algorithmes FFT ont une particularité : ils ne peuvent fonctionner que lorsque la longueur du signal analysé N est une puissance de deux. Habituellement, cela ne représente pas gros problème, puisque le signal analysé peut toujours être complété par des zéros jusqu'à la taille requise. Nombre

N est appelé la taille ou la longueur de la FFT.

DFT complexe

Jusqu’à présent, nous avons considéré les DFT à partir de signaux réels. Généralisons maintenant la DFT au cas de signaux complexes. Soit x, n =0,…,N -1 – le signal complexe original constitué de N nombres complexes. Notons X, k =0,…N -1 – son spectre complexe, également constitué de N nombres complexes. Alors les formules suivantes pour les transformations directes et inverses sont valables :

vaniy Fourier (ici j = − 1) :

N−1

X [ k] = ∑ x[ n] e− jnk (2 π N )

n= 0

N−1

∑ X [ k ] e jnk(2 π N)

Nk = 0

Si nous décomposons un signal réel en un spectre à l'aide de ces formules, alors les premiers coefficients complexes N / 2+1 du spectre coïncideront avec le spectre de la DFT réelle « habituelle », présentée sous forme « complexe », et les coefficients restants sera leur reflet symétrique par rapport à



Avez-vous aimé l'article? Partagez avec vos amis !