如何使用Python对原始信号应用FFT
我是信号处理新手,需要你的帮助 我从TI AFE4490获得了10秒原始PPG(光体积图)信号。我的硬件经过校准,每秒使用250个样本来记录这些信号。最后我得了2500分 您可以看到下面的图像、要点和代码 顶部:我的原始PPG信号-底部:尝试应用FFT: 代码:如何使用Python对原始信号应用FFT,python,scipy,signal-processing,fft,Python,Scipy,Signal Processing,Fft,我是信号处理新手,需要你的帮助 我从TI AFE4490获得了10秒原始PPG(光体积图)信号。我的硬件经过校准,每秒使用250个样本来记录这些信号。最后我得了2500分 您可以看到下面的图像、要点和代码 顶部:我的原始PPG信号-底部:尝试应用FFT: 代码: RED, IR, nSamples, sRate = getAFESignal() period = 1/sRate plt.figure(1) plt.subplot(2,1,1) x = np.linspace(0.0,
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文件:
正如你所看到的,我没有正确地应用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])))
最后,如果你想更好地看到一些特定频率分量的贡献而不受其他频率分量的干扰,你可能需要考虑在计算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'))
有几件事情可能是错误的,标准化,步长,等等。试着阅读这些事情,看看你是否正确地应用了它。嘿,乔。谢谢你的回复。我会读这些东西的哇!非常感谢侦探之眼。我试了你所有的建议,现在我可以在信号机上看到我需要看到的东西了谢谢有人用采样频率或奈奎斯特频率来划分截止频率吗?@PaulMwaniki我已经复习了for
scipy.butter
,看起来你还是得用奈奎斯特频率来划分。scipy 1.2或更高版本更简单,您可以选择根本不除法,而是使用fs
参数指定采样频率。