5 votes

Extraction de fréquences à partir d'une FFT multidimensionnelle

J'ai écrit un code python pour prendre un signal 2D et le FFT, et maintenant je veux extraire les fréquences associées à la FFT. Le site np.fft.fftfreq échoue, me donnant l'erreur

File "/usr/lib64/python2.7/site-packages/numpy/fft/helper.py", line 153, in fftfreq
    assert isinstance(n,types.IntType) or isinstance(n, integer)
AssertionError

Mon code est :

import numpy as np
import scipy as sp
import pylab
import sys
import math

filename = sys.argv[1]  # Get name of file to open 

ifp = open(filename, "r")
ifp.seek(0)

nrows = 0
ncols = 0

nrows = sum(1 for line in ifp) # Sum over all the lines in the file ptr

ifp.seek(0) # Set the fptr back to beginning of file
for line in ifp:
   ncols = len(line.split()) #Split and count number of words in a line
   if ncols > 0:
      break

OrigData = np.zeros([nrows, ncols], dtype=np.float32) #Allocate numpy array
FFTData = np.zeros([nrows, ncols], dtype=complex)
IFFTData = np.zeros([nrows, ncols], dtype=complex)
FreqComp = np.zeros([nrows, ncols], dtype=np.float32)

ii = 0
jj = 0
ifp.seek(0)
for line in ifp:
   linedata = line.split()
   jj = 0
   for el in linedata:
      OrigData[ii,jj] = float(el)
      jj+=1
   ii+=1
ifp.close()

FFTData = np.fft.fft2(OrigData)
FreqComp = np.fft.fftfreq(FFTData, d=2)

#--- Continue with more code ---#

Je sais que tout le reste fonctionne sauf le np.fft.fftfreq car je l'ai ajouté en dernier. Comment extrait-on des composantes fréquentielles bidimensionnelles ?

11voto

isedev Points 7410

Vous passez un paramètre invalide : np.fft.fftfreq prend la taille des données du signal comme premier paramètre (un entier) et le pas de temps comme second paramètre. Vous passez un tableau comme premier paramètre.

Vous devez effectuer une np.fft.fft sur le signal d'abord.

Je déteste pointer du doigt l'évidence, mais lisez np.fft.fftfreq ... l'exemple de code est très clair.


Après avoir effectué une FFT 2D, vous pouvez obtenir les fréquences d'échantillonnage le long de chaque dimension comme suit :

FreqCompRows = np.fft.fftfreq(FFTData.shape[0],d=2)
FreqCompCols = np.fft.fftfreq(FFTData.shape[1],d=2)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X