了解python

时间:2015-12-16 18:18:36

标签: python fft

我正在尝试理解scipy.fftpack.fft的输出。我创造了一个信号,并做了一个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()

创造了这个:

fft out

我知道信号强度大小的单位与从(V)创建的波形上的信号单位相同。我不理解fft频率的大小与原始信号的幅度之间的关系。例如,50 Hz正弦波部分的幅度为5.0 V,那么为什么fft上的50 Hz的幅度大约为3.6 V?

1 个答案:

答案 0 :(得分:4)

如果音调的频率是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幅度。