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

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

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以及中医初学者,隐隐的有这种感觉,可以通过《难经.六十一难》为入手点,应用编程手段进行辅助诊断,可以进行如下结合
望而知之–图像分析
闻而知之–语音分析
问而知之–语音互动
切而知之–脉搏分析
有兴趣的朋友,可以邮件沟通:viswang@163.com

  • 4
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您介绍一下频域图像处理、高通滤和低通滤的基本概念和Python实现。 频域图像处理是指将图像从空间域(即像素的位置和灰度值)转换到频率域(即图像的频谱和幅度谱)进行处理的方法。频域图像处理基于傅里叶变换(FFT)和傅里叶反变换(IFFT)实现。在频域中,可以使用不同类型的滤器对图像进行处理,包括高通滤和低通滤。高通滤器可以用来增强图像的边缘和细节,而低通滤器则可以用来平滑图像并消除噪声。 在Python中,可以使用NumPy和OpenCV库来实现频域图像处理和滤。以下是高通滤和低通滤Python代码示例: 高通滤: ``` python import cv2 import numpy as np # 读取图像 img = cv2.imread('image.jpg', 0) rows, cols = img.shape # 构建高通滤器 kernel = np.array([[-1,-1,-1],[-1,9,-1],[-1,-1,-1]]) # 傅里叶变换 f = np.fft.fft2(img) fshift = np.fft.fftshift(f) # 滤 filtered = fshift * kernel f_ishift = np.fft.ifftshift(filtered) img_back = np.fft.ifft2(f_ishift) img_back = np.abs(img_back) # 显示图像 cv2.imshow('Original Image', img) cv2.imshow('High Pass Filtered Image', img_back) cv2.waitKey() cv2.destroyAllWindows() ``` 低通滤: ``` python import cv2 import numpy as np # 读取图像 img = cv2.imread('image.jpg', 0) rows, cols = img.shape # 构建低通滤器 kernel = np.ones((5,5),np.float32)/25 # 傅里叶变换 f = np.fft.fft2(img) fshift = np.fft.fftshift(f) # 滤 filtered = fshift * kernel f_ishift = np.fft.ifftshift(filtered) img_back = np.fft.ifft2(f_ishift) img_back = np.abs(img_back) # 显示图像 cv2.imshow('Original Image', img) cv2.imshow('Low Pass Filtered Image', img_back) cv2.waitKey() cv2.destroyAllWindows() ``` 在这些代码中,我们首先读取输入图像,然后使用NumPy库进行傅里叶变换。然后,我们构建了一个高通或低通滤器,将其应用于频率域的图像,然后使用反傅里叶变换将图像转换回空间域,并显示结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值