gpt4 book ai didi

python - 如何使用 Python 对原始信号应用 FFT

转载 作者:太空宇宙 更新时间:2023-11-04 00:12:37 24 4
gpt4 key购买 nike

我是处理信号方面的新手,需要您的帮助。

我从我的 TI AFE4490 获得了一个 10 秒的原始 PPG(光体积描记图)信号。我的硬件已校准,我每秒使用 250 个样本来记录这些信号。我最终获得了 2500 点。

您可以在下面看到图像、点和代码。

顶部:我的原始 PPG 信号 - 底部:尝试应用 FFT: Top: My raw PPG Signal - Bottom: Trying apply an FFT

代码:

RED, IR, nSamples, sRate = getAFESignal()


period = 1/sRate

plt.figure(1)

plt.subplot(2,1,1)
x = np.linspace(0.0, nSamples*period, nSamples)
y = IR
plt.xlabel("Time (s)")
plt.ylabel("Voltage (V)")
plt.plot(x,y)

plt.subplot(2,1,2)
yf = fft(y)
xf = np.linspace(0.0, 1.0/(2.0*period), nSamples//2)
plt.xlabel("Frequency (Hz)")
plt.ylabel("Gain")
plt.plot(xf, 2.0/nSamples * np.abs(yf[0:nSamples//2]))

plt.grid()
plt.show()

函数 getAFEsignal() 只是一个读取 .txt 文件并将所有内容放入两个 numpy 数组的函数。

您可以在此处找到 .txt 文件:Raw signal file

如您所见,我没有正确应用 FFT,我需要它来发现我需要过滤的频率。您知道我做错了什么吗?是否可以对此信号应用 FFT?

最佳答案

好消息是您的 FFT 计算没有问题。您在时域中显示的数据具有相当强的低频分量。相应地,您获得的频域图在 0Hz 附近显示出明显的尖峰。

主要问题在于如何绘制结果。为了根据对时域波形的直观感知更好地查看您可能希望在频域中看到的内容,您需要重新调整每个轴的比例。特别是,在显示的时间尺度上,您可能会注意到持续时间约为 0.25 秒的模式最多可能几秒钟。这对应于大约 0-5Hz 的频率范围。关注该范围而不是显示整个 0-125Hz 频谱是有意义的。这可以通过这样设置 x 轴限制来实现:

plt.xlim(0,5) # set x-axis limits from 0 to 5Hz

与 y 轴类似,您需要考虑具有小振幅的频率分量(在线性标度上变得更难注意到)仍然可以对时域信号产生非常明显的贡献。因此,通常需要以对数分贝标度显示频域振幅。这可以按如下方式完成:

plt.plot(xf, 20*np.log10(2.0/nSamples * np.abs(yf[0:nSamples//2])))

最后,如果您想在不受 spectral leakage 干扰的情况下更好地了解某些特定频率分量的贡献来自其他频率分量,您可能需要考虑在计算 FFT 之前对时域信号进行预过滤。例如,如果您想要消除恒定信号偏差、缓慢的 ~0.1Hz 变化和频率大于 10Hz 的噪声的影响,您可以使用如下内容:

import scipy.signal
b,a = signal.butter(4, [0.25/sRate, 10/sRate], btype='bandpass')
y = signal.filtfilt(b,a,signal.detrend(IR, type='constant'))

关于python - 如何使用 Python 对原始信号应用 FFT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51992154/

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