La transformation de Fourier est une technique indispensable pour mener des recherches scientifiques et techniques. ** Dans cet article, scipy module scipy.fftpack [ La méthode de transformation de Fourier discrète à grande vitesse utilisant 1] est résumée par un exemple simple. ** ** Pour la méthode de transformation de Fourier discrète ordinaire, veuillez vous référer à la littérature le cas échéant car il existe un texte élémentaire [2,3].
** Dans cet article, l'utilisation de la bibliothèque de conversion de Fourier à grande vitesse de scipy est mise en avant en tenant compte de la scène d'utilisation sur le lieu de travail [4]. Si vous vous entraînez en vérifiant le fonctionnement de l'exemple (1), vous pourrez bientôt l'utiliser sur le terrain. ** **
(1) Exemple de transformée de Fourier discrète unidimensionnelle (2) Exemple de transformée de Fourier 3D
Dans cet exemple, la transformée de Fourier $ g (\ omega) $ de la fonction gaussienne $ f (t) = e ^ {(- (t-5) ^ 2)} $ est obtenue. Seules les deux méthodes suivantes sont utilisées.
Soit le nombre total de données N égal à 40 et la largeur d'échantillonnage T comprise entre $ t = 0 $ et $ t = 10 $ ($ T = 10 $).
Par conséquent, l'échantillonnage temporel
Sera.
Parallèlement à cela, les points discrets de la fréquence $ \ omega $
Sera.
Le déroulement du programme est le suivant.
** La transformation de Fourier à grande vitesse de la fonction souhaitée est possible en changeant la forme fonctionnelle de $ f (t) $. ** **
FFT1D.py
"""
Transformée de Fourier discrète unidimensionnelle
"""
import numpy as np
from scipy.fftpack import fft, ifft
import matplotlib.pyplot as plt
#Création d'exemples de données de séries chronologiques
N = 40 #Le nombre de données
T=10 #Largeur d'échantillonnage
del_t= T/N #Intervalle d'échantillonnage
del_w=2*np.pi/T #Intervalle de fréquence de la transformée de Fourier discrète
#
#Génération de points discrets
t = np.arange(0,T-del_t,del_t)
w=np.arange(2*np.pi/T, 2*np.pi*N/T, del_w)
#
f = np.exp(-(t-5)**2) # #Fonction qui donne des exemples de données
#
g = fft(f)
g_real=np.real(g)
g_imag=np.imag(g)
#plot
plt.xlabel('w', fontsize=24)
plt.ylabel('g(w)', fontsize=24)
plt.plot(w,g_real,marker='o', markersize=4,label='Fourier transform: Real part')
plt.plot(w,g_imag,marker='o',markersize=4, label='Fourier transform: Imaginary part')
plt.legend(loc='best')
plt.show()
#Affichage du spectre de puissance
plt.plot(w,np.abs(g)**2,marker='o',markersize=4,label='|g(w)|^2')
plt.xlabel('w', fontsize=24)
plt.ylabel('Power spectrum |g(w)|^2', fontsize=24)
plt.legend(loc='best')
plt.show()
#Transformée de Fourier discrète inverse
ff = ifft(g)
plt.plot(t, np.real(ff), label='Fourier inverse transform: Real part')
plt.plot(t, np.imag(ff), label='Fourier inverse transform: Imaginary part')
plt.plot(t, f,'o',markersize=4,label='Raw data')
plt.xlabel('t', fontsize=24)
plt.ylabel('f(t)', fontsize=24)
plt.legend(loc='best')
plt.show()
Figure 1. Transformée de Fourier discrète $ g (\ omega_n) $
Figure 2.Spectre de puissance
Figure 3. Comparaison entre la transformée de Fourier complexe inverse (ligne) et les données échantillonnées (cercle vert). Puisque je pensais à une fonction réelle, la partie imaginaire de la transformée de Fourier complexe inverse est nulle.
Dans cet exemple, la fonction gaussienne tridimensionnelle $ f (t_x, t_y, t_z) = e ^ {- [(t_x-5) ^ 2 + (t_y-5) ^ 2 + (t_z-5) ^ 2)]} $ Effectue une transformée de Fourier discrète complexe à haute vitesse. Par rapport à l'exemple (1), qui était un problème unidimensionnel, il y a plus d'indices, etc., mais le contenu n'est pas significativement difficile.
Comme pour la méthode unidimensionnelle, seules les deux méthodes suivantes sont utilisées pour le multidimensionnel (deux ou plus).
** La dimension de la transformation de Fourier n'a pas besoin d'être très nerveuse du côté du programmeur car scipy la déterminera à partir de la taille du tableau lors de l'exécution de la transformation de Fourier **
Cet exemple est destiné uniquement au contrôle de fonctionnement et n'est pas visualisé. Mais si nécessaire, l'intrigue souhaitée pourrait facilement être réalisée.
Le déroulement du programme est le suivant.
"""
Transformée de Fourier discrète multidimensionnelle
12 août 2017
"""
import numpy as np
from scipy.fftpack import fftn, ifftn #Transformée de Fourier discrète à n dimensions / inverse de Fourier
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
#Création d'exemples de données de séries chronologiques
Nx = 4 #Nombre de données dans la direction Nx
Ny = 4 #Nombre de données dans la direction Ny
Nz = 4 #Nombre de données dans la direction Nz
Tx=10 #Largeur d'échantillonnage
Ty = 10
Tz = 10
del_t_x= Tx/Nx #Intervalle d'échantillonnage dans la direction tx
del_t_y= Ty/Ny #Intervalle d'échantillonnage dans le sens ty
del_t_z= Tz/Nz #Intervalle d'échantillonnage dans le sens ty
del_w_x=2*np.pi/Tx #Espacement des fréquences des composantes x de la transformée de Fourier discrète
del_w_y=2*np.pi/Ty #Espacement des fréquences des composantes y de la transformée de Fourier discrète
del_w_z=2*np.pi/Tz #Espacement de la fréquence de composante z de la transformée de Fourier discrète
#
t_x, t_y, t_z= np.meshgrid(np.arange(0,Tx-del_t_x,del_t_x),np.arange(0,Ty-del_t_y,del_t_y), np.arange(0,Tz-del_t_z,del_t_z)) #Génération de maillage
w_x, w_y, w_z= np.meshgrid(np.arange(2*np.pi/Tx, 2*np.pi*Nx/Tx, del_w_x),np.arange(2*np.pi/Ty, 2*np.pi*Ny/Ty, del_w_y), np.arange(2*np.pi/Tz, 2*np.pi*Nz/Tz, del_w_z)) #Génération de maillage
#
f = np.exp(-((t_x-5)**2+(t_y-5)**2+(t_z-5)**2)) #Fonction qui donne des exemples de données
#
g = fftn(f) #Transformée de Fourier rapide multidimensionnelle:3D dans ce cas
g_real=np.real(g) #Partie réelle
g_imag=np.imag(g) #Partie imaginaire
#Transformée de Fourier discrète multidimensionnelle inverse
ff = ifftn(g)
ff_real=np.real(ff)#Partie réelle
ff_imag=np.imag(ff) #Partie imaginaire
Sortons une petite valeur numérique.
print(g[1,2,1])
out: (-0.500000003576+0.862688207649j)
Cela signifie que la composante [1,2,1] de la transformée de Fourier g est -0,5 + 0,86i (nombre complexe).
Ensuite, vérifions la transformée de Fourier inverse.
print(ff[1,2,2])
out: (0.00193045413623+0j)
C'est un vrai nombre. Je peux calculer sans aucun problème.
Vous pouvez obtenir des informations dans de nombreux livres et sites Web sur les transformées de Fourier discrètes ordinaires «pas rapides». Les références 2 et 3 font également référence aux transformées de Fourier rapides. Il est très facile à lire grâce à un examen attentif du lecteur. 4 est un livre étranger, mais l'explication avec l'essence vaut la peine d'être lue.
Recommended Posts