簡體   English   中英

實時心電圖過濾

[英]Real-time ECG filtering

在此處輸入圖片說明 我正在處理raspi3B +和python 2.7。

我正在使用AD8232心率傳感器和MCP3008模數轉換器。

我正在用matplotlib lib繪制傳感器數據,但是太吵了。

我必須過濾ECG數據,但我不知道該如何申請。

我可以實時過濾還是將繪圖數據過濾到新的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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM