【问题标题】:blocked FFT of signal with frequency noise带有频率噪声的信号的阻塞 FFT
【发布时间】: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()

【问题讨论】:

    标签: python fft


    【解决方案1】:

    问题在于生成的信号:

    np.sin(noisy_freq * 2.0*np.pi*x)
    

    随着时间的推移(变量x 中的值),乘法noisy_freq*x 意味着noisy_freq 变化对sin 阶段的影响越来越大。考虑到相位变化的增加,实际的瞬时频率变化更大(最终看起来它在整个频谱上随机跳跃)。

    要生成频率调制信号,您应该将频率贡献与:

    dphi = 2.0*np.pi*noisy_freq[:-1]*T; # per sample frequency contributions
    dphi = np.insert(dphi, 0, 0);       # set the initial phase to 0
    phi  = np.cumsum(dphi);             # integrate phase
    
    y = 50.0 * np.sin(phi) + 1.0*np.sin(80.0 * 2.0*np.pi*x)
    

    【讨论】:

    • 我认为这是有道理的。所以,假设在时间 1,添加到 40 Hz 的随机噪声是 0.1 Hz,所以它将是 sin((40 + 0.1) * 2 *pi * 1) = sin(80*pi + .2*pi ) 这是少量的频率噪声。然后稍后在时间 100 它将是 sin((40 + 0.1) * 2 * pi * 100) = sin(800*pi + 20*pi) ,这是一个更大的频率噪声。所以噪音实际上是随着时间的推移而增加的,这只是我创建信号的方式的产物,对吧?
    猜你喜欢
    • 1970-01-01
    • 2020-09-16
    • 1970-01-01
    • 2020-06-04
    • 2012-04-27
    • 1970-01-01
    • 2013-04-01
    • 2022-11-07
    • 1970-01-01
    相关资源
    最近更新 更多