【发布时间】:2016-01-07 07:49:22
【问题描述】:
我有一个相位约为 40 Hz 的信号,带有少量噪声。我正在尝试分析它以找到 1 秒块中的频率,我正在使用 python 对此进行模拟。我发现阻塞的 FFT 分析不准确,因此我查看了特定的块以了解为什么会发生这种情况,并发现后来,FFT 没有意义,并且在应该的 40 Hz 附近出现尖峰。我正在使用 Python 进行此模拟,代码如下:
首先创建信号:
# Time
time = 500
# sample spacing
T = 1.0 / 5000.0
sample_freq = 1.0/T
#number of points
N = time / T
x = np.linspace(0.0, N*T, N)
noise = np.random.normal(scale = 0.01, size = len(x))
noisy_freq = 40 + noise
y = 50.0 * np.sin(noisy_freq * 2.0*np.pi*x) + 1.0*np.sin(80.0 * 2.0*np.pi*x)
然后我第一秒查看 FFT 并收到:
并放大到 40 Hz 左右
然后我看了第10秒块:
并放大到 40 Hz 左右:
可以看出信号已经在下降,并且这条水平线开始发展,我不确定它是从哪里来的。
然后我查看了第 100 秒,这就是我发现的:
并放大到 40 Hz 左右:
FFT 响应几乎没有任何确定性在 40 Hz 附近出现尖峰。我无法弄清楚为什么信号在以后会下降。我尝试过使用窗口函数,但这没有帮助。
这是我用来创建 FFT 的代码:
sample_freq = 1/T
time_step = 10
step = int(time_step * sample_freq)
x = x[100/T:101/T]
y = y[100/T:101/T]
flat = flat_top_windowing(len(y))
y = y*flat
yf = np.abs(np.fft.fft(y))
x_n = x.size
xf = np.fft.fftfreq(x_n,1/sample_freq)
plt.close()
plt.plot(xf, 2.0/N * yf[0:N/2])
plt.grid()
plt.show()
【问题讨论】: