首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实时心电滤波

实时心电滤波
EN

Stack Overflow用户
提问于 2019-04-11 13:38:36
回答 1查看 1K关注 0票数 1

我正在处理raspi3B+和python2.7。

我使用的是AD8232心率传感器和MCP3008模拟数字转换器.

我正在用matplotlib绘制传感器数据,但它太吵了。

我必须对心电数据进行过滤,但我不知道如何应用。

我可以进行实时过滤吗?或者我必须将数据保存到txt文件中,然后在将绘图数据过滤到新的txt文件之后应用过滤?

我没有将数据保存到txt或csv文件中。我怎么过滤?

代码语言:javascript
复制
import matplotlib.pyplot as plt
import numpy as np
import spidev, time
import RPi.GPIO as GPIO
# read adc function
def analog_read(channel):
    r = spi.xfer2([1,(8+channel)<<4,0])
    adc_out = ((r[1]&3) << 8) + r[2]
    return adc_out
spi = spidev.SpiDev()
spi.open(0,0)
fig = plt.figure()
ax = fig.add_subplot(111)
x = np.arange(500)
y=[0 for iii range(500)]
li, = ax.plot(x, y)
plt.ylim([0,3.3])
fig.canvas.draw()
plt.show(block=False)
# convert adc function
def St():
    for ii in range(1,501):
        reading = analog_read(0)
        voltage = reading * 3.3 / 4096
        time.sleep(0.005)
        vv=("%3.3f" % (voltage))
        x[ii-1]=ii-1
        y[ii-1]=vv
while True:
    St()
    li.set_ydata(y)
    fig.canvas.draw()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-11 22:44:29

您的脚本不适合我,所以我只需要添加代码,您需要理解。

您的脚本不执行实时操作,而是批量处理大小为500个值的数据。我更改了脚本,以实时执行图形更新。

我用了德克。我从deque创建了一个大小为500的缓冲区,所以如果您一直从左边追加它,它将自动弹出旧值,所以如果您继续绘制它,它将看起来是实时的。

在创建新值之后,在每个周期绘制数据之前,您都有时间执行过滤--例如,使用粗粒度方法(您需要对其进行编程),或者您只需根据以前的几个值进行平均处理。

您的修改代码

代码语言:javascript
复制
import matplotlib.pyplot as plt
import numpy as np
import spidev, time
import RPi.GPIO as GPIO
from collections import deque
# read adc function
def analog_read(channel):
    r = spi.xfer2([1,(8+channel)<<4,0])
    adc_out = ((r[1]&3) << 8) + r[2]
    return adc_out
spi = spidev.SpiDev()
spi.open(0,0)
fig = plt.figure()
ax = fig.add_subplot(111)
x = np.arange(500)
x = x.tolist()
y=[0 for iii in range(500)]
li, = ax.plot(x, y)
plt.ylim([0,3.3])
fig.canvas.draw()
plt.show(block=False)
# convert adc function


voltage_series = deque([],maxlen=500)
x_axis = x.tolist()
#fill it
for i in range(500):
    voltage_series.append(0)

# Y-axis = voltage_series
# X-axis = x_axis

counter = 0
while True: # grapg updates every read
    time.sleep(0.05)
    reading = analog_read(0)
    voltage = reading * 3.3 / 4096
    vv=("%3.3f" % (voltage))

    voltage_series.appendleft(voltage)
    if counter%500==0:
    ### Time to realtime filtering
        voltage_for_filtering = list(voltage_series)
        # transfor to numpy for example np.array(voltage_for_filtering)
        # or do standard method for smoothing noise - coarse graining
        # voltage_for_filtering = coarse_grain(voltage_for_filtering) -->> example

        li.set_ydata(voltage_for_filtering)
        fig.canvas.draw()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55633877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档