首先我知道在这里有一个相同的问题答案:FFT in Matlab and numpy / scipy give different results 但那里给出的答案对我做的测试不起作用:
当我从numpy.fft做fft时,得到以下结果:
In [30]: numpy.fft.fft(numpy.array([1+0.5j, 3+0j, 2+0j, 8+3j]))
Out[30]: array([ 14.+3.5j, -4.+5.5j, -8.-2.5j, 2.-4.5j])
与我的八度音程的输出相同)
octave:39> fft([1+0.5j,3+0j,2+0j,8+3j])
ans =
Columns 1 through 3:
14.0000 + 3.5000i -4.0000 + 5.5000i -8.0000 - 2.5000i
Column 4:
2.0000 - 4.5000i
但如果我将列表转换为八度音阶和python我得到:
In [9]: numpy.fft.fft(numpy.array([1+0.5j, 3+0j, 2+0j, 8+3j]).transpose())
Out[9]: array([ 14.+3.5j, -4.+5.5j, -8.-2.5j, 2.-4.5j])
和八度:
octave:40> fft([1+0.5j,3+0j,2+0j,8+3j]')
ans =
14.0000 - 3.5000i
2.0000 + 4.5000i
-8.0000 + 2.5000i
-4.0000 - 5.5000i
我也尝试在python中重塑,但结果是:
In [33]: numpy.fft.fft(numpy.reshape(numpy.array([1+0.5j,3+0j,2+0j,8+3j]), (4,1)))
Out[33]:
array([[ 1.+0.5j],
[ 3.+0.j ],
[ 2.+0.j ],
[ 8.+3.j ]])
如何在python中获得与八度音阶相同的结果? +我没有matlab进行测试,否则我会检查它是否与octave一样,只是为了确定。
答案 0 :(得分:5)
为什么NumPy和octave会产生不同的结果:
输入不同。八度中的'
返回complex conjugate transpose,而不是transpose,.'
:
octave:6> [1+0.5j,3+0j,2+0j,8+3j]'
ans =
1.0000 - 0.5000i
3.0000 - 0.0000i
2.0000 - 0.0000i
8.0000 - 3.0000i
所以要让NumPy的结果匹配八度:
In [115]: np.fft.fft(np.array([1+0.5j, 3+0j, 2+0j, 8+3j]).conj()).reshape(-1, 1)
Out[115]:
array([[ 14.-3.5j],
[ 2.+4.5j],
[ -8.+2.5j],
[ -4.-5.5j]])
octave:7> fft([1+0.5j,3+0j,2+0j,8+3j]')
ans =
14.0000 - 3.5000i
2.0000 + 4.5000i
-8.0000 + 2.5000i
-4.0000 - 5.5000i
在NumPy中,1D阵列的转置是相同的1D阵列。
这就是fft(np.array([1+0.5j, 3+0j, 2+0j, 8+3j]).transpose())
返回一维数组的原因。
在进行1D阵列的FFT后重新整形:
您可以先进行FFT,然后再进行整形。要制作二维一维数组,您可以使用reshape
获取类似于列的数组(4,1),或使用np.atleast_2d
后跟transpose
:
In [115]: np.fft.fft(np.array([1+0.5j, 3+0j, 2+0j, 8+3j]).conj()).reshape(-1, 1)
Out[115]:
array([[ 14.-3.5j],
[ 2.+4.5j],
[ -8.+2.5j],
[ -4.-5.5j]])
或
In [116]: np.atleast_2d(np.fft.fft(np.array([1+0.5j, 3+0j, 2+0j, 8+3j]).conj())).T
Out[116]:
array([[ 14.-3.5j],
[ 2.+4.5j],
[ -8.+2.5j],
[ -4.-5.5j]])
采用2D阵列的FFT:
默认情况下, np.fft.fft
将FFT放在最后一个轴上。
这就是为什么重塑形状(4,1)不起作用的原因。相反,将数组重塑为(1,4):
In [117]: np.fft.fft(np.reshape(np.array([1+0.5j,3+0j,2+0j,8+3j]), (1,4)).conj()).T
Out[117]:
array([[ 14.-3.5j],
[ 2.+4.5j],
[ -8.+2.5j],
[ -4.-5.5j]])
或者您可以使用np.matrix
制作形状(1,4)的2D 矩阵。
同样,FFT在最后一个轴上进行,返回一个形状数组(1,4),然后您可以调换它以获得所需的结果:
In [121]: np.fft.fft(np.matrix([1+0.5j, 3+0j, 2+0j, 8+3j]).conj()).T
Out[121]:
array([[ 14.-3.5j],
[ 2.+4.5j],
[ -8.+2.5j],
[ -4.-5.5j]])
这或许可以为您提供最新的语法。但请注意,这会传递np.matrix
作为输入,但会返回np.ndarray
作为输出。
正如Warren Weckesser指出的那样,如果你已经有了一个2D NumPy数组,并希望对其列进行FFT,那么你可以将axis=0
传递给np.fft.fft。
此外,matrix
类(与ndarray类不同)具有H
属性,该属性返回复共轭转置。因此
In [114]: np.fft.fft(np.matrix([1+0.5j, 3+0j, 2+0j, 8+3j]).H, axis=0)
Out[114]:
array([[ 14.-3.5j],
[ 2.+4.5j],
[ -8.+2.5j],
[ -4.-5.5j]])