documentaci on - eva.fing.edu.uy

26
Proyecto del curso Dise˜ noL´ogico2 2019 Implementaci´ on de un algoritmo de procesamiento digital de se˜ nales card´ ıacas Documentaci´ on Autores: Gonzalo “cabez´on Cu˜ narro Nicol´ as “γ Gammarano Tutores: Julio erez Francisco Veirano Germ´ an Fierro Fecha: 13 de julio de 2019 Instituto de Ingenier´ ıa El´ ectrica - Facultad de Ingenier´ ıa - Universidad de la Rep´ ublica

Upload: others

Post on 03-Jul-2022

7 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Documentaci on - eva.fing.edu.uy

Proyecto del cursoDiseno Logico 2

2019

Implementacion de un algoritmode procesamiento digital

de senales cardıacas

Documentacion

Autores: Gonzalo “cabezon” CunarroNicolas “γ” Gammarano

Tutores: Julio PerezFrancisco VeiranoGerman Fierro

Fecha: 13 de julio de 2019

Instituto de Ingenierıa Electrica - Facultad de Ingenierıa - Universidad de la Republica

Page 2: Documentaci on - eva.fing.edu.uy

Indice

1. Introduccion 2

2. Objetivo 3

3. Algoritmo a implementar 33.1. Entradas del algoritmo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33.2. Salidas del algoritmo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

4. Diagrama de bloques 44.1. Emulador de datos de ADC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54.2. Filtro FIR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54.3. Buffer circular . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54.4. Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54.5. Detector de picos R de la senal de ECG y calculo del perıodo cardıaco en muestras . . . . . . . . 64.6. Promedio de las senales de ECG y BCG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64.7. Calculo de los intervalos R-J e I-J promedio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

5. Diseno de cada bloque 75.1. Emulador de datos de ADC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75.2. Filtro FIR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75.3. Buffer circular . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85.4. Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95.5. Detector de picos R de la senal de ECG y calculo del perıodo cardıaco en muestras . . . . . . . . 105.6. Promedio de las senales de ECG y BCG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115.7. Calculo de los intervalos R-J e I-J promedio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

6. Duracion del algoritmo 13

7. Testing del circuito 14

8. Conclusiones 16

A. Anexo 18A.1. Codigo de Matlab que genera un archivo .mif en base a los datos de las senales ECG y BCG

muestreadas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18A.2. Codigo de Matlab que implementa el mismo algoritmo y compara con las senales del FPGA . . . 20A.3. Codigo de Matlab que lee un archivo hexadecimal (.hex) de Intel . . . . . . . . . . . . . . . . . . 25

1

Page 3: Documentaci on - eva.fing.edu.uy

1. Introduccion

Este proyecto del curso de Diseno Logico 2 esta enmarcado en el proyecto I3 “Plataforma integrada alimen-tada inalambricamente para dispositivos biomedicos implantables y vestibles” en el cual participan FranciscoVeirano y German Fierro, entre otros.

El electrocardiograma (ECG) es la representacion grafica de la actividad electrica del corazon en funcion deltiempo. A continuacion se muestra un dibujo de un ECG tıpico, mostrando los nombres de las ondas (P, Q, R,S, T y U) y los intervalos en un perıodo cardıaco.

POnda

PRSegmento

QRSComplejo

STSegmento

TOnda

UOnda

PRIntervalo

QTIntervalo

Figura 1: Dibujo de ECG con etiquetas de ondas e intervalos. Imagen tomada delsitio Electrocardiograma de Wikipedia.

El balistocardiograma (BCG) vertical es la representacion grafica de las fuerzas balısticas del corazon enel eje vertical en funcion del tiempo. A continuacion se muestra un dibujo de un BCG tıpico, mostrando losnombres de las ondas (H, I, J, K, L, M y N) en un perıodo cardıaco.

Figura 2: Balistocardiograma para un latido del corazon. Imagen tomada delartıculo “Ballistocardiogram: Mechanism and Potential for Unobtrusive Cardiovascular Health Monitoring”.

2

Page 4: Documentaci on - eva.fing.edu.uy

2. Objetivo

El objetivo del proyecto es implementar un algoritmo en hardware que permita obtener ciertos parametroscardıacos de una persona a partir de senales de ECG y BCG de la misma. El algoritmo fue tomado del trabajodoctoral de German Fierro, quien ya tiene una implementacion en software. El objetivo del trabajo doctoral deFierro es estimar la presion arterial a partir de la salida del algoritmo mencionado. El fin de este proyecto esimplementar el procesamiento de datos de dicho sistema en un FPGA.

3. Algoritmo a implementar

3.1. Entradas del algoritmo

Se tendran como entradas 2 senales analogicas (ecg de un electrocardiograma y bcg de un balistocardiogra-ma), que seran digitalizadas a traves de un ADC de frecuencia de muestreo fs configurable en este proyecto (enla implementacion de Fierro fs = 250 Hz). Luego se filtraran ambas senales ecg y bcg con un filtro FIR (FiniteImpulse Response). El algoritmo se realiza sobre las senales filtradas.

Tambien se tendra como entrada una senal start, luego de la cual se debera realizar el algoritmo y dar lassalidas del mismo.

3.2. Salidas del algoritmo

El algoritmo debera ser capaz de obtener como salidas:

W , el ancho promedio del perıodo cardıaco en 20 s en muestras. Para esto, se debera detectar los picos Rde la senal de ECG, y la cantidad de muestras entre dichos picos consecutivos sera Wi. Finalmente, parahallar W , se debera promediar los Wi en los ultimos 20 s, obteniendo entonces W = 1

N

∑N−1i=0 Wi, siendo

N + 1 la cantidad de picos (onda R) que tenemos en los ultimos 20 s (si tenemos N + 1 picos, tenemos Nintervalos Wi).Observar que a partir de este parametro, se puede obtener la frecuencia cardıaca de la persona:

fc =fs

W.

Con fs = 250 Hz, tenemos

fc =250

Wlat/s =

(60) (250)

Wlat/min =

15 000

Wlat/min.

ecg y bcg, los promedios de perıodos cardıacos en 20 s de las senales de electrocardiograma y balistocar-diograma respectivamente. Dichas senales deberan ser promediadas de forma que el pico (onda R) quede

posicionada en el 20 % del vector de muestras. Luego, ecg [n] = 1N

∑Ni=0 ecgi [n] y bcg [n] = 1

N

∑Ni=0 bcgi [n],

donde n ∈{

0, ...,W − 1}

es el numero de la muestra dentro del perıodo cardıaco, i ∈ {0, ..., N} es elperıodo cardıaco y N + 1 es la cantidad de picos (onda R) que tenemos en los ultimos 20 s.

El intervalo R-J promedio en muestras. Este intervalo corresponde a medir el tiempo (en muestras) entreel pico (onda R) en ecg y el pico (onda J) en bcg. Observar que para hallar el intervalo R-J, se utilizanlas senales ecg y bcg (promediadas en 20 s).Observar que a partir de este parametro, se puede obtener el intervalo R-J (en tiempo):

tRJ = RJ × Ts =RJ

fs.

Con fs = 250 Hz, tenemos

tRJ =RJ

250s.

El intervalo I-J promedio en muestras. Este intervalo corresponde a medir el tiempo (en muestras) entreel punto I y el punto J en bcg. Observar que para hallar dicho intervalo, se utiliza la senal bcg promediadaen 20 s.Observar que a partir de este parametro, se puede obtener el intervalo I-J (en tiempo):

tIJ = IJ × Ts =IJ

fs.

3

Page 5: Documentaci on - eva.fing.edu.uy

Con fs = 250 Hz, tenemos

tIJ =IJ

250s.

Una senal que indica que finalizo el algoritmo y que los datos de salida son validos.

4. Diagrama de bloques

Dado que se consultara las salidas del algoritmo cada bastante tiempo (comparado con los 20 s), se decidiorealizar el algoritmo completo (desde cero) cada vez que se detecta un flanco en la senal start. Es decir, sedecidio detectar todos los picos de la senal ecg, y calcular las senales promediadas cada vez que se quieran losdatos. Bajo este enfoque, se podrıa apagar los bloques que realizan el algoritmo mientras start esta inactivacon el objetivo de reducir el consumo del circuito.

Ademas, se decidio serializar el algoritmo para separar el procesamiento y disenar bloques mas sencillos.En base a esto se divide el algoritmo en los siguientes bloques:

Emulador de datos de ADC

Filtro FIR

Buffer circular

Control

Detector de picos R de la senal de ECG y promedio del perıodo cardıaco en muestras

Promedio de las senales de ECG y BCG

Intervalos R-J e I-J promedio

Q_AVERAGED_BCG

Emulador de Datosde ADC

ECG

BC

G

DA

TA

REA

DY

FILTRO FIR

ECG

BC

G

DA

TA

REA

DY

BUFFER CIRCULARDETECTOR DE PICOS R Y W PROMEDIO

PROMEDIADOR DE SEÑALES

INTERVALOS RJ IJ

CONTROL

DET

ECTI

NG

_PEA

KS_

REA

DY

ESTA

DO

AV

ERA

GIN

G_S

IGN

ALS

_REA

DY

CA

LCU

LATI

NG

_IN

TER

VA

LS_

REA

DY

ECGBCG

FIRST_DATA_ADDRESS

PICOS

W

ECG_AVERAGED

BCG_AVERAGED

W

RJ

IJ

READY

START

AVERAGED_READ_ADDRESS

SIGNALS_READ_ADDRESS MUX

MUXAVERAGED_READ_ADDRESS_IN

Figura 3: Diagrama de bloques del sistema propuesto.

A continuacion se describe la funcion que cumple cada uno de los bloques mostrados en la figura 3.

4

Page 6: Documentaci on - eva.fing.edu.uy

4.1. Emulador de datos de ADC

Este bloque se realizo con el objetivo de poder validar el algoritmo.El emulador de datos de ADC se encarga de proveer con frecuencia fs seleccionable un dato de cada senal

(tanto de ecg como de bcg), como si estuvieran siendo provistas por un ADC.La “entrada” son los datos que serıan muestreados por el ADC. La salida son las senales ecg y bcg. Otra

salida es la senal data ready, que indica que hay un nuevo dato valido. Dicha senal se activa durante un perıododel reloj cuando hay un nuevo dato valido.

4.2. Filtro FIR

El filtro FIR recibe los datos de salida del ADC (tanto ecg como bcg) y los filtra. Implementa un filtro FIR

de orden 15, es decir 16 coeficientes (la ecuacion del filtro es y [n] =∑15

k=0 bkx [n− k]).La entrada son las senales ecg, bcg y data ready (salida del emulador de datos de ADC). La salida son las

senales filtradas ecg y bcg, y una senal data ready, que al igual que con el emulador de datos de ADC, indicaraque hay un nuevo dato disponible.

La figura 4 muestra la respuesta en frecuencia del filtro FIR utilizado (tanto de la implementacion en softwarecon coeficientes en punto flotante de doble precision como de la implementacion en hardware con coeficientesen punto fijo de 10 bits con signo).

0 10 20 30 40 50 60 70 80 90 100 110 120

frecuencia (Hz)

-70

-60

-50

-40

-30

-20

-10

0

10

Mag

nitu

de (

dB)

Filtro FIR

MatlabFPGA

Figura 4: Respuesta en frecuencia del filtro FIR.

4.3. Buffer circular

El buffer circular almacena los datos de las senales ecg y bcg filtradas. Para poder obtener el perıodo cardıacomedio de las senales de ecg y bcg en una ventana de 20 s, el buffer circular debe almacenar al menos (20 s)× fsmuestras (con fs = 250 Hz, eso significa que debe almacenar al menos (20 s) (250 Hz) = 5000 muestras) paracada senal. En caso de que el algoritmo tarde una cantidad de ciclos de reloj suficiente como para que lleguenn muestras nuevas de ecg y bcg del ADC, entonces el buffer circular debera almacenar al menos (20 s)× fs + nmuestras para cada senal.

4.4. Control

El bloque de control se encarga de activar sucesivamente en serie (de a uno por vez) los bloques necesariospara realizar el algoritmo.

Dichos bloques son:

5

Page 7: Documentaci on - eva.fing.edu.uy

1. Detector de picos R y calculo de W

2. Calculo de promedio de ecg y bcg

3. Calculo de intervalos R-J e I-J

Observar que es necesario que ya se hayan detectado los picos R para calcular el promedio de las senalesde ecg y bcg. Observar tambien que es necesario que se haya calculado el promedio de bcg para calcular losintervalos RJ e IJ . Es por esto que los bloques se activan en serie.

Mientras la senal de start este inactiva, el bloque de control mantiene inactivos todos los bloques. Cuandose detecta que la senal de start esta activa, el bloque de control activa el primer bloque. Cuando el primerbloque avisa que termino con una senal de ready, el bloque de control lo desactiva y activa el segundo bloque.Analogamente, el segundo y tercer bloque hacen lo mismo que el primero. Cuando el tercer bloque avisa quetermino con una senal de ready, el bloque de control lo desactiva y quedan los tres bloques desactivados hastaque se detecte nuevamente la senal de start activa.

4.5. Detector de picos R de la senal de ECG y calculo del perıodo cardıaco enmuestras

Este bloque lee los ultimos 20 s de muestras de la senal ecg filtrada y detecta los picos R, es decir que guardalas direcciones en las cuales se dan los picos R en dicha senal. Para detectar los picos R, se compara muestrassucesivas. Se considera que hay un pico R si una muestra de ecg es mayor a la muestra anterior, a la muestraposterior, y a un umbral dado (constante).

Este bloque tambien calcula el perıodo cardıaco medio en muestras W . Para calcular un perıodo cardıacoen muestras, se utiliza la “distancia” en muestras entre dos picos R consecutivos. Es por esto que se calcula Wen el mismo bloque que se hace la deteccion de picos.Se utiliza entonces la posicion de cada pico R. Habiendo N + 1 picos en los ultimos 20 s, se puede calcular

W =1

N

N−1∑i=0

Wi =1

N

N−1∑i=0

(Ri+1 −Ri) =1

N

(N−1∑i=0

Ri+1 −N−1∑i=0

Ri

)=

1

N

N∑j=1

Rj −N−1∑i=0

Ri

W =

1

N

RN +

N−1∑j=1

Rj −R0 −N−1∑i=1

Ri

=1

N(RN −R0)

Para hallar W , a medida que se van detectando picos se guarda la posicion del primer pico que se detecta(R0), del ultimo pico que se detecta (RN ) y de la cantidad total de picos detectados (N + 1).

Luego de realizar el procesamiento, se activa una senal ready al bloque de control indicando que se finalizoel procesamiento.

4.6. Promedio de las senales de ECG y BCG

A partir de los ultimos 20 s de las senales ecg y bcg filtradas, se promedia cada perıodo posicionando lassenales de manera que el pico R coincida con el 20 % del vector, que tendra Wmax muestras en total. Se realizanambos promedios en paralelo ya que deben conservar el mismo tiempo relativo.

Se necesita entonces la informacion de los picos R (salida del bloque detector de picos R), ası como lassenales ecg y bcg filtradas (salidas del bloque buffer circular).

Luego de realizar el procesamiento, se activa una senal ready al bloque de control indicando que se finalizoel procesamiento.

4.7. Calculo de los intervalos R-J e I-J promedio

El objetivo de este bloque es hallar los intervalos R-J e I-J en muestras (de las senales ecg y bcg promedioen un perıodo cardıaco). Como el bloque promediador de las senales ecg y bcg posiciona el pico R de la senalecg en el 20 % del vector, solamente debemos hallar las posiciones de los picos I y J de la senal bcg promediada.

Este bloque entonces encuentra el pico J y el pico I. Para encontrar el pico J, encuentra el maximo de lasenal bcg promediada. Para encontrar el pico I, encuentra el primer mınimo relativo de la senal bcg promediadaantes del pico J (ver figura 2). Luego, calcula RJ = NJ −NR y IJ = NJ −NI .

Luego de realizar el procesamiento, se activa una senal ready al bloque de control indicando que se finalizoel procesamiento.

6

Page 8: Documentaci on - eva.fing.edu.uy

5. Diseno de cada bloque

5.1. Emulador de datos de ADC

Para implementar el emulador de datos de ADC, se utilizo una memoria ROM (para cada senal) cuyosdatos de inicializacion son tomados de un archivo .mif (Memory Initialization File). Se recorre dicha memoriaproveyendo una muestra de ambas senales con frecuencia fs. La cantidad de bits de cada senal es seleccionable(ECG WIDTH para la senal ecg y BCG WIDTH para la senal bcg), aunque ambas senales son de 10 bits por defecto.

Para recorrer las memorias ROM, se utiliza un contador binario de 13 bits (COUNT WIDTH) correspondiente a8192 direcciones de las memorias ROM (lo que equivale aproximadamente a 33 s para una frecuencia de muestreofs = 250 Hz). Para simular una frecuencia de muestreo fs, se incrementa el contador (mediante una entradaenable) con frecuencia fs. Se utilizan los bloques divisor de frecuencia y generador de pulsos utilizados en elcurso para generar el enable del contador (pulso de un ciclo de reloj con frecuencia fs).

Dicha senal de enable tambien es una salida del bloque, actuando de data ready que indica que hay nuevosdatos validos a la salida.

La figura 5 muestra el diagrama de bloques asociado a la implementacion del bloque emulador de datos deADC. Los bloques FREQ DIV y GEN PULSO generan un pulso de un ciclo de reloj con frecuencia fs. El bloqueCONTADOR BINARIO genera la direccion de lectura de las memorias ROM y se incrementa con la senal data ready.Los bloques ROM ECG y ROM BCG son memorias ROM y fueron implementados utilizando la entidad ALTSYNCRAM

de Altera (disponible en el paquete ALTERA MF COMPONENTS de la librerıa ALTERA MF) en modo ROM.

FREQ_DIVCLK_OUT

GEN_PULSOS_ENABLE

TADORCOUNT_WIDTH=13

TADORREAD_ADDRESS

Q_ECGDATA_READY

TADORREAD_ADDRESSQ_BCG

CLK

CONTADOR_BINARIO

CLK

ROM_ECG

ROM_BCG

CLK

CLK

CLK_IN

Figura 5: Diagrama de bloques del emulador de datos de ADC.

5.2. Filtro FIR

Para implementar el filtro FIR, se reciclo lo realizado en el laboratorio 3 del curso. Se separo el filtro FIRen dos bloques: un bloque “muestras anteriores” que consiste en un shift register y almacena las ultimas 16muestras, y un bloque “calculo FIR” que hace los productos y sumas necesarios.

Se utilizaron los coeficientes del filtro FIR en binario en punto fijo con signo (complemento a 2) con 10 bitsdespues de la coma. Se hace el producto de cada uno de los 16 coeficientes (de 10 bits) con cada una de las 16muestras de ECG WIDTH para la senal ecg, obteniendo 16 terminos de 10 + ECG WIDTH bits. Luego se suman esos16 terminos, obteniendo un resultado final de 4 + 10 +ECG WIDTH bits en punto fijo. De esos bits, 4 +ECG WIDTH

bits son “antes de la coma” y 10 bits son “despues de la coma”). Se descartan los 10 bits “despues de la coma”, loque equivaldrıa a truncar numeros positivos y “truncar hacia abajo” numeros negativos (en realidad equivaldrıaa usar la funcion floor(x) que devuelve el mayor entero menor o igual a x). De manera analoga se calcula lasenal bcg (reemplazando ECG WIDTH por BCG WIDTH).

La figura 6 muestra el diagrama de bloques asociado a la implementacion del bloque filtro FIR. Los bloquesMUESTRAS ANTERIORES son shift-registers de 16 muestras (hay uno para la senal ecg y otro para la senal bcg) quese habilitan con la senal data ready (salida del bloque emulador de datos de ADC). Los bloques CALCULO FIR

toman como entrada las 16 muestras de la senal respectiva y hacen el calculo del filtro FIR (suma de productos)

7

Page 9: Documentaci on - eva.fing.edu.uy

con logica combinatoria. Como la salida estara disponible un ciclo de reloj despues de que data ready (salida delemulador de datos de ADC) este activa, entonces se genera data ready de salida simplemente con un flip-flop.

TADORTADOR ECG_OUT[9..0]

TADOR

D DATA_READY_OUT

MUESTRAS_ANTERIORES

CALCULO_FIR

CLK

ENABLEDATA_READY_IN

ECG_IN[9..0]

Q

CLK

TADORTADOR BCG_OUT[9..0]

MUESTRAS_ANTERIORESCALCULO_FIR

ENABLEDATA_READY_IN

BCG_IN[9..0]

CLK

OUTPUT_0..15 [9..0]

OUTPUT_0..15 [9..0]

Figura 6: Diagrama de bloques del filtro FIR.

5.3. Buffer circular

Las senales ecg y bcg filtradas se iran almacenando en un buffer circular.El buffer circular consiste en dos memorias RAM (una para la senal de ecg y otra para la senal de bcg) y un

contador binario para recorrer sus direcciones de escritura. Dicho contador y el write enable de las memoriasRAM se conectan a data ready (salida del filtro FIR). De esta manera, cuando hay un dato valido se escribeen las memorias y se incrementa la direccion para la proxima escritura.

Como dichas memorias RAM se van a estar escribiendo a la frecuencia fs del ADC y leyendo si el algoritmoeste activo de forma independiente, es util utilizar una DPRAM (Dual-Ported Random Access Memory, memoriaRAM de dos puertos: uno para escritura y otro para lectura).

De esta forma, si se activa la senal start y se empiezan a leer las memorias DPRAM para detectar picosR, los datos nuevos del ADC van a seguir almacenandose de manera independiente a la lectura. El puerto deescritura sera utilizado por el filtro FIR, y el puerto de lectura sera utilizado por los bloques detector de picosR y promedio de las senales ecg y bcg, facilitando el diseno. No habra ningun problema siempre y cuando hayansuficientes palabras en la memoria como para no sobreescribir la ventana de datos que utiliza el algoritmo. Esdecir que la cantidad mınima de palabras que deben tener las memorias es

d(20 s) fse+

⌈NCLK

fsfCLK

⌉.

Con fs = 250 Hz, las memorias deben tener al menos 5000 +⌈NCLK

(250Hz)fCLK

⌉palabras. En la practica se

utilizaron memorias RAM de 8192 direcciones, ya que es la primer potencia de 2 mayor a este numero (masadelante se analiza cuanto tarda el algoritmo y se da una expresion para NCLK).

La entrada de este bloque son las senales ecg, bcg y data ready (salidas del filtro FIR). Tambien se tendracomo entrada una direccion de lectura que esta conectada a ambas memorias RAM. La salida sera el dato quese quiere leer de ambas memorias (senales ecg y bcg), ası como una direccion first data address, para indicarleal que lea dichas memorias en que direccion esta el primer dato valido.

La figura 7 muestra el diagrama de bloques asociado a la implementacion del bloque buffer circular. El bloqueCONTADOR genera la direccion de escritura de las memorias RAM y se incrementa con la senal data ready (salidadel filtro FIR). Los bloques RAM ECG y RAM BCG son memorias DPRAM y fueron implementadas utilizando laentidad ALTSYNCRAM de Altera (disponible en el paquete ALTERA MF COMPONENTS de la librerıa ALTERA MF) enmodo dual port RAM. Dichas memorias escriben sus datos de entrada cuando la senal data ready esta activa.La cuenta del contador restada una constante TIME WINDOW (en nuestro caso 5000) nos da la senal de salida

8

Page 10: Documentaci on - eva.fing.edu.uy

first data address, que indica la direccion de datos de la muestra 20 s atras (en la cual se comenzara a detectarpicos R).

TADOR

ECG_OUT[9..0]TADOR

CONTADOR

FIRST_DATA_ADDRESS

RAM_ECG

CLK

WREN

ECG_IN[9..0]

CLK

TADOR

BCG_OUT[9..0]RAM_BCG

ENABLEDATA_READY_IN

BCG_IN[9..0]

CLK

COUNT

WREN

ADDWR

ADDWR

ADDRD

ADDRD

READ_ADDRESS

TIME_WINDOW-

Figura 7: Diagrama de bloques del buffer circular.

5.4. Control

Se implemento el bloque de control a traves de una maquina de estados tal cual se vio en el curso.

La figura 8 muestra la maquina de estados asociada al bloque control. La salida del bloque es el estado, ylas entradas son clk, reset, detecting peaks ready, averaging signals ready y calculating intervals ready.

ST_STANDBY

ST_DETECTING_PEAKS

ST_AVERAGING_SIGNALS

ST_CALCULATING_INTERVALS

RESET=1

START=1

DETECTING_PEAKS_READY=1

AVERAGING_SIGNALS_READY=1

CALCULATING_INTERVALS_READY=1

Figura 8: Maquina de estados del bloque control.

9

Page 11: Documentaci on - eva.fing.edu.uy

5.5. Detector de picos R de la senal de ECG y calculo del perıodo cardıaco enmuestras

Cuando se activa la senal start, el bloque de control pasa del estado ST STANDBY al estado ST DETECTING PEAKS,activando el bloque detector de picos.

Al estar activo este bloque, recorrera el buffer circular (asociado a la senal ecg) en los ultimos 20 s dedatos utilizando un contador binario, almacenando tres muestras de ecg para compararlas entre ellas (y con unumbral) y detectar los picos R. Cada vez que se detecta un pico R, se guarda la direccion de dicho pico en unamemoria RAM de picos. Para generar la direccion de escritura de dicha memoria RAM de picos se utiliza otrocontador binario. Cada vez que se detecta un pico R, se incrementa este contador y se activa el write enable dela memoria.

Ademas, para calcular W = RN−R0

N , se guarda la direccion del primer pico que se detecto en un registro, yse va guardando cada pico que se detecta en otro registro. De esta forma, al finalizar la deteccion de picos, setendra el primer pico en un registro y el ultimo pico en el otro. Se resta el contenido de ambos registros y sedivide por la cantidad de picos - 1. La cantidad de picos no es otra cosa que la salida del contador que va a ladireccion de escritura de la RAM de picos.

Al terminar de detectar picos (es decir, al terminar de recorrer los 20 s de muestras) y de calcular W , se da unasenal de detecting peaks ready al bloque de control, haciendo que el mismo pase del estado ST DETECTING PEAKS

al estado ST AVERAGING SIGNALS.

La entrada es la senal ecg filtrada y la primera direccion de datos first data address (salidas del buffercircular). La salida es la direccion de lectura de la DPRAM de ecg (entrada al buffer circular).

Por otro lado, la salida es la posicion de los picos (salida de la memoria RAM), y tambien la cantidad depicos detectados. La cantidad de picos es necesaria para que los bloques que lean la memoria de picos sepanque picos son validos: si hay N + 1 picos, significa que son validos los datos de las direcciones 0 hasta N . Losdatos de direcciones N + 1 en adelante podrıan ser datos de veces anteriores que se corrio el algoritmo. Otraentrada asociada a esta salida es la direccion de lectura de dicha memoria RAM de picos.

Finalmente, la otra salida es W .

Esta claro que dada una frecuencia cardıaca maxima que puede tener una persona, se puede hallar la cantidadmaxima de picos que se pueden tener en 20 s. Dicha cantidad maxima de picos determinara el tamano de lamemoria RAM donde se guardaran las posiciones de los picos. La cantidad de picos en 20 s esta dada por⌈

(20 s)

Tc

⌉=

⌈fc3

⌉,

siendo Tc el perıodo cardıaco en segundos y fc la frecuencia cardıaca en latidos por minuto. Considerando unpeor caso de fc ≤ 220 lat/min, se obtienen 74 picos en 20 s. Se eligio entonces la memoria de picos de 128palabras (menor potencia de 2 mayor a 74). El ancho de palabra de esta memoria correspondera con el anchode palabra de las direcciones de las memorias DPRAM del buffer circular.

Como se menciono anteriormente, W = 60fsfc

(con fs en Hertz y fc en latidos por minuto). Con fs = 250 Hz,

se tiene W = 15000fc

. Para frecuencias cardıacas normales (entre 60 lat/min y 200 lat/min), W estara entre

75 y 250. Considerando un peor caso de fc ≥ 30 lat/min, obtenemos Wmax = 500. Se utilizaron entonces⌈log2

(Wmax

)⌉= dlog2 (500)e = 9 bits para representar a W .

La figura 9 muestra el diagrama de bloques asociado a la implementacion del bloque detector de picos R.El bloque CONTADOR BINARIO INICIALIZABLE genera la direccion de lectura de la RAM de la senal ecg filtrada(entrada al buffer circular). Se inicializa el contador con first data address (salida del buffer circular) al iniciarla deteccion de picos. El contador se incrementa siempre que el detector de picos este activado ya que se demoraun ciclo de reloj para cada muestra de ecg. El bloque SHIFT REGISTER 3 consiste en un shift-register de 3muestras de ecg, para poder detectar picos R comparando cada muestra con la sucesiva anterior y posterior ycon el umbral de deteccion (implementado en el bloque SOLO DETECCION DE PICOS). El bloque CONTADOR generala direccion de escritura de la RAM de picos. Se inicializa en 0 al iniciar la deteccion de picos. Cuando se detectaun pico (senal s peak detected de salida del bloque SOLO DETECCION DE PICOS activa), se escribe en la RAM depicos y se incrementa el contador.Por otro lado, se tiene un registro que almacena la direccion del primer pico (flip-flop con enable conectadoa s is first peak & s peak detected) y otro registro que almacena la direccion del ultimo pico (flip-flop conenable conectado a s is first peak & s peak detected). La salida de ambos registros se da como entrada albloque AVERAGE W, que implementa la operacion W = RN−R0

N . El N de entrada a dicho bloque se obtiene conla direccion de escritura de la RAM de picos.

10

Page 12: Documentaci on - eva.fing.edu.uy

NUMBER_OF_PEAKS

TADOR

CONTADOR_BINARIO_INICIALIZABLE

Q_PEAKS[12..0]

ENABLE

COUNT SIGNALS_READ_ADDRESS

STATE=ST_DETECTING_PEAKS

CLEAR

INIT_VALUE

FIRST_DATA_SIGNALS_ADDRESS

TADOR

ENABLE

CLEAR

SHIFT_REGISTER_3

OUTPUT_0

OUTPUT_1

OUTPUT_2

INPUTQ_ECG[9..0]

TADOR

SOLO_DETECCION_DE_PICOS

INPUT_0

INPUT_1

INPUT_2

S_ECG_0

S_ECG _1

S_ECG _2

S_PEAK_DETECTED

TADOR

RAM_PICOS

WREN

ADDWR

ADDRD

TADOR

CONTADOR

ENABLECOUNT

CLEAR

PEAKS_READ_ADDRESS

TADOR

D

CLK

Q(S_IS_FIRST_PEAK) & (S_PEAK_DETECTED)

EN

TADOR

D

CLK

Q

EN(NOT S_IS_FIRST_PEAK) & (S_PEAK_DETECTED)

AVERAGE_W

FIRST_PEAK

LAST_PEAK

NUMBER_OF_PEAKS

W W

RN

R0

N

Figura 9: Diagrama de bloques simplificado del detector de picos R.

5.6. Promedio de las senales de ECG y BCG

Cuando el bloque detector de picos le da la senal detecting peaks ready al bloque de control indicando quetermino, el bloque de control pasa del estado ST DETECTING PEAKS al estado ST AVERAGING SIGNALS, activandoel bloque promediador de senales (y desactivando el bloque detector de picos).

Al estar activo este bloque, recorrera la memoria RAM de picos hasta que se llegue a la cantidad depicos R (ambas salidas del bloque detector de picos R). Para cada pico R, se recorren las direcciones desdePi − (20 %)Wmax hasta Pi + (80 %)Wmax de las memorias RAM del buffer circular (siendo Pi la direccion delpico R), acumulando las senales ecg y bcg en dos vectores de largo Wmax. Cada una de dichas senales se vaacumulando en una memoria DPRAM con un sumador entre la salida de la DPRAM y la senal de entrada, yla salida del sumador a la entrada de la DPRAM. De esta forma, en cada ciclo de reloj se suma lo que ya habıaen memoria con la senal actual, acumulandose. Para hacer el promedio, se tiene a la salida de las dos memoriasDPRAM un divisor que divide por la cantidad de picos.

Al terminar de promediar las senales (al terminar de acumular en las DPRAM todos los picos), se da una senalde averaging signals ready al bloque de control, haciendo que el mismo pase del estado ST AVERAGING SIGNALS

al estado ST CALCULATING INTERVALS.

La entrada son las senales filtradas ecg y bcg (salidas del buffer circular), y tambien la informacion acercade los picos de los ultimos 20 s (salida del bloque detector de picos). La salida son las senales promediadas en20 s de Wmax muestras: ecg y bcg. Se almacenaran en una memoria DPRAM.

Para el tamano de las memorias DPRAM de las senales ecg y bcg, se utiliza el perıodo cardıaco maximo(Wmax) que garantice que W ≤Wmax. Tomaremos como caso extremo (frecuencia cardıaca muy baja) un latidocada 2 s (fc = 30 lat/min), lo que da Wmax = 500. Ademas, como se sumaran todos los perıodos, se tendra quelas DPRAM de las senales ecg y bcg deberan tener un ancho de palabra de ECG WIDTH+ PEAKS ADDRESS WIDTH

y BCG WIDTH + PEAKS ADDRESS WIDTH respectivamente. Esto es para garantizar que las senales acumuladas nose salgan de rango en ninguna circunstancia.

La figura 10 muestra un diagrama de bloques simplificado asociado a la implementacion del bloque prome-diador de senales. El bloque CONTADOR genera la direccion de lectura de la RAM de picos R (salida del bloquedetector de picos R). Dicho contador se inicializa en 0 y se incrementa cada vez que se pasa al pico R siguiente.El bloque CONTADOR BINARIO INICIALIZABLE genera un contador que se inicializa en el valor Pi− (20 %)Wmax

(siendo Pi la direccion del pico R, almacenada en la RAM de picos R) y recorrera las RAM de senales ecg y bcgfiltradas (salidas del buffer circular). El bloque RAM ECG es una memoria DPRAM y fue implementada utilizandola entidad ALTSYNCRAM de Altera (disponible en el paquete ALTERA MF COMPONENTS de la librerıa ALTERA MF) enmodo dual port RAM. Se utilizo una DPRAM porque se va almacenando el valor acumulado y en un unico ciclo

11

Page 13: Documentaci on - eva.fing.edu.uy

del reloj permite leer y escribir la DPRAM (lo que se escribe D es la suma de lo que se lee Q y la muestra dela senal ecg, logrando un acumulador).

TADOR

CONTADOR_BINARIO_INICIALIZABLE

ENABLE

COUNT

S_ENABLE_NEW_PEAK OR NOT(S_ENABLE_AVERAGING_SIGNALS)

CLEAR

INIT_VALUEQ_PEAKS - MAXIMUM_W_20_PERCENT

S_ENABLE_AVERAGING_SIGNALS

SIGNALS_READ_ADDRESS

TADOR

CONTADOR

ENABLECOUNT

CLEAR

TADOR

RAM_ECG

WREN

ADDWR

ADDRD

S_ENABLE_NEW_PEAK_Q

PEAKS_READ_ADDRESSNOT(S_ENABLE_AVERAGING_SIGNALS)

Q_PEAKS

Q_PEAKS + MAXIMUM_W_80_PERCENT =

=NUMBER_OF_PEAKS + 1

AVERAGING_SIGNALS_READY

Q_ECG

Q_AVERAGED_ECGS_ENABLE_AVERAGING_SIGNALS

-N

Figura 10: Diagrama de bloques del Promediado de Senales.

5.7. Calculo de los intervalos R-J e I-J promedio

Cuando el bloque promediador de senales le da la senal averaging signals ready al bloque de control indican-do que termino, el bloque de control pasa del estado ST AVERAGING SIGNALS al estado ST CALCULATING INTERVALS,activando el bloque de intervalos R-J e I-J (y desactivando el bloque promediador de senales).

Al estar activo este bloque, recorrera la senal bcg de forma decreciente (de muestras mas recientes a muestrasmas antiguas), almacenando el maximo bcg (pico J) y el primer mınimo relativo luego de dicho maximo (picoI).

Al terminar de recorrer la senal bcg, se da una senal de calculating intervals ready al bloque de control,haciendo que el mismo pase del estado ST CALCULATING INTERVALS al estado ST STANDBY, finalizando con elalgoritmo hasta un nuevo flanco de start.

La entrada es la senal bcg (senal bcg filtrada y promediada). Observar que el pico R ya lo tenemos porquecorresponde al 20 % de la senal. La salida son los intervalos R-J e I-J en cantidad de muestras.

La figura 11 muestra el diagrama de bloques asociado a la implementacion del bloque Intervalos R-J e I-Jpromedio. El bloque CONTADOR BINARIO DEC INICIALIZABLE genera la direccion de lectura de la senal bcg (salidadel bloque promediador de senales). Dicho contador se inicializa en Wmax y decrementa siempre que se estecalculando intervalos (es decir que el bloque este activo). Se compara la senal bcg de entrada con el maximo hastael momento (almacenados en un registro cada uno), y si es mayor al maximo, actualiza el maximo y tambienactualiza el registro del pico J (direccion en la cual ocurre dicho maximo). Si la senal es un mınimo (menor alas muestras consecutivas anterior y posterior), se actualiza el registro del pico I siempre que el ultimo extremodetectado haya sido un maximo y no un mınimo. De esta manera, se puede asegurar de que el pico I detectadoes el primer mınimo antes del pico J. Como se requieren 3 muestras consecutivas, se utilizan 2 flip-flops enconfiguracion shift-register. Finalmente, para obtener RJ se utiliza la operacion RJ = J−R = J−(20 %)Wmax

(que en la practica es RJ = J − 100 ya que Wmax = 500) y para obtener IJ se utiliza la operacion IJ = J − I.

12

Page 14: Documentaci on - eva.fing.edu.uy

TADOR

CONTADOR_BINARIO_DEC_INICIALIZABLE

ENABLE

COUNT

CLEAR

INIT_VALUE

STATE=ST_CALCULATING_INTERVALS

MAXIMUM_W

=

TADOR

D

CLK

QTADOR

D

CLK

QS_BCG_AVERAGED_0 S_BCG_AVERAGED_1

MAXIMUM_W_20_PERCENT S_CALCULATING_INTERVALS_READY

AVERAGED_READ_ADDRESS

Q_BCG_AVERAGED

ES_MAXIMO

INPUT_0INPUT_1

MAXIMUM_FOUND

TADOR

D

CLK

Q

EN

S_MAXIMO

TADOR

D

CLK

Q

EN

RJ

ES_MINIMO

INPUT_0INPUT_1

MINIMUM_FOUND

INPUT_2

TADOR

D

CLK

Q

EN

IJ

J

I

-

MAXIMUM_W_20_PERCENT

-

Figura 11: Diagrama de bloques simplificado de Intervalos R-J e I-J promedio.

6. Duracion del algoritmo

A continuacion se detalla el calculo de los ciclos del reloj que tarda el algoritmo desde que la senal startesta activa hasta que la senal data ready se activa (indicando que los datos de salida W , ecg, bcg, RJ e IJ sonvalidos).

Como el algoritmo tal cual se diseno se ejecuta en serie (primero la deteccion de picos R y calculo de W ,luego el promediado de senales ecg y bcg, y finalmente el calculo de los intervalos R-J e I-J), entonces podemosdecir que

NCLK = NDP +NAS +NCI ,

donde

NCLK son los ciclos de reloj que tarda el algoritmo (desde senal start activa hasta senal data readyactiva),

NDP son los ciclos de reloj que tarda el bloque detector de picos R (desde senal start activa hasta senaldetecting peaks ready activa),

NAS son los ciclos de reloj que tarda el bloque promediador de senales (desde senal detecting peaks readyactiva hasta senal averaging signals ready activa), y

NCI son los ciclos de reloj que tarda el bloque calculador de intervalos R-J e I-J (desde senalaveraging signals ready activa hasta calculating intervals ready activa).

El bloque detector de picos R recorre una cantidad d(20 s) fse de muestras (los ultimos 20 s de la senal ecgfiltrada) y consume 1 ciclo de reloj para cada una de ellas. Se tiene entonces

NDP = d(20 s) fse .

El bloque promediador de senales recorre para cada pico una cantidad Wmax de muestras (de las senalesecg y bcg filtradas) y consume 1 ciclo de reloj para cada una de ellas. Se tiene entonces

NAS = Npicos20s ×Wmax,

siendo Npicos20s la cantidad de picos R en los ultimos 20 s.El bloque calculador de intervalos R-J e I-J recorre una cantidad Wmax de muestras (de la senal bcg) y

consume 1 ciclo de reloj para cada una de ellas. Se tiene entonces

NCI = Wmax.

13

Page 15: Documentaci on - eva.fing.edu.uy

Finalmente, se tieneNCLK = d(20 s) fse+ (Npicos20s + 1)Wmax.

Para fs = 250 Hz y considerandoWmax = 500 (que equivale a una frecuencia cardıaca mınima de fc = 30 lat/mina dicha frecuencia de muestreo), se tiene

NCLK = 5000 + (Npicos20s + 1) 500.

Con esta implementacion del algoritmo la cantidad de ciclos de reloj que tarda solo depende de Npicos20s,la cantidad de picos R en los ultimos 20 s. Para una frecuencia cardıaca de fc = 60 lat/min, se tiene queNpicos20s = 20 y entonces NCLK = 5000 + (20 + 1) 500 = 15 500, mientras que para una frecuencia cardıaca defc = 200 lat/min, se tiene que Npicos20s = 67 y entonces NCLK = 5000 + (67 + 1) 500 = 39 000.

A partir de este calculo es que queda completamente determinado el tamano mınimo que deben tener lasmemorias DPRAM del buffer circular. Habıamos determinado la cantidad mınima de palabras era

d(20 s) fse+

⌈NCLK

fsfCLK

⌉= d(20 s) fse+

⌈(d(20 s) fse+ (Npicos20s + 1)Wmax

) fsfCLK

⌉.

Con fs = 250 Hz y fCLK = 50 MHz, se tiene fCLK

fs= 200 000. Como NCLK < 200 000, entonces la cantidad

mınima de palabras es 5001. Con fs = 250 Hz y fCLK = 100 kHz, se tiene una cantidad mınima de palabras de5098.

7. Testing del circuito

A medida que se fue disenando cada uno de los bloques del proyecto, se los fue testeando por separado paraasegurarse de que cada bloque funciona como se desea. Finalmente, se testeo el proyecto completo.

Para testear el algoritmo implementado, se utilizaron senales ecg y bcg reales adquiridas por German Fierrocon una frecuencia de muestreo fs = 250 Hz.

Se creo un nuevo proyecto en el Quartus II utilizando una instancia del proyecto completo, con entradas clk(reloj de 50 MHz de la placa DE0), reset (switch[0] de la placa DE0) y start. Para generar la senal de entradastart, se utilizo un latch S-R, conectando S a but[2] y R a but[1], y a la salida de dicho latch un generador depulsos, de modo de eliminar los rebotes en los botones y que start solo este activo durante un ciclo de reloj. Res-pecto a las salidas del algoritmo, desplegamos W en los ledg[8..0], RJ en los display de 7 segmentos hex3[6..0]y hex2[6..0] e IJ en los display de 7 segmentos hex1[6..0] y hex0[6..0] (utilizando bloques de hexadecimal a7 segmentos). Las senales ecg y bcg promediadas de salida no se muestran puesto que se observaran de susrespectivas memorias RAM usando la herramienta In-System Content Memory Editor del programa QuartusII de Altera y como no se usan fueron simplificadas y no se muestran explıcitamente como salidas del bloquePROYECTO COMPLETO. La figura 12 muestra el diagrama de bloques asociado a dicho proyecto. Dicho diagramade bloques fue tomado de la herramienta RTL Viewer del programa Quartus II de Altera.

Date: July 08, 2019 RTL Viewer: [ TESTBENCH | Page 1 of 1 ] Project: TESTBENCH

Page 1 of 1 Revision: TESTBENCH

R_N

S_NQ

CLK

INPUT

RESET

EDGE_DETECTED

CLK

RESET

START

AVERAGED_READ_ADDRESS_IN[8..0]

DATA_READY

RJ[8..0]

IJ[8..0]

W[12..0]

HEX_IN[3..0] SEG_OUT[6..0]

HEX_IN[3..0] SEG_OUT[6..0]

HEX_IN[3..0] SEG_OUT[6..0]

HEX_IN[3..0] SEG_OUT[6..0]

GEN_PULSO:U1PROYECTO_COMPLETO:U2

9' h000 --

HEX_TO_7SEG:U3

HEX_TO_7SEG:U4

HEX_TO_7SEG:U5

HEX_TO_7SEG:U6

CLOCK_50SWITCH[0..0]

BUTTON[2..1]

LED_GREEN[9..0]

HEX_0[6..0]

HEX_1[6..0]

HEX_2[6..0]

HEX_3[6..0]

ELIMINADOR_DE_REBOTES:U0

Figura 12: Diagrama de bloques del testbench utilizado en la placa DE0.

En primer lugar, se hizo un script de Matlab con la misma implementacion que la que se hizo en VHDL. Sesimulo las operaciones en punto fijo (para eso, lo que se hizo fue simplemente utilizar enteros y la funcion floor

luego de dividir dos numeros). Se obtuvieron exactamente los mismos resultados presentados a continuacion.

14

Page 16: Documentaci on - eva.fing.edu.uy

Para empezar, en la figura 13 se muestran las senales ecg y bcg crudas provistas por Fierro. Se muestran 3perıodos cardıacos completos, pero la senal completa usada tiene 8192 muestras (que equivale aproximadamentea 33 s).

Tiempo (en s)0 0.5 1 1.5 2 2.5 3

Vol

taje

(en

mV

)

0

500

1000

1500

2000

2500

3000

3500

Señales ECG y BCG crudas

Figura 13: Senales ecg (curva azul) y bcg (curva roja) crudas.

Se observa que las senales son muy ruidosas. En particular, se aprecia un ruido de 50 Hz (5 muestras deperıodo). Dichas senales se escalaron a 9 bits con signo (entre −256 y 255) y se usaron como entrada delalgoritmo (inicializacion de las memorias ROM del bloque emulador de datos, que genera dichos datos como sifueran la salida del ADC).

La figura 14 muestra las senales ecg y bcg filtradas por el filtro FIR (con coeficientes en punto fijo de 10 bitscon signo). Se observa que el ruido de 50 Hz en la senal de ecg filtrada deja de apreciarse.

La figura 15 muestra el perıodo cardıaco promedio de las senales ecg y bcg filtradas por el filtro FIR. Seobserva que el pico R de la senal ecg esta situado un poco antes de 0.2 s, lo que corresponde al 20 % del total(que es un poco menos que 1 s).

Los resultados de salida del algoritmo implementado en Matlab fueron exactamente los mismos que los desalida del algoritmo implementado en el FPGA (senales extraıdas de las memorias RAM usando la herramientaIn-System Memory Content Editor del programa Quartus II de Altera). Se obtuvo W = 242 muestras, lo que

equivale a una frecuencia cardıaca de fc = (60 s/min)fsW

= (60 s/min)(250Hz)242 = 62 lat/min. Se obtuvieron inter-

valos R-J e I-J de 21 muestras y 5 muestras respectivamente, lo que implica tRJ = RJfs

= 21(250Hz) = 84 ms y

tIJ = IJfs

= 5(250Hz) = 20 ms.

A continuacion se procedio a comparar los resultados obtenidos con el algoritmo implementado en Matlabpero con punto flotante de doble precision (incluyendo los coeficientes del filtro FIR y el promediado de lassenales). Se obtuvo resultados muy similares, con diferencias no apreciables.

Las diferencia maxima entre las senales filtradas de salida del FPGA y las de Matlab habiendo hecho loscalculos en punto flotante de doble precision es 1.16. Se concluye entonces que la precision utilizada pararepresentar los coeficientes del filtro FIR es suficiente.

15

Page 17: Documentaci on - eva.fing.edu.uy

Tiempo (en s)0 0.5 1 1.5 2 2.5 3

Val

or e

n ui

nt10

-300

-200

-100

0

100

200

300

400Señales ECG y BCG filtradas

Figura 14: Senales ecg (curva azul) y bcg (curva roja) filtradas.

Tiempo (en s)0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9

Val

or e

n ui

nt10

-250

-200

-150

-100

-50

0

50

100

150

200

250Señales ECG y BCG promediadas

Figura 15: Senales ecg (curva azul) y bcg (curva roja) promediadas en un perıodo cardıaco.

8. Conclusiones

Se logro implementar el algoritmo propuesto en hardware, mostrando que funciona y los resultados son losesperados.

Para este proyecto se utilizaron conceptos aprendidos en el curso, ya que se desarrollo el proyecto en len-guaje VHDL y se usaron herramientas del Quartus II. Tambien se utilizaron algunos bloques disenados en loslaboratorios del curso, por ejemplo los bloques CONTADOR BINARIO, MUESTRAS ANTERIORES y HEX TO 7SEG.

16

Page 18: Documentaci on - eva.fing.edu.uy

Si bien el algoritmo funciona de acuerdo a lo especificado, existen aspectos en los que podrıa mejorarse elproyecto realizado. Dichas posibles mejoras se detallan a continuacion.

Se podrıa redondear al descartar bits de decimales en lugar de truncar. Esto se hace al aplicar el filtroFIR y tambien al dividir por la cantidad de picos para calcular el promedio de las senales ECG y BCG.

En lugar de tener un Wmax fijo y calcular Wmax muestras de las senales ecg y bcg y guardarlas en la RAMde salida, se podrıa utilizar W y calcular solamente esa cantidad de muestras. Esto no impactarıa en eltamano de la RAM de salida, que de todas formas debera tener al menos Wmax direcciones para cubrirsefrente a la frecuencia cardıaca mınima, sino que impactarıa en la cantidad de ciclos de reloj totales querequerira el algoritmo para terminar (respecto al promediado de la senales que consume la mayor porcionde ciclos de reloj, se reducirıa de Npicos20s × Wmax a Npicos20s × W ≈ (20 s) fs ciclos de reloj). Parafs = 250 Hz, se tendrıa NAS = 5000, y por lo tanto NCLK = 10 500, en lugar de NCLK = 39 000.

En lugar de realizar primero la deteccion de picos R (y calculo de W ) y luego el promediado de la senales demanera totalmente serial, se podrıa acumular las senales cada vez que se detecta un pico R, aprovechandomas la paralelizacion de senales posible en hardware. El impacto de esta mejora serıa reducir la cantidadde ciclos de reloj que tarda el algoritmo, ası como eliminar la necesidad de la RAM de picos.

Se podrıa determinar el valor de umbral para detectar picos R en tiempo real en lugar de dejarlo prefijadode antemano. Habrıa que determinar la mejor manera de calcularlo. Por ejemplo, ir calculando el maximode la senal ecg en los ultimos 3 s y que el umbral se determine con el 50 % de dicho valor. La ventaja serıaque el algoritmo funcionarıa para cualquier persona, sin importar la amplitud de los picos R de la misma.

Implementar un bloque BIST (Built-In Self-Test) para testear facilmente el circuito digital una vez im-plementado en hardware. Dicho bloque se implementarıa a traves de un MISR (Multiple-Input SignatureRegister que es un tipo de LFSR (Linear Feedback Shift Register) que ademas de estar alimentado con lasalida de los flip-flops consecutivos, tambien esta alimentado con ciertas senales intermedias del algoritmo.La salida del bloque serıa un hash consistente en el estado de cada uno de los flip-flops del LFSR. Frentea las mismas senales y condiciones iniciales, el hash de salida deberıa ser el mismo. Utilizando este bloquese podra entonces verificar que el sistema funcione correctamente (que el hash sea el esperado).

17

Page 19: Documentaci on - eva.fing.edu.uy

A. Anexo

A.1. Codigo de Matlab que genera un archivo .mif en base a los datos de lassenales ECG y BCG muestreadas.

1 % Este s c r i p t genera2 % a p a r t i r de un arch ivo ’ . mat ’ con datos crudos de ECG y BCG ( ecgr y bcgr3 % respect ivamente ) ,4 % dos a r ch ivo s . mif (ROM ECG. mif y ROM BCG. mif ) , con 8192 puntos de 10 b i t s5 % con RADIX UNSIGNED ( es d e c i r ent r e 0 y 1023) ,6 % esca lando e l maximo de l a s s e n a l e s a 256 y e l minimo a −2567 % ngammarano , 03/07/20198

9 % Elimino v a r i a b l e s a n t e r i o r e s y c i e r r o g r a f i c a s10 c l o s e a l l11 c l e a r a l l12 c l c13

14 % Cargo l o s v e c t o r e s ecgr y bcgr15 load ( ’ data raw0 . mat ’ )16 c l e a r ptt t e n t r y tp t t t r17

18 % Como qu ie ro b b i t s s igned , mapeo19 % e l maximo de l a s ena l a 2ˆ(b−2)−120 % y e l minimo de l a s ena l a −2ˆ(b−2)21 % ( porque e l FIR t i e n e ganancia 1 .96 como maximo)22 b = 10 ;23

24 % primero l e e l im ino l a ” cont inua ” a l a s s e n a l e s25 ecg s i gnedb = ecgr − (max( ecgr )+min ( ecgr ) ) /2 ;26 bcg s ignedb = bcgr − (max( bcgr )+min ( bcgr ) ) /2 ;27

28 % Quiero que e l va l o r abso luto maximo corresponda con 2ˆ(b−2)−129 % es d e c i r que m = y/x = (2ˆ( b−2)−1)/max( abs ( s ena l ) )30 m ecg = (2ˆ( b−2)−1)/max( abs ( ecg s i gnedb ) ) ;31 m bcg = (2ˆ( b−2)−1)/max( abs ( bcg s ignedb ) ) ;32

33 % Finalmente m u l t i p l i c o por e l f a c t o r para tener l a s ena l e s ca l ada34 ecg s i gnedb = m ecg ∗ ecg s i gnedb ;35 bcg s ignedb = m bcg ∗ bcg s ignedb ;36

37 % Redondeo para quedarme con ent e ro s38 ecg s i gnedb = round ( ecg s i gnedb ) ;39 bcg s ignedb = round ( bcg s ignedb ) ;40

41 % Guardo pr imeros 20 s de muestras ( en r e a l i d a d guardo 8192 muestras )42 ecg s i gnedb = ecg s i gnedb (1 : 8192 ) ;43 bcg s ignedb = bcg s ignedb (1 : 819 2 ) ;44

45 % Convierto l o s v e c t o r e s a unsigned ya que es e l RADIX que uso en e l . mif46 ecg uns ignedb = ze ro s ( s i z e ( e cg s i gnedb ) ) ;47 f o r index = 1 : l ength ( ecg s i gnedb )48 i f e cg s i gnedb ( index ) < 049 ecg uns ignedb ( index ) = ecg s i gnedb ( index ) + 2ˆb ;50 e l s e51 ecg uns ignedb ( index ) = ecg s i gnedb ( index ) ;52 end53 end54 bcg unsignedb = ze ro s ( s i z e ( bcg s ignedb ) ) ;

18

Page 20: Documentaci on - eva.fing.edu.uy

55 f o r index = 1 : l ength ( bcg s ignedb )56 i f bcg s ignedb ( index ) < 057 bcg unsignedb ( index ) = bcg s ignedb ( index ) + 2ˆb ;58 e l s e59 bcg unsignedb ( index ) = bcg s ignedb ( index ) ;60 end61 end62

63 % Creo arch ivo ROM ECG. mif64 e c g f i l e = fopen ( ’ROM ECG. mif ’ , ’w ’ ) ;65 f p r i n t f ( e c g f i l e , ’WIDTH=10;\nDEPTH=8192;\n\nADDRESS RADIX=UNS;\nDATA RADIX=UNS

;\n\nCONTENT BEGIN\n ’ ) ;66 f o r index = 1 : l ength ( ecg uns ignedb )67 f p r i n t f ( e c g f i l e , ’ \ t %d : %d ;\n ’ , index−1, ecg uns ignedb ( index ) ) ;68 end69 f p r i n t f ( e c g f i l e , ’END;\n ’ ) ;70 f c l o s e ( e c g f i l e ) ;71

72 % Creo arch ivo ROM BCG. mif73 b c g f i l e = fopen ( ’ROM BCG. mif ’ , ’w ’ ) ;74 f p r i n t f ( b c g f i l e , ’WIDTH=10;\nDEPTH=8192;\n\nADDRESS RADIX=UNS;\nDATA RADIX=UNS

;\n\nCONTENT BEGIN\n ’ ) ;75 f o r index = 1 : l ength ( bcg unsignedb )76 f p r i n t f ( b c g f i l e , ’ \ t %d : %d ;\n ’ , index−1, bcg unsignedb ( index ) ) ;77 end78 f p r i n t f ( b c g f i l e , ’END;\n ’ ) ;79 f c l o s e ( b c g f i l e ) ;80

81 % Graf i co s e n a l e s guardadas en l o s a r ch ivo s . mif82 p lo t ( e cg s i gnedb )83 hold on84 p lo t ( bcg s ignedb )

19

Page 21: Documentaci on - eva.fing.edu.uy

A.2. Codigo de Matlab que implementa el mismo algoritmo y compara con lassenales del FPGA

1 % Este s c r i p t hace e l mismo a lgor i tmo que e l proyecto en e l FPGA por un2 % lado , y por ot ro l e e l o s a r ch ivo s . hex sacados de l In−System Memory3 % Content Editor para comparar4 % ngammarano , 03/07/20195

6 % Elimino v a r i a b l e s a n t e r i o r e s y c i e r r o g r a f i c a s7 c l o s e a l l8 c l e a r a l l9 c l c

10

11 f i r s t a d d r e s s = 0 ;12

13 % Cargo l o s v e c t o r e s ecgr y bcgr14 load ( ’ . . / Data Raw Fierro / data raw0 . mat ’ )15 c l e a r ptt t e n t r y tp t t t r16

17 % Como qu ie ro b b i t s s igned , mapeo18 % e l maximo de l a s ena l a 2ˆ(b−2)−119 % y e l minimo de l a s ena l a −2ˆ(b−2)20 % ( porque e l FIR t i e n e ganancia 1 .96 como maximo)21 b = 10 ;22

23 % primero l e e l im ino l a ” cont inua ” a l a s s e n a l e s24 ecg s i gnedb = ecgr − (max( ecgr )+min ( ecgr ) ) /2 ;25 bcg s ignedb = bcgr − (max( bcgr )+min ( bcgr ) ) /2 ;26

27 % Quiero que e l va l o r abso luto maximo corresponda con 2ˆ(b−2)−128 % es d e c i r que m = y/x = (2ˆ( b−2)−1)/max( abs ( s ena l ) )29 m ecg = (2ˆ( b−2)−1)/max( abs ( ecg s i gnedb ) ) ;30 m bcg = (2ˆ( b−2)−1)/max( abs ( bcg s ignedb ) ) ;31

32 % Finalmente m u l t i p l i c o por e l f a c t o r para tener l a s ena l e s ca l ada33 ecg s i gnedb = m ecg ∗ ecg s i gnedb ;34 bcg s ignedb = m bcg ∗ bcg s ignedb ;35

36 % Redondeo para quedarme con ent e ro s37 ecg s i gnedb = round ( ecg s i gnedb ) ;38 bcg s ignedb = round ( bcg s ignedb ) ;39

40 % Guardo pr imeros 20 s de muestras ( en r e a l i d a d guardo 8192 muestras )41 ecg s i gnedb = ecg s i gnedb (1 : 8192 ) ;42 bcg s ignedb = bcg s ignedb (1 : 819 2 ) ;43

44 % C o e f i c i e n t e s de l f i l t r o FIR45 f i r c o e f s = [−17; −41; −94; −145; −82; 60 ; 232 ; 336 ; 336 ; 232 ; 60 ; −82; −145;

−94; −41; −17];46

47 % Aplico e l f i l t r o FIR a l a s e n a l e s ecg y bcg48 f o r index = 1 : 1549 e c g f i r ( index ) = [ ecg s i gnedb ( index −15+8192:8192) ecg s i gnedb ( 1 : index ) ] ∗

f i r c o e f s ;50 b c g f i r ( index ) = [ bcg s ignedb ( index −15+8192:8192) bcg s ignedb ( 1 : index ) ] ∗

f i r c o e f s ;51 end52 f o r index = 16 : l ength ( ecg s i gnedb )53 e c g f i r ( index ) = ecg s i gnedb ( index −15: index ) ∗ f i r c o e f s ;

20

Page 22: Documentaci on - eva.fing.edu.uy

54 b c g f i r ( index ) = bcg s ignedb ( index −15: index ) ∗ f i r c o e f s ;55 end56 e c g f i r = f l o o r ( e c g f i r / 1024) ;57 b c g f i r = f l o o r ( b c g f i r / 1024) ;58

59 % Busco p i co s R en l a s ena l de ecg f i l t r a d a60 picos R = [ ] ;61 th r e sho ld = 128 ;62 i f ( e c g f i r (1 )>=e c g f i r ( l ength ( e c g f i r ) ) ) && ( e c g f i r (1 )>e c g f i r (2 ) ) && ( e c g f i r

(1 )>th r e sho ld )63 picos R = [ picos R 1 ] ;64 end65 f o r index = 2 : l ength ( e c g f i r )−166 i f ( e c g f i r ( index )>e c g f i r ( index−1) ) && ( e c g f i r ( index )>=e c g f i r ( index +1) )

&& ( e c g f i r ( index )>128)67 picos R = [ picos R index ] ;68 end69 end70 i f ( e c g f i r ( l ength ( e c g f i r ) )>=e c g f i r ( l ength ( e c g f i r )−1) ) && ( e c g f i r ( l ength (

e c g f i r ) )>e c g f i r (1 ) ) && ( e c g f i r ( l ength ( e c g f i r ) )>th r e sho ld )71 picos R = [ picos R length ( e c g f i r ) ] ;72 end73

74 % Hago promediado desde i n i t i a l i n d e x hasta 5000 muestras despues75 p r i m e r i n d i c e = f i r s t a d d r e s s + 1 ;76 ecg avg = ze ro s (1 , 501) ;77 bcg avg = ze ro s (1 , 501) ;78 i f ( p r i m e r i n d i c e + 5000<=8192)79 p i c o s v a l i d o s = ( picos R>=p r i m e r i n d i c e ) & ( picos R<=p r i m e r i n d i c e +5000) ;80 p i c o s v a l i d o s = picos R ( p i c o s v a l i d o s ) ;81 W avg = f l o o r ( ( p i c o s v a l i d o s ( l ength ( p i c o s v a l i d o s ) ) − p i c o s v a l i d o s (1 ) ) /(

l ength ( p i c o s v a l i d o s ) − 1) ) ;82 e l s e83 p i c o s v a l i d o s = ( picos R>=p r i m e r i n d i c e ) | ( picos R<=p r i m e r i n d i c e

+5000−8192) ;84 f o r i n d i c e p i c o s = (− l ength ( picos R ) :−1)∗(−1)85 i f p icos R ( i n d i c e p i c o s )>=p r i m e r i n d i c e86 pr imer p i co = i n d i c e p i c o s ;87 end88 end89 f o r i n d i c e p i c o s = 1 : l ength ( p icos R )90 i f p icos R ( i n d i c e p i c o s )<=p r i m e r i n d i c e +5000−819291 u l t imo p i co = i n d i c e p i c o s ;92 end93 end94 p i c o s v a l i d o s = picos R ( p i c o s v a l i d o s ) ;95 W avg = f l o o r ( ( p icos R ( u l t imo p i co ) + 8192 − picos R ( pr imer p i co ) ) /( l ength (

p i c o s v a l i d o s ) − 1) ) ;96

97 end98 f p r i n t f ( ’W promedio W matlab = %d\n ’ ,W avg)99

100 f o r i n d i c e p i c o s = 1 : l ength ( p i c o s v a l i d o s )101 i n d i c e s s e n a l = ( p i c o s v a l i d o s ( i n d i c e p i c o s )−100) : ( p i c o s v a l i d o s (

i n d i c e p i c o s ) +400) ;102 f o r i n d i c e s e n a l = 1 : l ength ( i n d i c e s s e n a l )103 i f i n d i c e s s e n a l ( i n d i c e s e n a l )<1104 i n d i c e s s e n a l ( i n d i c e s e n a l ) = i n d i c e s s e n a l ( i n d i c e s e n a l ) +8192;105 e l s e i f i n d i c e s s e n a l ( i n d i c e s e n a l )>8192

21

Page 23: Documentaci on - eva.fing.edu.uy

106 i n d i c e s s e n a l ( i n d i c e s e n a l ) = i n d i c e s s e n a l ( i n d i c e s e n a l ) −8192;107 end108 end109 ecg avg = ecg avg + e c g f i r ( i n d i c e s s e n a l ) ;110 bcg avg = bcg avg + b c g f i r ( i n d i c e s s e n a l ) ;111 end112 ecg accumulated = ecg avg ;113 bcg accumulated = bcg avg ;114 ecg avg = f l o o r ( ecg avg / length ( p i c o s v a l i d o s ) ) ;115 bcg avg = f l o o r ( bcg avg / length ( p i c o s v a l i d o s ) ) ;116

117 % Graf i co s e n a l e s crudas dadas por F i e r ro118 f i g u r e119 p lo t ( ecgr , ’b ’ )120 hold on121 p lo t ( ecgr , ’b∗ ’ )122 p lo t ( bcgr , ’ r ’ )123 p lo t ( bcgr , ’ r ∗ ’ )124 x l a b e l ( ’ muestras ’ )125 y l a b e l ( ’ECG y BCG en mV’ )126 t i t l e ( ’ECG y BCG crudas en mV’ )127

128 % Graf i co s e n a l e s guardadas en l o s a r ch ivo s . mif129 f i g u r e130 p lo t ( ecg s ignedb , ’b ’ )131 hold on132 p lo t ( ecg s ignedb , ’b∗ ’ )133 p lo t ( bcg s ignedb , ’ r ’ )134 p lo t ( bcg s ignedb , ’ r ∗ ’ )135 x l a b e l ( ’ muestras ’ )136 y l a b e l ( ’ECG y BCG en 10 b i t s con s igno ’ )137 t i t l e ( ’ECG y BCG crudas en 10 b i t s con s igno ’ )138

139 % Graf i co s e n a l e s pasadas por e l f i l t r o FIR140 f i g u r e141 p lo t ( e c g f i r , ’ b ’ )142 hold on143 p lo t ( e c g f i r , ’ b∗ ’ )144 p lo t ( b c g f i r , ’ r ’ )145 p lo t ( b c g f i r , ’ r ∗ ’ )146 x l a b e l ( ’ muestras ’ )147 y l a b e l ( ’ECG y BCG f i l t r a d a s en 10 b i t s con s igno ’ )148 t i t l e ( ’ECG y BCG f i l t r a d a s ’ )149

150 % Graf i co s e n a l e s promediadas151 f i g u r e152 p lo t ( ecg avg , ’b ’ )153 hold on154 p lo t ( ecg avg , ’b∗ ’ )155 p lo t ( bcg avg , ’ r ’ )156 p lo t ( bcg avg , ’ r ∗ ’ )157 x l a b e l ( ’ muestras ’ )158 y l a b e l ( ’ECG y BCG promedio en 10 b i t s con s igno ’ )159 t i t l e ( ’ECG y BCG promedio ’ )160 [R, Rindex ] = max( ecg avg ) ;161 [ J , Jindex ] = max( bcg avg ) ;162 [ I , I index ] = min ( bcg avg ) ;163 RJ matlab = Jindex − Rindex ;164 f p r i n t f ( ’ I n t e r v a l o RJ matlab = %d\n ’ , RJ matlab )

22

Page 24: Documentaci on - eva.fing.edu.uy

165 IJ matlab = Jindex − I index ;166 f p r i n t f ( ’ I n t e r v a l o IJ matlab = %d\n ’ , IJ matlab )167

168 % Graf i co s e n a l e s promediadas en e l i n t e r v a l o que i n t e r e s a ( de W avg169 % muestras )170 f i g u r e171 p lo t ( ecg avg (100− f l o o r (W avg ∗0 . 2 ) :100+ c e i l (W avg ∗0 . 8 ) ) , ’b ’ )172 hold on173 p lo t ( ecg avg (100− f l o o r (W avg ∗0 . 2 ) :100+ c e i l (W avg ∗0 . 8 ) ) , ’b∗ ’ )174 p lo t ( bcg avg (100− f l o o r (W avg ∗0 . 2 ) :100+ c e i l (W avg ∗0 . 8 ) ) , ’ r ’ )175 p lo t ( bcg avg (100− f l o o r (W avg ∗0 . 2 ) :100+ c e i l (W avg ∗0 . 8 ) ) , ’ r ∗ ’ )176 x l a b e l ( ’ muestras ’ )177 y l a b e l ( ’ECG y BCG promedio en 10 b i t s con s igno ’ )178 t i t l e ( ’ECG y BCG promedio en e l rango de i n t e r e s ’ )179

180

181

182

183

184 % Leo arch ivo EFIR . hex en formato hexadecimal de I n t e l y l o guardo en185 % unsigned 10 b i t s186 e c g f i r d e p t h = 8192 ;187 e c g f i r w i d t h = 10 ;188 e c g f i r h e x a = r e a d i n t e l h e x f i l e ( ’EFIR . hex ’ , e c g f i r d e p t h ) ;189 e c g f i r h e x a = e c g f i r h e x a ( : , 10 : 13 ) ;190 e c g f i r f p g a = f i ( [ ] , 1 , e c g f i r w i d t h , 0) ;191 e c g f i r f p g a . hex = e c g f i r h e x a ;192 c l e a r e c g f i r h e x a ;193

194 % Leo arch ivo EAVG. hex en formato hexadecimal de I n t e l y l o guardo en195 % unsigned 10 b i t s196 ecg averaged depth = 512 ;197 ecg averaged width = 17 ; %10 ;198 ecg averaged hexa = r e a d i n t e l h e x f i l e ( ’EAVG. hex ’ , ecg averaged depth ) ;199 ecg averaged hexa = ecg averaged hexa ( : , 10 : 15 ) ; %10 :13 ) ;200 ecg ave raged fpga = f i ( [ ] , 1 , ecg averaged width , 0) ;201 ecg ave raged fpga . hex = ecg averaged hexa ;202 ecg ave raged fpga = f l o o r ( e cg ave raged fpga . double / l ength ( p i c o s v a l i d o s ) ) ;203 c l e a r ecg averaged hexa ;204

205 % Leo arch ivo BAVG. hex en formato hexadecimal de I n t e l y l o guardo en206 % unsigned 10 b i t s207 bcg averaged depth = 512 ;208 bcg averaged width = 17 ; %10 ;209 bcg averaged hexa = r e a d i n t e l h e x f i l e ( ’BAVG. hex ’ , bcg averaged depth ) ;210 bcg averaged hexa = bcg averaged hexa ( : , 10 : 15 ) ; %10 :13 ) ;211 bcg averaged fpga = f i ( [ ] , 1 , bcg averaged width , 0) ;212 bcg averaged fpga . hex = bcg averaged hexa ;213 bcg averaged fpga = f l o o r ( bcg averaged fpga . double / l ength ( p i c o s v a l i d o s ) ) ;214 c l e a r bcg averaged hexa ;215

216 % Graf i co l a s ena l ECG s a l i d a de l f i l t r o FIR217 f i g u r e218 p lo t ( e c g f i r f p g a , ’b ’ )219 hold on220 p lo t ( e c g f i r f p g a , ’b∗ ’ )221 x l a b e l ( ’ muestras ’ )222 y l a b e l ( ’ECG f i l t r a d a (FPGA) en 10 b i t s con s igno ’ )223 t i t l e ( ’ECG f i l t r a d a (FPGA) ’ )

23

Page 25: Documentaci on - eva.fing.edu.uy

224

225 % Graf i co l a s s e n a l e s ECG y BCG promedio226 f i g u r e227 p lo t ( ecg averaged fpga , ’b ’ )228 hold on229 p lo t ( ecg averaged fpga , ’b∗ ’ )230 p lo t ( bcg averaged fpga , ’ r ’ )231 p lo t ( bcg averaged fpga , ’ r ∗ ’ )232 x l a b e l ( ’ muestras ’ )233 y l a b e l ( ’ECG y BCG promedio (FPGA) en 10 b i t s con s igno ’ )234 t i t l e ( ’ECG y BCG promedio (FPGA) ’ )235

236 % Graf i co l a s s e n a l e s ECG y BCG promedio en e l rango va l i do237 f i g u r e238 p lo t ( e cg ave raged fpga (100− f l o o r (W avg ∗0 . 2 ) :100+1+ c e i l (W avg ∗0 . 8 ) ) , ’b ’ ) ;239 hold on240 p lo t ( e cg ave raged fpga (100− f l o o r (W avg ∗0 . 2 ) :100+1+ c e i l (W avg ∗0 . 8 ) ) , ’b∗ ’ ) ;241 p lo t ( bcg averaged fpga (100− f l o o r (W avg ∗0 . 2 ) :100+1+ c e i l (W avg ∗0 . 8 ) ) , ’ r ’ ) ;242 p lo t ( bcg averaged fpga (100− f l o o r (W avg ∗0 . 2 ) :100+1+ c e i l (W avg ∗0 . 8 ) ) , ’ r ∗ ’ ) ;243 x l a b e l ( ’ muestras ’ )244 y l a b e l ( ’ECG y BCG promedio (FPGA) en 10 b i t s con s igno ’ )245 t i t l e ( ’ECG y BCG promedio (FPGA) en e l rango de i n t e r e s ’ )246

247 %D i f e r e n c i a s e n a l e s promedio matlab vs fpga248 d i f f = e c g f i r f p g a − e c g f i r ’ ;249 f i g u r e250 p lo t ( d i f f , ’ b∗ ’ ) ;251 x l a b e l ( ’ muestras ’ )252 t i t l e ( ’ ECGfir matlab vs ECGfir FPGA’ )253

254 %D i f e r e n c i a s e n a l e s promedio matlab vs fpga255 d i f f = ecg ave raged fpga ( 1 : 5 0 1 ) − ecg avg ’ ;256 f i g u r e257 p lo t ( d i f f , ’ b∗ ’ ) ;258 x l a b e l ( ’ muestras ’ )259 t i t l e ( ’ECGavg matlab vs ECGavg FPGA’ )

24

Page 26: Documentaci on - eva.fing.edu.uy

A.3. Codigo de Matlab que lee un archivo hexadecimal (.hex) de Intel

1 f unc t i on [ f i l e o u t p u t ] = r e a d i n t e l h e x f i l e ( f i l e name , number o f l i n e s )2 %READ INTEL HEX FILE Read an I n t e l−hexadecimal data f i l e and re tu rn s the3 %hexadecimal data in a char array .4 % f i l e n a m e : i s the name o f the I n t e l−hexadecimal f i l e .5 % number o f l i n e s : i s the number o f l i n e s that want to be ext rac t ed from6 % the f i l e .7 f i l e I D = fopen ( f i l e name , ’ r ’ ) ;8 f i l e o u t p u t = ’ ’ ;9 f o r l i n e i n d e x = 1 : number o f l i n e s

10 f i l e o u t p u t = [ f i l e o u t p u t ; f g e t l ( f i l e I D ) ] ;11 end12 f c l o s e ( f i l e I D ) ;13 end

25