Python numpy.fft.fft和numpy.fft.rfft之间的区别是什么?

Python numpy.fft.fft和numpy.fft.rfft之间的区别是什么?,python,arrays,numpy,signal-processing,fft,Python,Arrays,Numpy,Signal Processing,Fft,文档中说,np.fft.fft执行以下操作: 计算一维离散傅里叶变换 并且np.fft.rfft执行以下操作: 计算实际输入的一维离散傅里叶变换 我还看到,对于我的数据(音频数据,实值),np.fft.fft返回一个包含复数的二维形状数组(帧数,fft长度) 对于np.fft.rfft返回包含复数的二维形状数组(帧的个数,((fft长度/2)+1))。我相信这只包含非冗余FFT箱 有人可以更深入地解释命令之间的差异以及返回数组的形状不同的原因吗。谢谢。通过示例说明基本区别。正如它所说: impo

文档中说,
np.fft.fft
执行以下操作:

计算一维离散傅里叶变换

并且
np.fft.rfft
执行以下操作:

计算实际输入的一维离散傅里叶变换

我还看到,对于我的数据(音频数据,实值),
np.fft.fft
返回一个包含复数的二维形状数组(帧数,fft长度)

对于
np.fft.rfft
返回包含复数的二维形状数组(帧的个数,((fft长度/2)+1))。我相信这只包含非冗余FFT箱


有人可以更深入地解释命令之间的差异以及返回数组的形状不同的原因吗。谢谢。

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

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输出的最终元素是如何复杂的 第二个元素的共轭,用于实际输入。对于rfft,此 利用对称性仅计算非负频率 条件


原因在文件中解释:

当计算纯实输入的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))

可能的重复我不想知道fft及其逆运算之间的区别,这是python而不是MATLAB我知道这不是MATLAB,但fft的基本概念是相同的。很公平,我现在正在阅读答案。谢谢好的,当然,很高兴能帮上忙。我喜欢答案中添加的情节,所以投票给你。如果我们绘制复共轭,它会在振幅轴上对称吗?是的。没用。所以我觉得rfft更方便。我觉得自己很笨,但+/-1来自哪里?为什么不使用NFFT/2?因为频率与-n,-n+1,…-1,0,1,。。。n-1,n。+1表示中心项,中心项本身是对称的。