Subido por Clases FM

Detección de spikes neuronales a través de filtros adaptados

Anuncio
UNIVERSIDAD DE BUENOS AIRES
FACULTAD DE INGENIERÍA
Año 2011 – 2° Cuatrimestre
REDES NEURONALES
(66.63)
TEMA:
DETECCION DE SPIKES NEURONALES A TRAVES DE FILTROS
ADAPTADOS RESULTANTES DE UNA RED DE KOHONEN
ALUMNOS:
Gena, Anabella Cecilia- # 86343
[email protected]
Yegier, Ariel Alejandro- # 86888
[email protected]
Índice
Objetivo
Especificaciones
FPGA: Diagramas en bloques
FPGA: Descripción de las arquitecturas
FPGA: Diagrama de flujo de la CPU
Matlab: Red de Kohonen
Matlab: Código de la red de Kohonen
Matlab: Instructivo de uso del aplicativo
3
3
3
6
8
10
11
12
Objetivo
Clasificar spikes a través de filtros adaptados, para poder identificar a qué neurona
pertenece cada uno de los detectados con un mismo electrodo. Esto es necesario pues cada
uno de ellos sensa el comportamiento de más de una neurona, con el incremento de ruido en
el mecanismo de toma de muestras. Los patrones se obtendrán a través de una red de
Kohonen y se implementarán en una FPGA, en la cual se realizará el filtrado correspondiente
de la señal.
Especificaciones
Se implementó en lenguaje descriptor de hardware VHDL: una interfaz serie UART,
un controlador para la memoria RAM externa, una arquitectura compuesta por un arreglo
de tres filtros adaptados FIR y una CPU que controle todo el sistema de transmisión de
datos entre los bloques.
Se sintetizó con la herramienta ISE la descripción de hardware para la FPGA:
- Fabricante: Xilinx
- Familia: Spartan 3
- Modelo: xc3s200
- Encapsulado: FT256
- Speed: -4
Se implementó la descripción en el kit de desarrollo “Spartan-3 Starter Board" de la
empresa Digilent.
Se utilizó además para la programación de la red de Kohonen el programa Matlab
versión R2009B. Para la comunicación con la PC es necesario un cable serie RS232 derecho.
FPGA: Diagramas en bloques
A continuación se presentan los diagramas en bloques y de entradas y salidas de la
estructura en general del sistema, los filtros FIR, el controlador de la RAM externa y la uart,
cuyos funcionamientos se describirán luego:
FIGURA 1: Diagrama en bloques del sistema de filtrado implementado en la FPGA
FIGURA 2: Diagrama de entradas y salidas de la arquitectura filterFir
FIGURA 3: Diagrama en bloques del controlador de la RAM
FIGURA 4: Diagrama en bloques de la UART
FPGA: Descripción de las arquitecturas
El proyecto está compuesto de tres bloques de comportamiento que son: uart,
ram_controler y tres instancias de filterFir, los cuales están comandados y se relacionan entre
sí a través de la cpu. Todas las arquitecturas mencionadas son instanciadas en el archivo de
vhdl Top_board_TP_FINAL.vhd, en donde también son definidos cuáles de los switches y
pulsadores de la placa experimental serán utilizados para controlar la comunicación y el
filtrado de las señales. Todos los archivos cuyo nombre comience con “Simul”, son archivos
de simulación, utilizados para la prueba de los archivos de proceso.
UART:
Consta de tres bloques básicos:
timing: setea las bases de tiempo para la correcta sincronización entre la PC y
la FPGA, dada la velocidad de transmisión, que en nuestro proyecto se ha impuesto a
115,2Kbps. Un parámetro importante a definir ha sido la variable Divisor, la cual se calcula
fCLOCK
50MHz

 27 y define la base de tiempos de la transmisión.
16. fTRANSMISION 16.115200bps
receive: controla la recepción de bits serie, para devolver NDBits-1 en
paralelo, a través de una programación secuencial.
transmit: controla la transmisión de NDBits-1 bits en paralelo, para devolver
bits en serie, a través de una programación secuencial.
Luego se controlan estos tres bloques con un cuarto bloque llamado uart, el cual sólo
los instancia. Un quinto bloque llamado uart_comps, declara los tres componentes.
RAM_CONTROLER:
Es un único bloque que, mediante una programación secuencial, controla el flujo de
datos entre la FPGA y la RAM externa, a través de señales que son seteadas desde la cpu. El
principal objetivo es controlar el puerto input-output que es triestado, según si se encuentra
en modo lectura o escritura. La memoria es asincrónica, debido a que la lectura y escritura de
la misma se realiza con señales de esta naturaleza.
FILTERFIR:
Es un bloque de comportamiento secuencial, en donde recibe las 60 muestras de señal
a filtrar y las guarda en una memoria RAM circular de doble acceso (escritura y lectura
simultánea). Con dichas muestras realiza las multiplicaciones sucesivas con las muestras
correspondientes al filtro, y su resultado lo suma con la acumulación de las multiplicaciones
anteriores. De esta manera se implementa la definición de convolución de ambas señales, con
un tiempo de desplazamiento de los vectores que conforman los multiplicadores de un ciclo
de reloj de 50MHz de frecuencia. El retardo del filtro, es decir el tiempo que demora el filtro
en procesar una muestra de la señal de entrada, se obtiene de la siguiente manera:
longitud del buffer
60
1
 4.ciclos de reloj=
 4.
 1, 28 s
f clock
50MHz
50MHz
Los cuatro ciclos de clock son los necesarios para acondicionar la señal en el filtro.
Este tiempo es óptimo, pues se desea que sea superior a la frecuencia de muestreo que es de
30KHz.
Por último el resultado se coloca en un buffer de salida. El comportamiento es
esquematizado en la figura 5. Se utiliza la memoria RAM circular para ser direccionada a
través de dos punteros, uno para lectura y otro para escritura, desplazados en una posición de
memoria para escribir donde se ha leído y de esta manera optimizar el tiempo de
procesamiento.
FIGURA 5: Esquema de comportamiento del filtro adaptado
CPU:
La CPU es una máquina de estados que controla cada uno de los bloques
componentes: uart, ram_controler y los tres filterFir. El proceso que se realiza está ilustrado
en el diagrama de flujo de la siguiente página. Todo está comandado por los switches y
pulsadores que se encuentran en la plaza experimental. Es importante mantener el orden de
cada uno de los pasos, como puede verse en el diagrama de flujo, para lograr los resultados
correctos.
FPGA: Diagrama de flujo de la CPU
Matlab: Red de Kohonen
Se implementó una red de Kohonen para obtener los filtros mediante template
matching utilizando los pesos de las neuronas. La red es unidimensional y las entradas son
60, pues ese es el largo del vector de muestras que representan a cada spike. Se utilizó en el
algoritmo el doble de neuronas (6) que de spikes que se desean detectar, pues cada electrodo
sensa el comportamiento de aproximadamente esa cantidad de neuronas físicas. La constante
de aprendizaje para la corrección de los w es de   1 . La función de vecindad utilizada es de
la forma:
e

 r  r *2
2 2
Donde r * es el vector correspondiente a la neurona ganadora, que es la cual su peso
es el más cercano a la entrada presentada a la red en esa iteración. La manera de variar el
valor de  de tal forma que converja la vecindad hacia sólo la neurona ganadora en las
últimas iteraciones, de 2000 que se realizan en total, fue asignarle el siguiente valor:
num _ it
2000
sigma _ cte
con
sigma _ cte 

 10

sigma _ partition 200
aux
Incrementando el valor de la variable aux cada sigma _ partition iteraciones. Luego
cuando se cumple que   1 , se aplica el siguiente cambio de sigma para cada una de las
iteraciones:
1

log(aux  sigma _ cte  10)
La función recibe tres parámetros:
W = Kohonen_Learning(Sample,w_orig,N);
Donde Sample son vectores de las muestras de la señal que se desea aprender, w_orig
son los pesos de las neuronas iniciales antes de comenzar el algoritmo y N es la cantidad de
neuronas. La función devuelve W que son los pesos de las neuronas, cuyos valores luego se
utilizarán en los filtros.
Matlab: Código de la red de Kohonen
function W = Kohonen_Learning(Sample,w_orig,N);
% Sample deben ser tantos vectores columna como cantidad de señales se
% desea aprender
% Las filas de w_orig son cada uno de los vectores pesos aleatorios para
% cada neurona
% N es la cantidad de neuronas
num_it = 2000;
Eta = 1;
num_ent = size(Sample,1);
num_signals = size(Sample,2);
w = w_orig; % valores iniciales de los pesos de las neuronas
ind = [1:N]';
sigma = 10;
sigma_partion = 200; % en intervalos de sigma_partion se cambiara el valor de Sigma
sigma_cte = num_it/sigma_partion;
aux = 2; % variable que se incrementara cada cierta cantidad de iteraciones
distanc = zeros(N,1);
for i = 1:num_it
for k = 1:num_signals
for j = 1:num_ent
distanc = distanc + (w(:,j)-Sample(j,k)).^2;
end
distanc = sqrt(distanc);
[min_distancance,winer_neuron] = min(distanc);
if mod((i-1),sigma_partion)==0
sigma = sigma_cte/aux;
aux = aux+1;
end
if sigma<=1
sigma = 1/log10(aux-sigma_cte+10);
aux = aux + 3;
end
vec_function = exp(-((ind-winer_neuron).^2)/(2*sigma^2));
for m = 1:num_ent
delta_w(:,m) = Eta*vec_function.*(Sample(m,k)-w(:,m));
end
w = w + delta_w;
end
end
W = w;
return
Matlab: Instrucciones de uso del aplicativo
Se deberá ejecutar el archivo tpFinal.m en Matlab versión R2009B para que se haga
visible la interfaz que se muestra en la figura 6. Desde allí se podrá, tanto para un vector de
muestras de una señal neuronal o para una señal de prueba compuesta de tres patrones de
60 muestras con distintas formas y sin ruido añadido:








Procesar la señal por una red de Kohonen para obtener los filtros mediante el
método de template matching. Ellos podrán ser observados en la interfaz para
elegir luego los que se consideren más representativos.
Enviar a la memoria de la placa experimental la señal
Enviar a la memoria interna de la FPGA los filtros
Enviar a la memoria interna de la FPGA los umbrales de detección para ser
utilizados por las arquitecturas implementadas.
Reenviar desde la FPGA la señal original almacenada en la memoria de la placa
experimental para verificar el correcto funcionamiento de la comunicación.
Enviar desde la FPGA hacia la PC la señal filtrada por cierto filtro, pudiendo
elegir uno por vez.
Enviar una secuencia de números compuesto por la ocurrencia del spike
detectado según cada filtro preseleccionado. Ej: 1-2-1-3-2. La secuencia
detectada será:
o 1º spike correpondiente al 1º filtro seleccionado
o 2º spike correpondiente al 2º filtro seleccionado
o 3º spike correpondiente al 1º filtro seleccionado
o 4º spike correpondiente al 3º filtro seleccionado
o 5º spike correpondiente al 2º filtro seleccionado
Realizar el mismo procesamiento que se realizó con la FPGA mediante Matlab.
FIGURA 6: Interfaz de Matlab para control de comunicación y procesamiento
El esquema de la placa experimental se presenta en la figura 7. Allí pueden verse los
pulsadores y switches para comandar la comunicación y filtrado de las señales.
FIGURA 7: Esquema de la disposición de los componentes de la placa experimental
En la figura 8 se detallan los nombres utilizados para cada uno de los pulsadores y los
switches.
FIGURA 8: Esquema de disposición de los pulsadores y switches de la placa experimental
Los pasos a seguir para el correcto filtrado de la señal son:
1. Cargar la señal pulsando el botón correspondiente, ya sea de la señal de prueba
o de la neuronal. Sobre esta última se pueden seleccionar la cantidad de
muestras a analizar, las cuales se deben colocar en el rectángulo blanco que se
encuentra debajo del botón “Cargar señal neuronal”. Cuando finaliza este
proceso se muestra una figura con la señal cargada. En la figura 9 se presenta
un ejemplo de la señal de prueba.
FIGURA 9: Señal de prueba compuesta por tres patrones que se suceden de manera aleatoria
2. Procesar la señal presionando el botón correspondiente. Se obtendrán de esta
manera los pesos de la red neuronal, los cuales conforman los filtros que se
muestran en pantalla.
FIGURA 10: Resultado del procesado de la señal neuronal
3. A continuación se seleccionan los tres filtros más representativos, para el
posterior envío y uso en la FPGA.
4. En primera instancia se deberá resetear la FPGA presionando el pulsador L14.
5. A partir de este paso se comienzan a enviar las herramientas necesarias para el
filtrado. Se debe preparar la FPGA para la recepción de la señal colocando
todos los switches en posición baja (la que se muestra en la figura 8) y
presionando luego el pulsador L13. Para comenzar la transmisión se coloca la
opción en el aplicativo de Matlab “Señal” y se presiona “Enviar”.
6. La recepción finaliza cuando los leds de la placa experimental terminan de
parpadear, y para colocar a la FPGA nuevamente en reposo se deberá
presionar el pulsador M14.
7. Para enviar los filtros se repiten los pasos 5 y 6 pero se deberá seleccionar en
el aplicativo la opción “Filtros” y todos switches en posición baja con
excepción del F12.
8. Para enviar los umbrales, los cuales se pueden ver en la parte inferior derecha
de la ventana, se deberán repetir los pasos 5 y 6 pero seleccionando la opción
“Umbrales” y todos los switches en bajo con excepción del G12. Se ilustra en
la figura 11.
9. A partir de ahora se podrá filtrar la señal y enviar los resultados a la PC, pero
también es posible enviar la señal original para verificar la correcta
comunicación. Para ello se debe preparar para la recepción a la PC
seleccionando “Señal original” y presionando “Recibir”. Luego se colocan
todos los switches en bajo y se presiona el pulsador M13.
10. Para enviar a la PC las señales filtradas, se deberá aplicar a cada uno por vez.
Primero se debe preparar a la PC para la recepción colocando la opción “Señal
filtrada” y según por qué filtro se desee procesar se pondrá en alto el Switch
correspondiente:
a. Primer filtro: K13 en alto
b. Segundo filtro: K14 en alto
c. Tercer filtro: J13 en alto
11. Una vez seleccionado el filtro se presionará el pulsador M13. Finalizado el
envío se representará en la pantalla el resultado, como puede verse en la figura
12.
FIGURA 11: Envío de umbrales hacia la FPGA
FIGURA 12: Señal de prueba filtrada por los tres filtros
12. Se puede enviar también desde la FPGA la secuencia de spikes detectados en
el fragmento de señal analizado. Se puede seleccionar la cantidad de datos a
recibir colocando la cantidad en el cuadrado blanco del extremo inferior
derecho, como se ilustra en la figura 13. En la figura 14 se presenta un ejemplo
de secuencia detectada, los resultados serán siempre 1,2 o 3.
FIGURA 13: Selección de la cantidad de datos a enviar a la PC
FIGURA 14: Secuencia de spikes detectados enviados a la PC
13. Por último se pueden comparar los resultados obtenidos con el procesamiento
equivalente realizado por Matlab presionando el botón “Procesar con Matlab”.
Descargar