实时心电图过滤
Real-time ECG filtering
我正在处理 raspi3B+ 和 python 2.7.
我正在使用AD8232心率传感器和MCP3008模数转换器。
我正在用 matplotlib 库绘制传感器数据,但它太吵了。
我必须过滤心电图数据,但我不知道如何申请。
我可以实时过滤还是我必须将数据保存到txt文件中然后应用过滤,过滤绘图数据到新的txt文件中?
我没有将数据保存到 txt 或 csv 文件中。如何筛选?
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()
你的脚本对我不起作用,所以我只添加代码,你需要理解。
您的脚本不实时执行,而是批量处理 500 个值的数据。我更改了脚本以实时执行图形更新。
我用的是双端队列。我从双端队列创建了一个大小为 500 的缓冲区,因此如果您继续从左侧追加它,它将自动弹出旧值,因此如果您继续绘制它,它将看起来是实时的。
在你获取新值之后,在你绘制每个周期的数据之前,你有时间进行过滤 - 例如使用粗粒度方法(你需要对其进行编程)或者你只是继续根据之前的几个值进行平均.
您修改后的代码
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()
我正在使用AD8232心率传感器和MCP3008模数转换器。
我正在用 matplotlib 库绘制传感器数据,但它太吵了。
我必须过滤心电图数据,但我不知道如何申请。
我可以实时过滤还是我必须将数据保存到txt文件中然后应用过滤,过滤绘图数据到新的txt文件中?
我没有将数据保存到 txt 或 csv 文件中。如何筛选?
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()
你的脚本对我不起作用,所以我只添加代码,你需要理解。
您的脚本不实时执行,而是批量处理 500 个值的数据。我更改了脚本以实时执行图形更新。
我用的是双端队列。我从双端队列创建了一个大小为 500 的缓冲区,因此如果您继续从左侧追加它,它将自动弹出旧值,因此如果您继续绘制它,它将看起来是实时的。
在你获取新值之后,在你绘制每个周期的数据之前,你有时间进行过滤 - 例如使用粗粒度方法(你需要对其进行编程)或者你只是继续根据之前的几个值进行平均.
您修改后的代码
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()