gpt4 book ai didi

python - 具有频率噪声的信号的阻塞 FFT

转载 作者:太空宇宙 更新时间:2023-11-04 03:21:17 25 4
gpt4 key购买 nike

我有一个相位约为 40 Hz 的信号,其中有少量噪声。我试图分析它以找到 1 秒 block 中的频率,我正在使用 python 对此进行模拟。我发现被阻塞的 FFT 分析不准确,所以我查看了特定的 block 以了解为什么会发生这种情况,并发现后来 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 并收到:

first second

并放大到 40 Hz 左右

zoom of first second

然后我看了第10秒的 block :

10th second

并放大到 40 Hz 左右:

10th second zoom

可以看到信号已经在减弱,并且这条水平线开始出现,我不确定它的来源。

然后我看了第 100 秒,这是我发现的:

100th second

并放大到 40 Hz 左右:

100th second zoom

并且 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()

最佳答案

问题出在生成的信号上:

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)

关于python - 具有频率噪声的信号的阻塞 FFT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34649862/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com