Toccata in Nowhere.

Numpy 中 fft() 与 rfft() 的区别

2020.08.10

伪谱法的Python实现中,使用了 numpy.fft.rfft 函数实现了一个由实数到复数域的快速傅里叶变换。本文介绍其与 numpy.fft.fft 的区别。

阅读文档可知,对于numpy.fft.fftCompute the one-dimensional discrete Fourier Transform.,即计算一维离散傅里叶变换。

而对于 numpy.fft.rfft 则是:Compute the one-dimensional discrete Fourier Transform for real input. 计算实数输入的一维离散傅里叶变换。

看起区别不大,那么对于同一组实数输入有什么区别呢?尝试以下代码:

time = np.arange(0, 10, 0.01)
x = np.sin(2 * np.pi * 1 * time)
plt.figure(figsize=[6,2])
plt.plot(time,x)
plt.show()

y = np.fft.fft(x)
yr = np.fft.rfft(x)

plt.figure()
plt.subplot(211)
plt.plot(np.abs(y))
mst()
plt.subplot(212)
plt.plot(np.abs(yr))
mst()
plt.show()

得到输出:

可以看到,对于 numpy.fft.fft (上图),因为实函数的输入,输出是一对共轭对称的序列。 而numpy.fft.rfft (下图) 输出的则是去掉对称后更接近理解中的频域信息的序列。

同样的,因为因为二者的采样率皆相同,故 rfft 的序列长度为 fft 的一半,即为输入序列的一半。