numpy.fft.fft和numpy.fft.rfft有什么区别?

时间:2018-09-18 13:26:30

标签: python arrays numpy signal-processing fft

文档说np.fft.fft是这样做的:

  

计算一维离散傅立叶变换。

np.fft.rfft执行此操作:

  

计算用于实际输入的一维离散傅立叶变换。

我还看到,对于我的数据(音频数据,实值),np.fft.fft返回包含复数的二维形状数组(number_of_frames,fft_length)。

对于np.fft.rfft,返回包含复数的二维形状数组(number_of_frames,(((fft_length / 2)+ 1))。我被认为是仅包含非冗余FFT框

有人可以更深入地解释命令之间的区别以及为什么返回数组的形状不同。谢谢。

2 个答案:

答案 0 :(得分:4)

原因在文档中进行了解释:

  

当为纯实数输入计算DFT时,输出为   厄米对称的,即负频率项只是   相应的正频率项的复共轭,以及   因此,负频率项是多余的。该功能   不计算负频率项,并且   因此,输出的变换轴为n // 2 + 1。

因此,优化了算法,而rfft则快了两倍。此外,频谱更容易绘制:

In [124]: s=abs(sin(arange(0,2**13,3)))

In [125]: sp=rfft(s)

In [126]: plot(abs(sp))

enter image description here

答案 1 :(得分:3)

通过示例说明here的基本区别。如它所说:

import numpy as np

data = [0, 1, 2, 1, 0]

print("FFT output\n", np.fft.fft(data))
print("RFFT output\n", np.fft.rfft(data))

将导致:

FFT output
 [ 4.        +0.j         -2.11803399-1.53884177j  0.11803399+0.36327126j
  0.11803399-0.36327126j -2.11803399+1.53884177j]
RFFT output
 [ 4.        +0.j         -2.11803399-1.53884177j  0.11803399+0.36327126j]
  

注意 fft输出 final元素是复杂的   第二个元素的共轭,用于实际输入。对于 rfft ,此   利用对称性仅计算非负频率   条款