rfft 与 fft 相比的 Scipy.signal 噪声

信息处理 fft 傅里叶变换
2022-01-30 01:32:21

我正在尝试对具有实数值的信号进行傅立叶变换,但是使用 rfft 得到的结果比使用 fft 得到的结果更嘈杂。

我写了以下代码:

import numpy as np
from scipy.fftpack import rfft, fft
import matplotlib.pyplot as plt
# Number of sample points

N = 600
# sample spacing
T = 1.0 / 800.0
x = np.linspace(0.0, N*T, N)
f1 = 50
f2 = 80
y = np.sin( f1* 2.0*np.pi*x) + 0.5*np.sin(f2 * 2.0*np.pi*x)
yf = fft(y)
xf = np.linspace(0.0, 1.0/(2.0*T), N/2)
plt.plot(xf, 2.0/N * np.abs(yf)[0:N/2])
#plt.savefig('sin.png')
plt.show()


yf2 = rfft(y)
xf2 = np.linspace(0.0, 1.0/(2.0*T), N)
plt.plot(xf2, 2.0/N * np.abs(yf2))
plt.savefig('sin2.png')
plt.show()

我得到以下结果:

傅里叶变换与 fft

使用 rfft 进行傅里叶变换

我认为对于实际值,我会得到与 fft 和 rfft 相同的结果,你知道为什么会有一些差异吗?

1个回答

实数序列的 DFT 是复值的。scipy.fftpack.rfft输出的数组由第 0 项的实部、第 0 项的虚部、第 1 项的实部和第 1 项的虚部组成。 .. 将rfft

的输出转换为适当的复数数组并绘制该数组的绝对值,您将得到您想要的:

yf3 = yf2[0:-2:2] + 1j*yf2[1:-1:2];
plt.plot(np.abs(yf3));
plt.show()