参考:Python中小波工具(pywt)分析EEG数据-CSDN博客
# PPG信号地采样频率为125HZ,心率的频率对应为0-3HZ之间
# 确定分解层数,maxlevel = 4时,125/2^4~7.8,最低的频率范围为0-7.8HZ,此时才能找到正确的频率点
#返回值为最低频率对应的时域离散信号以及对应频率区间的右边界
def TimeFrequencyWP(data, fs, wavelet, maxlevel = 4):
wp = pywt.WaveletPacket(data=data, wavelet=wavelet, mode='symmetric', maxlevel=maxlevel)
# 频谱由低到高的对应关系,这里需要注意小波变换的频带排列默认并不是顺序排列,所以这里需要使用’freq‘排序。
freqTree = [node.path for node in wp.get_level(maxlevel, 'freq')]
# 计算maxlevel最小频段的带宽
freqBand = fs / (2 ** maxlevel)
for i in range(len(freqTree)):
# 第i个频段的最小频率
bandMin = i * freqBand
# 第i个频段的最大频率
bandMax = bandMin + freqBand
# 判断第i个频段是否在要分析的范围内
if (0 <= bandMin and 8 >= bandMax):
new_data = wp[freqTree[i]].data
frequency = bandMax
return new_data,frequency
从小波分解后的信号得到对应的频谱,找到心率对应的位置,计算出心率
data,F = TimeFrequencyWP(PPG,125,"db4")
data_fft = np.abs(np.fft.fft(data))
len1 = len(data_fft) #这里len1=38
BPM_DWT = np.argmax(data_fft[:len1//2])*F*60/len1