Фильтрация ЭКГ в реальном времени - PullRequest
0 голосов
/ 11 апреля 2019

enter image description here Я имею дело с raspi3B + и python 2.7.

Я использую датчик сердечного ритма AD8232 и аналого-цифровой преобразователь MCP3008.

Я строю данные датчика с помощью matplotlib lib, но он слишком шумный.

Мне нужно отфильтровать данные ЭКГ, но я не знал, как подать заявку.

Можно ли выполнять фильтрацию в режиме реального времени или мне нужно сохранить данные в текстовый файл, а затем применить фильтрацию после фильтрации данных печати в новый текстовый файл?

Я не сохранил данные в файл 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()

1 Ответ

0 голосов
/ 12 апреля 2019

Ваш скрипт не работает для меня, поэтому я просто добавлю код, который вам нужно понять.

Ваш скрипт выполняет не в режиме реального времени, а обрабатывает данные в пакетном режиме со значениями размера 500. Я изменил скрипт для обновления графиков в реальном времени.

Я использовал deque. Я создал из deque буфер размером 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...