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

21
文档说明np.fft.fft执行以下操作:

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

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

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

对于我的音频数据(实值数据),我发现np.fft.fft返回一个二维数组,形状为(帧数,FFT长度),其中包含复数。
np.fft.rfft返回一个二维数组,形状为(帧数,((FFT长度/2)+1)),其中包含复数。据信该数组仅包含非冗余FFT bins
请问有人能够更深入地解释这两个命令之间的差异以及为什么返回的数组形状不同吗?谢谢。

2
可能是什么是numpy.fft.rfft和numpy.fft.irfft以及在MATLAB中的等效代码的重复问题。 - Mohammad Zain Abbas
3
我不想知道fft和其逆变换之间的区别,这是Python而不是Matlab。 - MichaelAndroidNewbie
我知道这不是MATLAB,但fft的基本概念是相同的。 - Mohammad Zain Abbas
好的,我现在正在阅读答案。谢谢你。 - MichaelAndroidNewbie
好的,当然,很高兴能提供任何帮助。 - Mohammad Zain Abbas
2个回答

25

原因在文档中有解释:

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

这里输入图片描述


1
我喜欢答案中的情节补充,因此给你点了赞。如果我们要绘制复共轭,那么它是否只是在幅度轴上对称? - MichaelAndroidNewbie
2
是的,它将不会有用。所以我认为rfft更方便。 - B. M.
我感觉很蠢,但是+/-1从哪里来?为什么不是NFFT/2? - Andoriyu
2
由于频率与-n,-n+1,...,-1,0,1,...,n-1,n成比例。+1是用于中心项,它是自己的对称。 - B. M.

14

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

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,利用这种对称性仅计算非负频率项


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接