How to properly scale frequency axis in Fast Fourier Transform?
我正在尝试使用简单正弦函数FFT的一些示例代码。下面是代码
1 2 3 4 5 6 7 8 9 10 11 12 | import numpy as np from matplotlib import pyplot as plt N = 1024 limit = 10 x = np.linspace(-limit, limit, N) dx = x[1] - x[0] y = np.sin(2 * np.pi * 5 * x) + np.sin(2 * np.pi * x) Y = np.abs(np.fft.fft(y) ** 2) z = fft.fftshift(np.fft.fftfreq(N, dx)) plt.plot(z[int(N/2):], Y[int(N/2):]) plt.show() |
从给出的函数可以明显看出,在频率1和5处应该有两个尖峰。但是,当我运行此代码时,得到以下图。
显然,峰值不在应有的位置。此外,我注意到频率缩放对点
如您所见,尖峰的位置已更改。现在保持
如何使频率轴始终正确缩放?
但是它确实接受复数作为输入。实际上,这种情况很少见。输入通常是实数样本,如上例所示。在那种情况下,傅立叶变换具有特殊的性质:它在频域中是对称的,即
有一个突出的频率:
您实际上并不需要依赖那些在频率上运行的功能。仅根据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | from numpy.fft import fft from numpy import arange, linspace, sin, pi as π from matplotlib import pyplot def FFT(t, y): n = len(t) Δ = (max(t) - min(t)) / (n-1) k = int(n/2) f = arange(k) / (n*Δ) Y = abs(fft(y))[:k] return (f, Y) t = linspace(-10, +10, num=1024) y = sin(2*π * 5*t) + sin(2*π * t) (f, Y) = FFT(t, y) pyplot.plot(f, Y) pyplot.show() |
请注意,对于实值数据的常见用例,Numpy还提供了专用功能