2011-12-30 21 views
12

Estoy tratando de volver a implementar una de las cajas de herramientas de matlab. usan fft allí. cuando realizo la misma operación en los mismos datos, obtengo resultados diferentes a los de matlab. sólo echar un vistazo:FFT en Matlab y numpy/scipy dan resultados diferentes

MATLAB:

Msig = 

0  0  0  0 
0  0  0  0 
0  0  0  0 
0  0  0  0 
0  1  0  0 
0  0  0  0 

fft(Msig.') 

Columns 1 through 4 

    0     0     0     0   
    0     0     0     0   
    0     0     0     0   
    0     0     0     0   

Columns 5 through 6 

1.0000     0   
     0 - 1.0000i  0   
-1.0000     0   
     0 + 1.0000i  0  

PYTHON:

Msig= 
array([[ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 1., 0., 0.], 
     [ 0., 0., 0., 0.]]) 

np.fft.fft(Msig.transpose()) 
array([[ 0.0 +0.00000000e+00j, 0.0 +0.00000000e+00j, 
     0.0 +0.00000000e+00j, 0.0 +0.00000000e+00j, 
     0.0 +0.00000000e+00j, 0.0 +0.00000000e+00j], 
     [ 1.0 +0.00000000e+00j, -0.5 +8.66025404e-01j, 
     -0.5 -8.66025404e-01j, 1.0 -3.88578059e-16j, 
     -0.5 +8.66025404e-01j, -0.5 -8.66025404e-01j], 
     [ 0.0 +0.00000000e+00j, 0.0 +0.00000000e+00j, 
     0.0 +0.00000000e+00j, 0.0 +0.00000000e+00j, 
     0.0 +0.00000000e+00j, 0.0 +0.00000000e+00j], 
     [ 0.0 +0.00000000e+00j, 0.0 +0.00000000e+00j, 
     0.0 +0.00000000e+00j, 0.0 +0.00000000e+00j, 
     0.0 +0.00000000e+00j, 0.0 +0.00000000e+00j]]) 

lo mejor que puedo conseguir si me lío con los parámetros (eje, etc.) de la PN. fft.fft()/np.fft.fft2()/np.fft.fftn() son los mismos valores pero cambiados. Desafortunadamente, el cambio manual no es una opción, ya que el tamaño y la forma de la matriz Msig varían según los parámetros de entrada.

tiene alguna idea de cómo resolver este problema, ¿cuál puede ser la causa?

+2

de transposición está ahí por alguna razón no relacionada, ¿verdad? – Ali

Respuesta

14

Matlab aplica el fft sobre las columnas de la matriz, numpy aplica el fft sobre el último eje (las filas) de forma predeterminada. ¿Quieres:

>>> np.fft.fft(Msig.T, axis=0) 
array([[ 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 1.+0.j, 0.+0.j], 
     [ 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.-1.j, 0.+0.j], 
     [ 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, -1.+0.j, 0.+0.j], 
     [ 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+1.j, 0.+0.j]]) 

o

>>> np.fft.fft(Msig).T 
array([[ 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 1.+0.j, 0.+0.j], 
     [ 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.-1.j, 0.+0.j], 
     [ 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, -1.+0.j, 0.+0.j], 
     [ 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+1.j, 0.+0.j]]) 
+0

Parece que es eso! Muchas gracias mi señor! – Chris

Cuestiones relacionadas