2011-12-30 12 views
12

Sto provando a ri-implementare uno degli strumenti matlab. usano FFT laggiù. quando eseguo la stessa operazione sugli stessi dati ottengo risultati diversi da quelli di matlab. Basta dare un'occhiata:FFT in Matlab e numpy/scipy danno risultati diversi

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  

PITONE:

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]]) 

il meglio che posso ottenere se ho pasticciare con i parametri (asse etc.) di NP. fft.fft()/np.fft.fft2()/np.fft.fftn() è lo stesso valore ma spostato. sfortunatamente lo spostamento manuale non è un'opzione, poiché le dimensioni e la forma della matrice Msig variano in base ai parametri di input.

avete qualche idea su come risolvere questo problema, quale può essere la causa?

+2

che traspongono è lì solo per qualche motivo non collegati, giusto? – Ali

risposta

14

Matlab applica il fft sulle colonne della matrice, numpy applica il fft sull'ultimo asse (le righe) per impostazione predefinita. Si desidera:

>>> 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

Sembra che sia così! Mille grazie, mio ​​signore! – Chris

Problemi correlati