python 中的 FFT 结果取决于所选的 linspace?
FFT-results in python dependend on linspace chosen?
我是 Python 的新手,我有一个基本的理解问题。在我看来,一个FFT的结果似乎只是基于自己选择的linspace。
# Number of samplepoints
N = 600
# sample spacing
T = 1.0 / 800.0
x = p.linspace(0.0, N*T, N)
y = p.sin(50.0 * 2.0*p.pi*x) + 0.5*p.sin(80.0 * 2.0*p.pi*x)
yf = p.fft(y)
xf = p.linspace(0.0, 1.0/(2.0*T), N/2)
plt.plot(xf, 2.0/N * np.abs(yf[0:N/2]))
plt.grid()
plt.show()
以 运行 这个 fft 为例,我得到两个尖峰,分别为 50 赫兹和 80 赫兹。当我将 xf 更改为:
xf = p.linspace(0.0, 5.0/(2.0*T), N/2)
峰值在 250 和 400 赫兹左右。
这是否意味着我必须事先知道正确的结果(在本例中为输入信号所包含的两个正弦波的频率),以便稍后我可以将轴的缩放比例调整为适合那些结果?可能不是,所以如果有人能解释这个问题,我会很高兴。
您必须根据采样率、样本数和 fft (NFFT) 中使用的样本来计算正确的频率。 FFT 算法不知道你在什么时间尺度上操作。例如,频率轴也可以用 angular 频率给出,在这种情况下你只需用 2*pi.[=11= 缩放轴]
因此,您必须知道输入信号的采样率和样本数才能为 FFT 结果创建正确的频率轴 - 但是,您不需要知道有关输入信号形状的任何信息 (忽略别名问题)。
可以使用以下方法计算频率 [Hz]:
dt = 0.0001 # your T
Fs = 1 / dt # sample rate
xt = np.arange (0, 10, dt)
nt = len (xt) # length of time series, your N
# make signal
st = .5 * np.sin (50 * 2 * np.pi * xt) + .5 * np.sin (80 * 2 * np.pi * xt)
# take fourier transform and shift frequency spectra
S = np.fft.fftshift(np.fft.fft (st))
## make argument array, frequency [Hz]
#
# extending from -Fs/2 to Fs/2, the Nyquist frequency, with the same
# number of samples as in the time series (xt and st).
freqs = Fs * np.linspace (-1/2, 1/2, nt)
# plot absolute value, scaled with number of samples
# ( note that it is also interesting to plot the complex angle
# using np.angle () ). together they make a bode-plot.
plt.plot (freqs, np.abs(S) / nt)
plt.xlabel ('Frequency [Hz]')
您正在正确计算正弦函数的 FFT:
yf = p.fft(y)
然后你将它绘制成一个使用错误的行空间构造的值列表。您应该根据其频率绘制 FFT 的幅度。有关详细信息,请参阅 this 示例。
我是 Python 的新手,我有一个基本的理解问题。在我看来,一个FFT的结果似乎只是基于自己选择的linspace。
# Number of samplepoints
N = 600
# sample spacing
T = 1.0 / 800.0
x = p.linspace(0.0, N*T, N)
y = p.sin(50.0 * 2.0*p.pi*x) + 0.5*p.sin(80.0 * 2.0*p.pi*x)
yf = p.fft(y)
xf = p.linspace(0.0, 1.0/(2.0*T), N/2)
plt.plot(xf, 2.0/N * np.abs(yf[0:N/2]))
plt.grid()
plt.show()
以 运行 这个 fft 为例,我得到两个尖峰,分别为 50 赫兹和 80 赫兹。当我将 xf 更改为:
xf = p.linspace(0.0, 5.0/(2.0*T), N/2)
峰值在 250 和 400 赫兹左右。
这是否意味着我必须事先知道正确的结果(在本例中为输入信号所包含的两个正弦波的频率),以便稍后我可以将轴的缩放比例调整为适合那些结果?可能不是,所以如果有人能解释这个问题,我会很高兴。
您必须根据采样率、样本数和 fft (NFFT) 中使用的样本来计算正确的频率。 FFT 算法不知道你在什么时间尺度上操作。例如,频率轴也可以用 angular 频率给出,在这种情况下你只需用 2*pi.[=11= 缩放轴]
因此,您必须知道输入信号的采样率和样本数才能为 FFT 结果创建正确的频率轴 - 但是,您不需要知道有关输入信号形状的任何信息 (忽略别名问题)。
可以使用以下方法计算频率 [Hz]:
dt = 0.0001 # your T
Fs = 1 / dt # sample rate
xt = np.arange (0, 10, dt)
nt = len (xt) # length of time series, your N
# make signal
st = .5 * np.sin (50 * 2 * np.pi * xt) + .5 * np.sin (80 * 2 * np.pi * xt)
# take fourier transform and shift frequency spectra
S = np.fft.fftshift(np.fft.fft (st))
## make argument array, frequency [Hz]
#
# extending from -Fs/2 to Fs/2, the Nyquist frequency, with the same
# number of samples as in the time series (xt and st).
freqs = Fs * np.linspace (-1/2, 1/2, nt)
# plot absolute value, scaled with number of samples
# ( note that it is also interesting to plot the complex angle
# using np.angle () ). together they make a bode-plot.
plt.plot (freqs, np.abs(S) / nt)
plt.xlabel ('Frequency [Hz]')
您正在正确计算正弦函数的 FFT:
yf = p.fft(y)
然后你将它绘制成一个使用错误的行空间构造的值列表。您应该根据其频率绘制 FFT 的幅度。有关详细信息,请参阅 this 示例。