Matlab 中的 FFT 和 numpy / scipy 给出不同的结果

Posted

技术标签:

【中文标题】Matlab 中的 FFT 和 numpy / scipy 给出不同的结果【英文标题】:FFT in Matlab and numpy / scipy give different results 【发布时间】:2012-01-30 15:24:04 【问题描述】:

我正在尝试重新实现其中一个 matlab 工具箱。 他们在那里使用fft。 当我对相同的数据执行相同的操作时,我会得到与 matlab 不同的结果。 看看吧:

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

如果我弄乱了 np.fft.fft()/np.fft.fft2()/np.fft.fftn() 的参数(轴等),我能得到的最好的值是相同的但被转移了。不幸的是,手动移位不是一种选择,因为 Msig 矩阵的大小和形状因输入参数而异。

你有任何线索如何解决这个问题,可能是什么原因?

【问题讨论】:

转置只是出于某种不相关的原因,对吧? 【参考方案1】:

Matlab 将 fft 应用于矩阵的列,numpy 默认将 fft 应用于最后一个轴(行)。你想要:

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

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

【讨论】:

以上是关于Matlab 中的 FFT 和 numpy / scipy 给出不同的结果的主要内容,如果未能解决你的问题,请参考以下文章

Matlab中的傅里叶级数系数​​使用FFT不是负数

MATLAB中的FFT的采样频率和采样点怎样确定

fft Matlab 振动时域到频率测量持续时间 = 60 s

python 问题。。。 对一个波形文件做fft,然后怎么获取那些频率分量? numpy有这个函数

wav文件和FFT的matlab中的Audioread

MATLAB中的FFT的采样频率和采样点怎样确定?