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

Mic*_*bie 3 python arrays signal-processing numpy fft

该文档说这样np.fft.fft做:

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

np.fft.rfft这样做:

计算一维离散傅里叶变换以获得实际输入。

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

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

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

Moh*_*bas 9

这里通过示例解释基本区别。正如它所说:

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))
Run Code Online (Sandbox Code Playgroud)

将导致:

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]
Run Code Online (Sandbox Code Playgroud)

通知如何最终元件的的FFT输出是复数 第二元件的缀合物,用于实数输入。对于rfft 利用 这种对称性仅计算非负频率


B. *_* M. 7

原因在文档中说明:

当为纯实数输入计算DFT时,输出是Hermitian对称的,即负频率项只是相应正频率项的复共轭,因此负频率项是多余的。此函数不计算负频率项,因此输出的转换轴的长度为n // 2 + 1。

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

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

In [125]: sp=rfft(s)

In [126]: plot(abs(sp))
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

  • 是的,它将。没用。这样我就更方便了。 (2认同)
  • 因为频率与 -n,-n+1,.....-1,0,1,... n-1,n 成正比。+1 代表中心项,它是自对称的。 (2认同)