使用 PulseSensor 脉搏传感器测量心率之三:脉搏波信号处理(频域)(Python)2

在上一节中实现原始数据在时域的回放,这样有助于直观的认识采集的数据,以便进一步的分析和处理,数据处理时,我们可以从波形中提取和时间及强度相关的信息,并由此推演出其它物理量。
同时,我们也知道时域的波,是多个波叠加的结果,在某一时刻,为多个震动在此时刻的叠加,这部分知识,可以回顾一下这篇文章,傅立叶变换应用与性质。
参考:傅立叶变换应用与性质(https://blog.csdn.net/viswang/article/details/80727833)
如下图所示
时域波形
频域多个震动
映射到多个脏象上,那么可以认为此时的脉搏波,在这一时刻,为多个脏象震动叠加到血液上的结果,因此,通过频域分析,就可以了解到多个脏象震动的情况,从而提取到多个脏象频率及强度相关的信息,对于某个脏象可以单独把这个频率的相关的波单独提取出来,并由此推演出其它物理量。
本节只进行时域到频域的变换,直观的认识一下,由于我们使用原始数据只是一个简单的测量值,在测量过程中由于有没有出错,有没有误差我们不得而知,因此此次不涉及单独频率的反变换,后续章节将讨论反变换及误差问题。
使用 PulseSensor 脉搏传感器测量心率之三:脉搏波信号处理(频域)(Python)2_第1张图片
时域到频域的变换需要进行如下操作:
A 对的量心率进行FFT变换,既对RawY_win[ ] 进行变换
B 绘图,实现动态效果

1、Python时域波形显示示例
A 对的量心率进行FFT变换,既对RawY_win[ ] 进行变换

导入numpy库

import numpy as np

FFT变换

xf = np.fft.fft(RawY_Win)

B 绘图,实现动态效果
分割窗口,时域放上面

 plt.subplot(2,1,1) #表示将整个图像窗口分为2行1列, 当前位置为1
 plt.ylim((0, 1000))
 plt.plot(RawX_Win,RawY_Win,"b--",linewidth=1) 

分割窗口,频域放下面

plt.subplot(2,1,2)  #表示将整个图像窗口分为2行1列, 当前位置为2
plt.ylim((-10000, 10000))
plt.plot(xf,"b--",linewidth=1)

2、脉搏波波形显示(时域)完整程序

# -*- coding: utf-8 -*-

"""  
@author: [email protected]
"""

import re
from matplotlib import pyplot as plt
import numpy as np

RawY_Win = [555]*400
RawX_Win = [n for n in range(1, 401)]

with open('Plusedatald0517.txt', 'r') as f:
    while True:
        line = f.readline()     # 逐行读取

        lineS=line.startswith('S', 2,3)  #leading 'S' for sensor data
        # lineB=line.startswith('B', 2,3)  #leading 'B' for BPM data
        #  lineQ=line.startswith('Q', 2,3)  #leading 'Q' means IBI data 
        if lineS:
         # print(lineS)
         # print(re.findall(r'\d+', line))  #cut off the leading 'S'
          Sensor1 = re.findall(r'\d+', line)    #convert the string to usable muber
          Sensor2 = Sensor1[0]
          Sensor3 = int(Sensor2)    #convert the string to usable int
          #Sensor3 = (1023 - int(Sensor2)) - 212
          del RawY_Win[0]

          RawY_Win.append(Sensor3)
          xf = np.fft.fft(RawY_Win)
          plt.clf()

          plt.subplot(2,1,1) #表示将整个图像窗口分为2行1列, 当前位置为1
          plt.ylim((0, 1000))
          plt.plot(RawX_Win,RawY_Win,"b--",linewidth=1) 

          plt.subplot(2,1,2)  #表示将整个图像窗口分为2行1列, 当前位置为2
          plt.ylim((-10000, 10000))
          plt.plot(xf,"b--",linewidth=1)

          plt.draw()
          plt.pause(0.0001)

        if not line:
           break

plt.show()    #显示图  

写在最后的话,对原始数据进行回放及频域变换,对采集的数据有直观的认识后,才能进一步的分析和处理,其中涉及到多方面的知识及反复迭代。
《难经.六十一难》将四诊概括为:望而知之谓之神、闻而知之谓之圣、问而知之谓之工、切而知之谓之巧,通过脉搏传感器测量心率,就是要实现“巧”为目标。
作为Python以及中医初学者,隐隐的有这种感觉,可以通过《难经.六十一难》为入手点,应用编程手段进行辅助诊断,可以进行如下结合
望而知之–图像分析
闻而知之–语音分析
问而知之–语音互动
切而知之–脉搏分析
有兴趣的朋友,可以邮件沟通:[email protected]

你可能感兴趣的:(生物数据处理,python库,算法)