了解 python 中的 FFT 输出
Understanding FFT output in python
我正在尝试理解 scipy.fftpack.fft 的输出。我创建了一个信号并对其进行了快速转换。这是 fft 的代码:
import numpy as np
from scipy.fftpack import fft
import matplotlib.pyplot as plt
# Number of samplepoints
N = 600
# sample spacing
T = 1.0 / 800.0
x = np.linspace(0.0, N*T, N)
y = 5.0 * np.sin(50.0 * 2.0*np.pi*x) + 1.0*np.sin(80.0 * 2.0*np.pi*x) #unit is V
yf = fft(y)
xf = np.linspace(0.0, 1.0/(2.0*T), N/2)
plt.close()
plt.plot(xf, 2.0/N * np.abs(yf[0:N/2]))
plt.grid()
plt.show()
创建这个的:
我知道信号强度幅度的单位与从 (V) 创建的波形上的信号单位相同。我不明白 fft 频率的大小与原始信号的幅度之间的关系。比如50Hz正弦部分的幅值是5.0V,那为什么fft上50hz的幅值在3.6V左右呢?
如果音调的频率是 FFT 频率间隔 1.0/(N*T)
的整数倍,则频域中的峰值幅度通常仅与时域中的音调幅度匹配。当音调频率不是频率间隔的整数倍时,音调的能量似乎分散在多个区间中,即所谓的 Spectral leakage.
根据您的具体情况,频率间隔为 800/600 = 1.333Hz
。相应地,80Hz 音调恰好是频率间隔的 60 倍,FFT 显示与相关时域分量 1.0*np.sin(80.0 * 2.0*np.pi*x)
.
幅度相同幅度的峰值
另一方面,50Hz的音调对应37.5倍的频率间隔。在这种情况下,能量分布在多个区间,峰值相应降低,显示最大峰值为 3.6,而不是 5.0 * np.sin(50.0 * 2.0*np.pi*x)
时域分量的完整 5.0 振幅。
我正在尝试理解 scipy.fftpack.fft 的输出。我创建了一个信号并对其进行了快速转换。这是 fft 的代码:
import numpy as np
from scipy.fftpack import fft
import matplotlib.pyplot as plt
# Number of samplepoints
N = 600
# sample spacing
T = 1.0 / 800.0
x = np.linspace(0.0, N*T, N)
y = 5.0 * np.sin(50.0 * 2.0*np.pi*x) + 1.0*np.sin(80.0 * 2.0*np.pi*x) #unit is V
yf = fft(y)
xf = np.linspace(0.0, 1.0/(2.0*T), N/2)
plt.close()
plt.plot(xf, 2.0/N * np.abs(yf[0:N/2]))
plt.grid()
plt.show()
创建这个的:
我知道信号强度幅度的单位与从 (V) 创建的波形上的信号单位相同。我不明白 fft 频率的大小与原始信号的幅度之间的关系。比如50Hz正弦部分的幅值是5.0V,那为什么fft上50hz的幅值在3.6V左右呢?
如果音调的频率是 FFT 频率间隔 1.0/(N*T)
的整数倍,则频域中的峰值幅度通常仅与时域中的音调幅度匹配。当音调频率不是频率间隔的整数倍时,音调的能量似乎分散在多个区间中,即所谓的 Spectral leakage.
根据您的具体情况,频率间隔为 800/600 = 1.333Hz
。相应地,80Hz 音调恰好是频率间隔的 60 倍,FFT 显示与相关时域分量 1.0*np.sin(80.0 * 2.0*np.pi*x)
.
另一方面,50Hz的音调对应37.5倍的频率间隔。在这种情况下,能量分布在多个区间,峰值相应降低,显示最大峰值为 3.6,而不是 5.0 * np.sin(50.0 * 2.0*np.pi*x)
时域分量的完整 5.0 振幅。