<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://airwiki.deib.polimi.it/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=AndreaSgarlata</id>
		<title>AIRWiki - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://airwiki.deib.polimi.it/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=AndreaSgarlata"/>
		<link rel="alternate" type="text/html" href="https://airwiki.deib.polimi.it/index.php/Special:Contributions/AndreaSgarlata"/>
		<updated>2026-04-19T16:00:36Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.25.6</generator>

	<entry>
		<id>https://airwiki.deib.polimi.it/index.php?title=IIT-Lab&amp;diff=4716</id>
		<title>IIT-Lab</title>
		<link rel="alternate" type="text/html" href="https://airwiki.deib.polimi.it/index.php?title=IIT-Lab&amp;diff=4716"/>
				<updated>2008-11-06T08:24:10Z</updated>
		
		<summary type="html">&lt;p&gt;AndreaSgarlata: /* Booking */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== What is the IIT-Lab ==&lt;br /&gt;
&lt;br /&gt;
AIRLab-IITLab is dedicated to activities founded by the Italian Institute of Technology. &lt;br /&gt;
The lab hosts activities related to Brain-Computer Interfaces (BCI) and Affective Computing.&lt;br /&gt;
&lt;br /&gt;
=== Location ===&lt;br /&gt;
It is located in the Rimembranze di Lambrate building of the Department of Electronics and Information, Via Rimembranze di Lambrate, 14, Milan. &lt;br /&gt;
&lt;br /&gt;
=== Access Rules ===&lt;br /&gt;
The access to AIRLab-IITLab is reserved to registered users. If you are student and want to register, you have to fill the AIRLab registration form (to be signed by your tutor) and the security form. The key of the lab is provided to registered users by the doorkeeper at the main entrance of the Lambrate building. &lt;br /&gt;
&lt;br /&gt;
=== Booking ===&lt;br /&gt;
&lt;br /&gt;
Please book the instrument you want to use by adding an entry to the table; the booking of an instrument implies the booking of the room.  If you want to use a different instrument at the same time of an existing booking, please contact the other person involved and check that you can share the room; alternatively, you can ask the doorkeeper for an empty room in the building.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Please keep the table lines ordered by time (nearest bookings first); add new entries like this:&lt;br /&gt;
---CUT---&lt;br /&gt;
| Monday 13 March || 11:00-18:00 || [[User:DonaldDuck]] || ProComp&lt;br /&gt;
|- &lt;br /&gt;
| Friday 15 April || 9:30-13:00 || [[User:MickeyMouse]] || EEG&lt;br /&gt;
|- &lt;br /&gt;
---CUT---&lt;br /&gt;
Use abbreviations, if you like.&lt;br /&gt;
Please remove old entries.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Day !! Time !! Person !! Instrument&lt;br /&gt;
|-&lt;br /&gt;
| Wednesday 5  November || 15:00-18:00 || [[User:CristianoAlessandro]] || ProComp&lt;br /&gt;
|-&lt;br /&gt;
| Thursday 6  November || 15:00-18:00 || [[User:TizianoDalbis]] || EEG&lt;br /&gt;
|-&lt;br /&gt;
| Monday 10 November || 10:00-18:00 || [[User:AndreaSgarlata]]  || EEG&lt;br /&gt;
|-&lt;br /&gt;
| Thursday 13 November || 10:00-15:00 || [[User:AndreaSgarlata]] || EEG&lt;br /&gt;
|-&lt;br /&gt;
| Thursday 13 November || 15:00-18:00 || [[User:TizianoDalbis]] || EEG&lt;br /&gt;
|-&lt;br /&gt;
| Thursday 20 November || 15:00-18:00 || [[User:TizianoDalbis]] || EEG&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* [[Brain-Computer Interface]] page on this Wiki&lt;br /&gt;
* [[Affective Computing]] page on this Wiki&lt;br /&gt;
* [http://www.airlab.elet.polimi.it/index.php/airlab/visitor_info/airlab_iitlab AIRLab - IITLab]&lt;/div&gt;</summary>
		<author><name>AndreaSgarlata</name></author>	</entry>

	<entry>
		<id>https://airwiki.deib.polimi.it/index.php?title=IIT-Lab&amp;diff=4715</id>
		<title>IIT-Lab</title>
		<link rel="alternate" type="text/html" href="https://airwiki.deib.polimi.it/index.php?title=IIT-Lab&amp;diff=4715"/>
				<updated>2008-11-06T08:22:57Z</updated>
		
		<summary type="html">&lt;p&gt;AndreaSgarlata: /* Booking */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== What is the IIT-Lab ==&lt;br /&gt;
&lt;br /&gt;
AIRLab-IITLab is dedicated to activities founded by the Italian Institute of Technology. &lt;br /&gt;
The lab hosts activities related to Brain-Computer Interfaces (BCI) and Affective Computing.&lt;br /&gt;
&lt;br /&gt;
=== Location ===&lt;br /&gt;
It is located in the Rimembranze di Lambrate building of the Department of Electronics and Information, Via Rimembranze di Lambrate, 14, Milan. &lt;br /&gt;
&lt;br /&gt;
=== Access Rules ===&lt;br /&gt;
The access to AIRLab-IITLab is reserved to registered users. If you are student and want to register, you have to fill the AIRLab registration form (to be signed by your tutor) and the security form. The key of the lab is provided to registered users by the doorkeeper at the main entrance of the Lambrate building. &lt;br /&gt;
&lt;br /&gt;
=== Booking ===&lt;br /&gt;
&lt;br /&gt;
Please book the instrument you want to use by adding an entry to the table; the booking of an instrument implies the booking of the room.  If you want to use a different instrument at the same time of an existing booking, please contact the other person involved and check that you can share the room; alternatively, you can ask the doorkeeper for an empty room in the building.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Please keep the table lines ordered by time (nearest bookings first); add new entries like this:&lt;br /&gt;
---CUT---&lt;br /&gt;
| Monday 13 March || 11:00-18:00 || [[User:DonaldDuck]] || ProComp&lt;br /&gt;
|- &lt;br /&gt;
| Friday 15 April || 9:30-13:00 || [[User:MickeyMouse]] || EEG&lt;br /&gt;
|- &lt;br /&gt;
---CUT---&lt;br /&gt;
Use abbreviations, if you like.&lt;br /&gt;
Please remove old entries.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Day !! Time !! Person !! Instrument&lt;br /&gt;
|-&lt;br /&gt;
| Wednesday 5  November || 15:00-18:00 || [[User:CristianoAlessandro]] || ProComp&lt;br /&gt;
|-&lt;br /&gt;
| Thursday 6  November || 15:00-18:00 || [[User:TizianoDalbis]] || EEG&lt;br /&gt;
|-&lt;br /&gt;
| Monday 10 November || 10:00-18:00 || [[User:AndreaSgarlata]]  || EEG&lt;br /&gt;
|-&lt;br /&gt;
| Thursday 13 November || 15:00-18:00 || [[User:TizianoDalbis]] || EEG&lt;br /&gt;
|-&lt;br /&gt;
| Thursday 20 November || 15:00-18:00 || [[User:TizianoDalbis]] || EEG&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* [[Brain-Computer Interface]] page on this Wiki&lt;br /&gt;
* [[Affective Computing]] page on this Wiki&lt;br /&gt;
* [http://www.airlab.elet.polimi.it/index.php/airlab/visitor_info/airlab_iitlab AIRLab - IITLab]&lt;/div&gt;</summary>
		<author><name>AndreaSgarlata</name></author>	</entry>

	<entry>
		<id>https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=3963</id>
		<title>Talk:Online P300 and ErrP recognition with BCI2000</title>
		<link rel="alternate" type="text/html" href="https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=3963"/>
				<updated>2008-09-17T09:44:35Z</updated>
		
		<summary type="html">&lt;p&gt;AndreaSgarlata: /* Addestramento */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Plugin Galileo/Modulo sorgente BCI2000==&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo Plugin: sgarlata/Plugin&lt;br /&gt;
&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo sorgente BCI2000: sgarlata/GalileoSource&lt;br /&gt;
&lt;br /&gt;
Il sistema attualmente è composto da un plugin che si occupa di inviare i dati tramite pipe ad un altro modulo che fa parte dell'intero sistema di BCI2000.&lt;br /&gt;
&lt;br /&gt;
Per ottenere una corretta temporizzazione del sistema di BCI2000 abbiamo sfruttato il fatto che il plugin è più lento nell'invio dei dati rispetto all'intero sistema BCI2000.&lt;br /&gt;
Infatti si è deciso di inviare tramite plugin una quantità di dati costante pari a 1/16 di secondo, tenendo conto del fatto che durante l'esecuzione di una registrazione online la quantità di dati ricevuti dal plugin risulta molto regolare e costante.&lt;br /&gt;
In questo modo ogni invio di dati tramite pipe rappresenta il trascorrere di un tempo prefissato che risulta pari a 1/16 di secondo.&lt;br /&gt;
&lt;br /&gt;
Sono stati effettuati diversi test (aggiunta di un buffer di accumulo, invio di blocchi di dimensione maggiore 0.1 secondi) per cercare di mantenere il più possibile costante l'intervallo che trascorre tra l'invio di un blocco dati e quello successivo, nonostante questi tentativi abbiamo riscontrato il fatto che l'intervallo tra due blocchi risulta in media molto regolare, questa regolarità viene persa però nei momenti in cui il sistema viene perturbato da fattori esterni dovuti all'intervento dell'utente, quali ad esempio: apertura nuova finestra, spostamento finestre, apertura cartelle ecc...&lt;br /&gt;
Tutti questi fattori possono essere trascurati, in quanto durante l'esecuzione dell'intero sistema l'utente non deve interagire direttamente con il sistema, ma deve solamente essere sottoposto a delle stimolazioni, e se l'utente decide di interagire è perché sta effettuando modifiche ed in quel momento non necessita di un sistema sincrono e regolare.&lt;br /&gt;
:Noi speriamo che non capiti durante il funzionamento normale o sia molto raro ([[User:BernardoDalSeno|BernardoDalSeno]] 20:21, 24 May 2008 (CEST))&lt;br /&gt;
&lt;br /&gt;
Per tutte queste motivazioni si è deciso che il plugin non appena accumulato un blocco dati pari a 1/16 di secondo deve subito inviarlo tramite pipe, in modo da mantenere una regolarità tra l'invio consecutivo di due blocchi.&lt;br /&gt;
&lt;br /&gt;
Nel sever Airbat sono presenti i sorgenti dei differenti plugin implementati con le differenti stategie di funzionamento:&lt;br /&gt;
&lt;br /&gt;
*Cartella sgarlata/old/PluginPipe: il plugin implementato consente un invio di dati in blocchi di 0.1secondi, consentendo al modulo sorgente di BCI2000 di occuparsi dell'invio di blocchi dati di dimensioni inferiori all'interno del sistema di BCI2000. Questa strategia è stata abbandonata perchè abbiamo notato che a 512Hz il plugin riceveva blocchi di 32 campioni per ogni chiamata, e doveva inviare blocchi di 51 campioni, questa differenza faceva si che l'invio di blocchi non era regolare in quanto ad esempio dopo due chiamate inviavo un blocco da 51 campioni e poi dovevo aspettare 3 chiamate per inviare un nuovo blocco dati.&lt;br /&gt;
&lt;br /&gt;
*Cartella sgarlata/old/PluginBuffer: il plugin implementato mantiene un buffer di N blocchi dati pari a 1/16 di secondo, ed inizia l'invio di un blocco dati nel momento in cui mezzo buffer è stato riempito, utilizzando come clock di invio l'orologio di invocazione del plugin, dato che in maniera molto regolare vi era un invocazione ogni 1/16 di secondo a 512Hz. La strategia dell'utilizzo del buffer è stata abbandonata in quanto, si introduceva ritardo con il buffer ed in oltre i problemi di perdita di regolarità si verificavano comunque perchè non erano dovuti a dei mancati invii di dati da parte del plugin,ma erano dovuti al fatto che il sistema veniva perturbato da un utente esterno ed il modulo sorgente di BCI2000 attendeva nella lettura di un nuovo blocco.&lt;br /&gt;
&lt;br /&gt;
*Cartella sgarlata/old/PluginTemporizzato: questo plugin utilizza un blocco dati pari a 1/16 di secondo, ma diversamente dal plugin finale manca della stampa di diversi valori di debug e della possibilità di connessione con il sistema di BCI2000 non sincrona.&lt;br /&gt;
&lt;br /&gt;
Le diverse strategie di sviluppo del plugin sono state studiate ed implementate per poter utilizzare un applicativo di stimolazione che rimanesse sincrono con l'intero sistema e quindi che avesse la possibilità di essere implementato da un modulo applicativo di BCI2000.&lt;br /&gt;
Uno stimolatore sincrono è un vantaggio in quanto consente di farlo evolvere durante l'acquisizione dei segnali e di effettuare diverse scelte sulla base di questi e dei risultati fin ora ottenuti.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Per quanto riguarda il modulo sorgente di BCI2000 questo si occupa di leggere dalla pipe: il numero di canali, il numero di campioni per canale e la frequenza di campionamento. Una volta letti questi valori controlla che l'utente abbia inserito tra i parametri gli stessi valori letti tramite pipe, se questo non avviene blocca l'intero sistema e comunica l'errore all'utente con i valori esatti da inserire. Questa procedura viene ripetuta finché l'utente non inserisce gli stessi parametri letti dal modulo source.  Si è visto che invece non si riesce a passare i parametri dal modulo sorgente agli altri moduli di BCI2000 durante la fase di inizializzazione.&lt;br /&gt;
&lt;br /&gt;
A run time il modulo source si occupa di leggere dalla pipe una blocco di dati e di inviarlo al modulo successivo (modulo filtro); ogni blocco viene inoltrato non appena è disponibile.&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
* (alta) Misurare il numero di campioni per chiamata a varie frequenze.&lt;br /&gt;
* (alta) Fare in modo che non vengano segnalati gli errori di pipe piena relativi a quando non si sta registrando. Suggerimento: far mandare dal modulo sorgente sulla pipe ogni cambiamento di stato (registro/non registro); il plugin quindi aggiornerà lo stato internamento e lo userà per segnalare solo gli errori rilevanti.&lt;br /&gt;
* (alta) Fare in modo che '''trigger.txt''' e '''triggerData.txt''' vengano scritti solo se sia definita una costante specifica per quello (non quella generica di debug); non definire la costante.&lt;br /&gt;
* (media) Script per il confronto tra dati registrati da BCI2000 e da Galileo; si lancia passandogli il nome dei due file e una soglia, e restituisce un valore binario per dire se sono uguali (all'interno della soglia) oppure no; eventualmente disegna qualche grafico.&lt;br /&gt;
&lt;br /&gt;
=== Fatto ===&lt;br /&gt;
&lt;br /&gt;
* Eliminare la finestra del plugin, e salvare eventuali tempi (istanti) di perdite di dati (pipe piena) su file e alla fine della registrazione avvisare l'utente se ci sono state perdite. Il file verrà cancellato se non contiene errori. Nessun file di log va sovrascritto.	 &lt;br /&gt;
:Per come è fatto il sistema, è inevitabile che la pipe si riempia prima dell'inizio della registrazione vera e propria. Questo periodo non va segnalato né salvato su file (andrà ideato un opportuno sistema per identificarlo).&lt;br /&gt;
&lt;br /&gt;
==Modulo di elaborazione del segnale BCI2000==&lt;br /&gt;
&lt;br /&gt;
Attualmente la catena di filtri del modulo di BCI2000 è suddivisa nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)un filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)un filtro di Trigger che si occupa di rilevare gli inizi delle stimolazioni tramite l'analisi del segnale proveniente dal fototransistor&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa di accumulare più forme d'onda p300 relative alla stessa stimolazione e tra queste farne la media&lt;br /&gt;
&lt;br /&gt;
4)un filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
Si vuole modificare sia la sequenza di filtri che il funzionamento di alcuni di questi nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
#filtro spaziale&lt;br /&gt;
#filtro di Trigger che determina in maniera automatica, tramite una fase iniziale dettata dal modulo applicativo, il valore di soglia per distinguere gli istanti di tempo in cui il riquadro è nero oppure bianco.&lt;br /&gt;
#*PARAMETRI DEFINITI: &lt;br /&gt;
#**WindowSize = definisce la dimensione della finestra mobile utilizzata per filtrare il segnale&lt;br /&gt;
#**TriggerChannel = definisce il numero del segnale sul quale identificare i trigger&lt;br /&gt;
#*STATI DEFINITI:&lt;br /&gt;
#**TriggerFound = posto a 1 se il filtro identifica nel blocco analizzato l'inizio di una stimolazione&lt;br /&gt;
#**TriggerIndex = se TriggerFound è posto a 1, questo stato contiene indice del campione nel blocco analizzato che ha determinato l'inizio dello stimolo.&lt;br /&gt;
#**Riferimento su Airbat del sorgente filtro Trigger: sgarlata/P3ErrPSignalProcessingGalileo/TriggerFilterAutoThreshold&lt;br /&gt;
#filtro butterworth passa banda con banda passante definibile tramite l'impostazione di appositi parametri (default banda passante 5Hz-10Hz, dato che i potenziali evocati hanno un andamento lento nel tempo). L'output di questo filtro è utilizzato in fase di riconoscimento dell'ErrP.&lt;br /&gt;
#*PARAMETRI DEFINITI: &lt;br /&gt;
#**ButterworthBPLowCorner = definisce il valore di banda passante minimo&lt;br /&gt;
#**ButterworthBPHighCorner = definisce il valore di banda passante massimo&lt;br /&gt;
#**Riferimento su Airbat del sorgente filtro ButterworthBP: sgarlata/P3ErrPSignalProcessingGalileo/ButterworthBP&lt;br /&gt;
#un filtro che si occupa solamente di accumulare le forme d'onda con un ring buffer che memorizza una porzione di segnale precedente.&lt;br /&gt;
#*PARAMETRI DEFINITI:&lt;br /&gt;
#**EpochLength = lunghezza in secondi dell'epoca da accumulare&lt;br /&gt;
#**LengthBeforeStimulus = lunghezza in secondi della porzione di segnale da accumulare prima dell'inizio di una stimolazione&lt;br /&gt;
#**VisualizeCollectorFiltering = se settato questo parametro consente di visualizzare l'intera epoca accumulata&lt;br /&gt;
#*STATI DEFINITI:&lt;br /&gt;
#**StimulusCodeDone = il codice dello stimolo la cui relativa epoca è stata interamente accumulata&lt;br /&gt;
#**StimulusTypeDone = il tipo relativo all'epoca appena accumulata&lt;br /&gt;
#*Riferimento su Airbat del sorgente filtro Collector: sgarlata/P3ErrPSignalProcessingGalileo/CollectorFilterGALILEO&lt;br /&gt;
#filtro di classificazione per P300 ed ErrP.&lt;br /&gt;
Per la classificazione P300 attualmente è implementato il classificatore lineare &amp;quot;Logistic&amp;quot;, mentre per la classificazione ErrP è implementato un classificatore LDA.&lt;br /&gt;
#*PARAMETRI DEFINITI:&lt;br /&gt;
#**ClassifierFunction = identifica la funzione di classificazione P300 da utilizzare (attualmente è solamente implementato il classificatore Logistic)&lt;br /&gt;
#**P3WeightMatrix = matrice in cui ogni colonna indica un canale e il numero di righe è pari al numero di campioni dell'epoca in ingresso aumentato di 1 . La prima riga di ogni colonna indica il canale sul quale applicare i pesi definiti nelle righe successive.&lt;br /&gt;
#**P3Constant = costante utilizzata dal classificatore P300 Logistic&lt;br /&gt;
#**ErrPSamplesIndex = matrice in cui per ogni riga è indicato nella prima colonna il canale segiuto dall'indice dei campioni da prelevare dal segnale d'ingresso&lt;br /&gt;
#**ErrpClassifS, ErrpClassifMm, ErrpClassifMsT, ErrpClassifC = matrici utilizzate dal classificatore ErrP&lt;br /&gt;
#*STATI DEFINITI:&lt;br /&gt;
#**ErrPFound = questo stato è posto a 0 durante il calcolo dell'ErrP, terminato il calcolo se viene identificato un ErrP questo stato è posto a 1 altrimenti è posto a 2.&lt;br /&gt;
#*Riferimento su Airbat del sorgente filtro Collector: sgarlata/P3ErrPSignalProcessingGalileo/P3ErrPClassifier&lt;br /&gt;
#filtro che effettua la media dei valori in uscita dal filtro di classificazione&lt;br /&gt;
#*PARAMETRI DEFINITI:&lt;br /&gt;
#**EpochsToAverage = il numero di classificazioni da mediare&lt;br /&gt;
#*STATI DEFINITI:&lt;br /&gt;
#**StimulusCodeRes = il codice dello stimolo del quale è stata calcolata la media di &amp;quot;EpochsToAverage&amp;quot; stimolazioni&lt;br /&gt;
#**StimulusTypeRes = il tipo relativo allo StimulusCodeRes appena determinato&lt;br /&gt;
#*Riferimento su Airbat del sorgente filtro Media: sgarlata/P3ErrPSignalProcessingGalileo/MeanFilter&lt;br /&gt;
#un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
===Da Fare===&lt;br /&gt;
&lt;br /&gt;
* (alta) Cambiare i nomi dei parametri del classificatore ErrP; esempio: &amp;quot;S&amp;quot; diventa &amp;quot;ErrpClassifS&amp;quot;.&lt;br /&gt;
* (bassa) Fare un filtro FIR (c'è già una classe nel sorgente BCI2000) da usare in alternativa al filtro Butterworth.  Il filtro prende come parametri il vettore di pesi.  L'idea è che si genera il filtro durante l'addestramento in Matlab, e viene usato anche online.  Il problema del Butterworth è che ha una fase non lineare e quindi deforma la forma d'onda.&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
*Filtro che rileva i trigger&lt;br /&gt;
*Adattamento automatico della soglia per i trigger (Analisi switch riquadro: Bianco-&amp;gt;Nero-&amp;gt;Bianco per un tempo definito dall'utente)&lt;br /&gt;
*Accumulare forme d'onda con parti che precedono il trigger&lt;br /&gt;
*Script Matlab per verificare l'accuratezza della rilevazione dei fronti d'onda.&lt;br /&gt;
*Elencare stati e parametri usati dai filtri, e documentare quelli nuovi.&lt;br /&gt;
*Il classificatore per P300 usi questa formula:&lt;br /&gt;
  &amp;lt;math&amp;gt;L_{\rm P300} = \frac{1}{1 + exp( c + \sum_i w_i x_i )}&amp;lt;/math&amp;gt;&lt;br /&gt;
dove &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; sono i campioni EEG di tutti i canali, mentre ''c'' e &amp;lt;math&amp;gt;w_i&amp;lt;/math&amp;gt; sono dei pesi oppurtuni.&lt;br /&gt;
I &amp;lt;math&amp;gt;w_i&amp;lt;/math&amp;gt; saranno organizzati in una matrice bidimensionale, in cui ogni riga contiene: il numero del canale, seguito da tutti i pesi per quel canale.  Poi con un ulteriore parametro si potrà selezionare una funzione alternativa alla logistica.&lt;br /&gt;
&lt;br /&gt;
==Modulo applicativo speller P300==&lt;br /&gt;
&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo Applicativo: sgarlata/P3Speller&lt;br /&gt;
&lt;br /&gt;
Il modulo applicativo deve essere adattato al sistema di trigger.&lt;br /&gt;
&lt;br /&gt;
Per quanto riguarda il modulo applicativo bisogna introdurre un riquadro posto nell'angolo superiore destro dello schermo e farlo variare (bianco/nero) ogni qual volta viene effettuata una stimolazione e, prima dell'inizio della sequenza di stimolazioni, introdurre una fase preliminare in cui si fa variare (bianco/nero) il riquadro per un tempo totale preimpostato in modo da poter far determinare in maniera automatica dal filtro di Trigger il valore di soglia che permette di distinguere se siamo in fase di stimolazione (riquadro nero) o in fase di non stimolazione (riquadro bianco).&lt;br /&gt;
Terminata la fase di taratura del valore di soglia, lo speller può effettuare la sua sequenza di stimolazioni.&lt;br /&gt;
Alla fine di ogni treno di stimolazioni lo speller P300 determina, in base alle classificazioni ricevute, qual'è la stimolazione con classificazione maggiore mostrandola a video. A questo punto inizia una nuova fase in cui viene controllata la presenza dell'ErrP, se è stato identificato una forma d'onda ErrP lo speller non effettua alcuna selezione (modalità &amp;quot;free mode&amp;quot;) altrimenti seleziona la stimolazione mostrata a video precedentemente, riprendendo con una nuova sequenza di stimolazioni.&lt;br /&gt;
&lt;br /&gt;
Per le modifiche da effettuare al modulo applicativo di BCI2000 quando questo deve comunicare tramite protocollo UDP con un altro applicativo che effettua le stimolazioni su una differente macchina Linux si è invitati a visionare la relativa discussione di Roberto Massimini.&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
* (alta) Misurare lo sfasamento tra sync e stimolo	 &lt;br /&gt;
* (media) Segnalare (e recuperare, se possibile) eventuali problemi con la sincronizzazione tra stimolazione e trigger. Alla fine di ogni treno di stimolazioni, verificare che il numero di trigger e di stimolazioni siano uguali. Gli stati devono fornire abbastanza informazioni perché si possa caricare da file una registrazione &amp;quot;rovinata&amp;quot; ignorando (tutto e solo) il treno di stimolazioni fuori sincronia.&lt;br /&gt;
:Scrivere un codice di test opportuno per forzare/simulare errori nella rilevazione del trigger (non riconoscimento di un trigger o riconoscimento di un trigger spurio).&lt;br /&gt;
* (bassa) Scrivere specifiche per comunicazione tra BCI2000 e un modulo applicativo P300 esterno che gira su una macchina Linux separata&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
* Modificare lo stato StimulusBegin anche per lo stimulo ErrP&lt;br /&gt;
* Verifica del sistema per associare la stimolazione ai trigger rilevati dall'apposito filtro&lt;br /&gt;
&lt;br /&gt;
==Integrazione con ErrP==&lt;br /&gt;
&lt;br /&gt;
Il sistema basato su BCI2000 che usa P300 va espanso per poter usar anche i potenziali d'errore&lt;br /&gt;
&lt;br /&gt;
Ciò che si vuole sviluppare è un sistema che si basi su una procedura di verifica automatica tramite l'integrazione del controllo anche sui potenziali d'errore.&lt;br /&gt;
La verifica dell'Errp non è effettuato tramite media di più forme d'onda così come avviene con le rilevazioni della P300, ma sulla singola prova.&lt;br /&gt;
Infatti, dopo l'analisi delle forme d'onda P300 e la determinazione del target voluto dall'utente, si introduce una ulteriore fase in cui si mostra all'utente la probabile selezione voluta e si valuta la presenza del potenziale d'errore. Se non viene riscontrata questa forma d'onda si seleziona il target precedentemente identificato, altrimenti si ripete una nuova sequenza di stimolazioni per identificare nuovamente il target voluto.&lt;br /&gt;
&lt;br /&gt;
Schema del comportamento del classificatore LDA di Gianmaria:&lt;br /&gt;
: c - ((x - media_tr) * scala_tr * medie_tr)&lt;br /&gt;
cioè&lt;br /&gt;
: y = c1 + x * matrice&lt;br /&gt;
e la classe è l'indice del valore minimo del vettore y (che è lungo 2)&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
*Introdurre una nova fase di controllo Errp nel modulo applicativo dello speller&lt;br /&gt;
*Introdurre un nuovo filtro nella catena dei filtri che si occupa del'accumulo dei potenziali d'errore&lt;br /&gt;
*Modificare opportunamente i filtri di: classificazione, media e normalizzazione per supportare il controllo dell'Errp&lt;br /&gt;
*Fare uno script Matlab nuovo, derivato da quelli di Gianmaria, che faccia l'addestramento su dati salvati dallo speller BCI2000 in modalità &amp;quot;copy&amp;quot; e restituisca (su file) le tabelle per il classificatore pronte per essere caricate nel modulo di BCI2000.&lt;br /&gt;
:Questo viene meglio diviso in diversi script: 1. Uno script che carica un file BCI2000 in una struttura eeg_p300_data; meglio se accetta gli stessi parametri di load_eeg_data_dei.m 2. Uno script che prende una struttura eeg_p300_data, calcola l'intervallo ottimo, addestra il classificatore e salva le matrici per l'uso online. 3. Uno script che usa i 2 precedenti: carica i dati da un po' di file, li concatena, e addestra il classificatore ([[User:BernardoDalSeno|BernardoDalSeno]] 17:39, 9 July 2008 (CEST))&lt;br /&gt;
*Far funzionare lo speller in modalità &amp;quot;copy&amp;quot;: il testo viene specificato all'utente e la lettera giusta viene scelta dall'applicazione con una probabilità dell'80% (parametro), in modo da avere dati per l'addestramento sia della P300 che dell'ErrP.  Negli stati va salvata l'informazione su qual è la stimolazione che contiene una P300 (questo dovrebbe esserci già per la P300) e quale contiene un ErrP.&lt;br /&gt;
*Assicurarsi che l'attuale classificatore ErrP faccia esattamente le stesse cose di quello usato da Gianmaria (LDA sui dati grezzi).&lt;br /&gt;
*Nel filtro P3ErrPClassifier: ogni riga specifica più campioni per un solo canale; più righe possono riferirsi allo stesso canale.&lt;br /&gt;
&lt;br /&gt;
==Addestramento==&lt;br /&gt;
Il sistema per il corretto funzionamento on line richiede l'addestramento dei classificatori per il riconoscimento del potenziale P300 e del potenziale d'errore (ErrP).&lt;br /&gt;
L'intera sequenza di addestramento è divisa in 3 diverse 'sessioni'. Ogni 'sessione' corrisponde a una giornata, ed è suddivisa a sua volta in diversi 'run', dove per 'run' si intende un nuovo ciclo di esecuzione dell'applicativo(speller). Per ogni sessione deve essere creata una cartella con nome: 'Iniziale_nome_utenteCognomeNumero_sessione' (es. Andrea Sgarlata sessione 001: 'asgarlata001') contenente tutte le registrazioni (file .dat) effettuate nella stessa sessione.&lt;br /&gt;
In oltre per ogni sessione deve essere compilato un file di log (log-sessione.txt da inserire nella stessa cartella della sessione, template già precompilato nella cartella sgarlata/TestParam), con i dati dell'utente e per ogni 'run' il modo di funzionamente le impedenze registrate per ogni canale ed eventuali note per esempio livello di stanchezza e concentrazione dell'utente ecc...&lt;br /&gt;
Prima di iniziare l'addestramento bisogna spiegare all'utente cosa deve fare e come si deve comportare durante l'utilizzo del sistema.&lt;br /&gt;
La prima sessione è necessaria per l'addestramento del classificatore per il potenziale P300 ed ErrP; questa sessione è svolta in modalità copy ed è suddivisa in 10 run, i diversi run si differenziano per la parola mostrata nella barra 'textToSpell'. &lt;br /&gt;
Per una corretta impostazione dell'intero sistema in questa sessione, bisogna: &lt;br /&gt;
* avviare il sistema (Galileo + BCI2000)&lt;br /&gt;
* caricare il file Sgarlata/TestParam/P3ErrpSpeller-trainingSessione001.prm in BCI2000&lt;br /&gt;
* modificare nella scheda 'Storage' di BCI2000 il campo 'SubjectName' indicando 'Iniziale_nome_utenteCognome'&lt;br /&gt;
:: Assicuriamoci che non ci si possa dimenticare di fare quest'ultimo passo. 'DataDirectory' nel file parametri dovrebbe già contenere un percorso inesistente. Esiste un valore illegale per 'SubjectName'? e.g., vuoto, oppure con qualche carattere strano, oppure un nome troppo lungo...  ([[User:BernardoDalSeno|BernardoDalSeno]] 15:17, 11 September 2008 (CEST))&lt;br /&gt;
::Infatti ho modificato il file .prm in modo che metta il carattere '?' nel campo 'SubjectName' in modo che se l'utente non lo modifica BCI2000 da errore&lt;br /&gt;
* Chiudere la schermata di configurazione e cliccare sul pulsante 'Set Config' di BCI2000, in modo da permettere al sistema di creare la cartella 'Iniziale_nome_utenteCognomeNumero_sessione' che conterrà tutte le registrazioni effettuate in questa sessione.&lt;br /&gt;
* compilare il log di sessione.&lt;br /&gt;
&lt;br /&gt;
Impostato il sistema, tramite le operazioni appena elencate, non rimane che per ogni run caricare il file contenente la sola parola da inserire nella barra 'textToSpell' (file presenti nella cartella Sgarlata/TestParam/traning_words/Sessione001), quindi al primo run verrà caricato il file di parametri 'LearningRun01.prm', al secondo run il parametro 'LearningRun02.prm' e così via fin al completamento dei 10 run.&lt;br /&gt;
Terminata la prima sessione con i dati raccolti si procede all'addestramento del classificatore P300 tramite lo script run_ga_speller_dei.m (si veda l'help dello script per il funzionamento), questo script utilizza un'algoritmo genetico di conseguenza è consigliabile utilizzare come parametro di ingresso la creazione di almeno 10 generazioni. E' consigliabile utilizzare per l'addestramento i dati relativi ai primi 8 run, ed utilizzare gli ultimi 2 run (run 9, run 10) come dati ti test. Annotare comunque nel file di log quale insieme di dati è stato utilizzato per l'addestramento e quale per il test.&lt;br /&gt;
:Specifica quali run usare per addestramento e test ([[User:BernardoDalSeno|BernardoDalSeno]] 15:17, 11 September 2008 (CEST))&lt;br /&gt;
&lt;br /&gt;
Se non vi sono stati errori lo script genera un file di parametri che deve essere caricato nel sistema consentendo così l'addestramendo del classificatore P300 ed il passaggio alla seconda sessione.&lt;br /&gt;
&lt;br /&gt;
Nella seconda sessione si mantiene il sistema configurato come nella sessione precedente con la differenza che questa sessione è svolta in modalità copy ma con il classificatore P300 funzionante, di conseguenza il target visualizzato è quello selezionato dal classificatore P300. :Bisogna aggiustare il numero di ripetizioni per controllare gli errori, però ([[User:BernardoDalSeno|BernardoDalSeno]] 15:17, 11 September 2008 (CEST))&lt;br /&gt;
In questa sessione si deve:&lt;br /&gt;
* caricare in BCI2000 il file di parametri generato dallo script run_ga_speller_dei.m.&lt;br /&gt;
* caricare il file Sgarlata/TestParam/P3ErrpSpeller-trainingSessione002.prm in BCI2000&lt;br /&gt;
* Chiudere la schermata di configurazione e cliccare sul pulsante 'Set Config' di BCI2000.&lt;br /&gt;
* compilare il log di sessione.&lt;br /&gt;
&lt;br /&gt;
Effettuate queste modifiche si può ripartire nuovamente con il caricare in sequenza per ogni run solamente le ulteriori 10 parole (file: 'LearningRun#.prm') definite nella cartella 'Sgarlata/TestParam/traning_words/Sessione002', indicando, nel file di log, per ogni run il numero di lettere selezionate errate.&lt;br /&gt;
:Questa informazione è presente nel file di log che viene generato da BCI2000 (&amp;quot;*_summary.txt&amp;quot;)? Se no, possiamo aggiungerla? ([[User:BernardoDalSeno|BernardoDalSeno]] 15:17, 11 September 2008 (CEST))&lt;br /&gt;
:Userei altri 10 file per le parole, non vorrei far annoiare i soggetti. ([[User:BernardoDalSeno|BernardoDalSeno]] 15:17, 11 September 2008 (CEST))&lt;br /&gt;
Terminata la seconda sessione si può procedere all'addestramento del classificatore per il riconoscimento dei potenziali d'errore (ErrP). A questo scopo si utilizza uno script matlab che richiama la funzione 'train_errp_visconti_bci2000( params )' generando il file .prm con i parametri necessari al classificatore ErrP. Per l'addestramento dell'ErrP è consigliabile utilizzare tutti i dati registrati nelle primi due sessioni (001 e 002), suddividendo i primi 18 (10 run 001 e 8 run 002) run come dati di addestramento, e gli ultimi 2 run (19, 20) come dati di test. Annotare comunque nel file di log quale insieme di dati è stato utilizzato per l'addestramento e quale per il test. Se lo script non raggiunge una soglia di almeno 70% di recall sia per ErrP che non-ErrP bisogna procede alla registrazione di ulteriori run nella seconda sessione, oppure provare ad introdurre nuovi canali all'interno dei parametri passati e, contemporaneamente allargare la sezione temporale in cui individuare la forma d'onda ErrP. &lt;br /&gt;
:Specifica quali run usare per addestramento e test.  Fissiamo una soglia per decidere se possiamo utilizzare gli ErrP online: direi almeno il 70% di recall sia per ErrP che non-ErrP.  Hai ancora il foglio con indicato lo schema per l'addestramento? ricordo che avevo pensato di provare subito il classificatore ErrP con uno o due run di prova. ([[User:BernardoDalSeno|BernardoDalSeno]] 15:17, 11 September 2008 (CEST))&lt;br /&gt;
:L'insieme dei dati usati per l'addestramento va annotato. ([[User:BernardoDalSeno|BernardoDalSeno]] 03:31, 15 September 2008 (CEST))&lt;br /&gt;
&lt;br /&gt;
Se non vi sono stati errori lo script genera un file di parametri che può essere caricato per addestrare questa volta il classificatore ErrP. A questo punto è possibile passare alla terza sessione.&lt;br /&gt;
&lt;br /&gt;
Nella terza sessione si può effettuare una serie di run (un qualsiasi numero) in modalità free mode. &lt;br /&gt;
: Solo se il classificatore ErrP funziona bene, altrimenti questa è ancora una sessione di addestramento; per cui servono altre parole. ([[User:BernardoDalSeno|BernardoDalSeno]] 15:17, 11 September 2008 (CEST))&lt;br /&gt;
In questa sessione è necessario:&lt;br /&gt;
* caricare il file Sgarlata/TestParam/P3ErrpSpeller-FreeModeSession003.prm in BCI2000&lt;br /&gt;
* caricare in BCI2000 il file di parametri generato dallo script run_ga_speller_dei.m.&lt;br /&gt;
* caricare in BCI2000 il file di parametri generato dallo script train_errp_visconti_bci2000.m&lt;br /&gt;
* Chiudere la schermata di configurazione e cliccare sul pulsante 'Set Config' di BCI2000, in modo da permettere al sistema di creare la cartella 'Iniziale_nome_utenteCognomeNumero_sessione' che conterrà tutte le registrazioni effettuate in questa sessione.&lt;br /&gt;
* compilare il log di sessione.&lt;br /&gt;
&lt;br /&gt;
L'utente decide quale parola, lettera per lettera, vuole scrivere, e nel caso in cui il sistema scrive un carattere errato l'utente dovrà eliminarlo selezionando l'icona 'BS' che si occupa di cancellare l'ultima lettera inserita. La parola (o frase) che l'utente ha scelto va segnata sul file di log insieme a tutte le informazioni che si ritengono necessarie.&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
* (altissima) Scrivere una funzione definita tra in &amp;lt;math&amp;gt;[0,1]&amp;lt;/math&amp;gt; parametrica che valga: 1 in 0 e 1; &amp;lt;math&amp;gt;1-\epsilon&amp;lt;/math&amp;gt; in ''a'' e ''c'', 0 in ''b''. &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt; è un parametro.&lt;br /&gt;
* (alta) Fare un file di parametri per addestrare la gente per P300 e ErrP (modalità copy). &lt;br /&gt;
* (alta) Fare N (con N oppurtuno) file di parametri che contengano le parole da scrivere; considerare lunghezza oppurtuna per singole registrazioni e sessioni. Il file e il nome del file contenga già il numero di sessione e registrazione.&lt;br /&gt;
* (alta) Aggiustare il protocollo per gli esperimenti secondo i commenti.  Fare delle mini-procedure - come per la prima sessione - anche per i run delle sessioni successive.&lt;br /&gt;
* (media) Lo speller in modalità copy quando genera dei feedback sbagliati (per l'addestramento ErrP) deve selezionare effettivamente un simbolo sbagliato a caso tra tutti i simboli disponibili, e non usare il classificatore P300 per questo.&lt;br /&gt;
* (bassa) Far funzionare lo speller in modalità &amp;quot;mista&amp;quot;, cioè: la stringa da scrivere è assegnata; il classificatore P300 viene usato per selezionare le lettere; in caso di lettera sbagliata viene scritta la lettera selezionata, e il simbolo successivo da selezionare sarà BackSpace.  Perché questa cosa funzioni, il tasso di errori deve essere contenuto entro un certo intervallo, definito da 3 valori (''a'',''b'',''c'') in un opportuno parametro (si potrebbe riutilizzare il parametro attualmente usato per il tasso di errori nella stimolazione ErrP); operativamente:&lt;br /&gt;
# Selezionare una lettere con il classificatore P300&lt;br /&gt;
# Calcolare la statistica ''s'' delle selezioni correte sulle ultime N selezioni&lt;br /&gt;
# Si ricava una probabilità ''p'' a partire dall'entità della deviazione dall'intervallo ammesso, usando un'opportuna funzione che dipende da ''a'', ''b'', ''c'', ''s''.&lt;br /&gt;
# Con probabilità ''p'' modificare la selezione in questo modo:&lt;br /&gt;
#* Se ''s'' &amp;lt; ''b'', la selezione corrente viene corretta, se è sbagliata&lt;br /&gt;
#* Se ''s'' &amp;gt; ''b'', la selezione corrente viene fatta diventare sbagliate, se è corretta&lt;br /&gt;
:Il risultato dovrebbe essere che la statistica sia quasi sempre all'interno dell'intervallo ''a''-''c'', e che i valori fuori dall'intervallo non si allontanino troppo dai limiti fissati.&lt;br /&gt;
:Suggerimento: Per questa cosa, fare una classe (e usare un'istanza) in cui ci sia un metodo per aggiornare la statistica e uno per dire se bisogna fare correzioni all'ultima selezione.&lt;br /&gt;
* (bassissima) Fare esperimenti con almeno un paio di soggetto in cui lo speller funziona nella modalità &amp;quot;mista&amp;quot; di cui sopra.&lt;br /&gt;
:Per scegliere il numero di ripetizioni ottimo, bisogna valutare l'accuratezza del classificatore P300 con diversi numeri di ripetizioni (offline sui dati di test) e da questa, insieme all'accuratezza del classificatore ErrP, calcolare la velocità globale dell'interfaccia usando la formula che c'è nella tesi di Bernardo Dal Seno.&lt;br /&gt;
&lt;br /&gt;
==Varie==&lt;br /&gt;
Le priorità indicate per le varie attività servono per fissare un'ordine. La tesi si conclude quando tutte le attività sono complete.&lt;/div&gt;</summary>
		<author><name>AndreaSgarlata</name></author>	</entry>

	<entry>
		<id>https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=3961</id>
		<title>Talk:Online P300 and ErrP recognition with BCI2000</title>
		<link rel="alternate" type="text/html" href="https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=3961"/>
				<updated>2008-09-17T08:10:03Z</updated>
		
		<summary type="html">&lt;p&gt;AndreaSgarlata: /* Modulo di elaborazione del segnale BCI2000 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Plugin Galileo/Modulo sorgente BCI2000==&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo Plugin: sgarlata/Plugin&lt;br /&gt;
&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo sorgente BCI2000: sgarlata/GalileoSource&lt;br /&gt;
&lt;br /&gt;
Il sistema attualmente è composto da un plugin che si occupa di inviare i dati tramite pipe ad un altro modulo che fa parte dell'intero sistema di BCI2000.&lt;br /&gt;
&lt;br /&gt;
Per ottenere una corretta temporizzazione del sistema di BCI2000 abbiamo sfruttato il fatto che il plugin è più lento nell'invio dei dati rispetto all'intero sistema BCI2000.&lt;br /&gt;
Infatti si è deciso di inviare tramite plugin una quantità di dati costante pari a 1/16 di secondo, tenendo conto del fatto che durante l'esecuzione di una registrazione online la quantità di dati ricevuti dal plugin risulta molto regolare e costante.&lt;br /&gt;
In questo modo ogni invio di dati tramite pipe rappresenta il trascorrere di un tempo prefissato che risulta pari a 1/16 di secondo.&lt;br /&gt;
&lt;br /&gt;
Sono stati effettuati diversi test (aggiunta di un buffer di accumulo, invio di blocchi di dimensione maggiore 0.1 secondi) per cercare di mantenere il più possibile costante l'intervallo che trascorre tra l'invio di un blocco dati e quello successivo, nonostante questi tentativi abbiamo riscontrato il fatto che l'intervallo tra due blocchi risulta in media molto regolare, questa regolarità viene persa però nei momenti in cui il sistema viene perturbato da fattori esterni dovuti all'intervento dell'utente, quali ad esempio: apertura nuova finestra, spostamento finestre, apertura cartelle ecc...&lt;br /&gt;
Tutti questi fattori possono essere trascurati, in quanto durante l'esecuzione dell'intero sistema l'utente non deve interagire direttamente con il sistema, ma deve solamente essere sottoposto a delle stimolazioni, e se l'utente decide di interagire è perché sta effettuando modifiche ed in quel momento non necessita di un sistema sincrono e regolare.&lt;br /&gt;
:Noi speriamo che non capiti durante il funzionamento normale o sia molto raro ([[User:BernardoDalSeno|BernardoDalSeno]] 20:21, 24 May 2008 (CEST))&lt;br /&gt;
&lt;br /&gt;
Per tutte queste motivazioni si è deciso che il plugin non appena accumulato un blocco dati pari a 1/16 di secondo deve subito inviarlo tramite pipe, in modo da mantenere una regolarità tra l'invio consecutivo di due blocchi.&lt;br /&gt;
&lt;br /&gt;
Nel sever Airbat sono presenti i sorgenti dei differenti plugin implementati con le differenti stategie di funzionamento:&lt;br /&gt;
&lt;br /&gt;
*Cartella sgarlata/old/PluginPipe: il plugin implementato consente un invio di dati in blocchi di 0.1secondi, consentendo al modulo sorgente di BCI2000 di occuparsi dell'invio di blocchi dati di dimensioni inferiori all'interno del sistema di BCI2000. Questa strategia è stata abbandonata perchè abbiamo notato che a 512Hz il plugin riceveva blocchi di 32 campioni per ogni chiamata, e doveva inviare blocchi di 51 campioni, questa differenza faceva si che l'invio di blocchi non era regolare in quanto ad esempio dopo due chiamate inviavo un blocco da 51 campioni e poi dovevo aspettare 3 chiamate per inviare un nuovo blocco dati.&lt;br /&gt;
&lt;br /&gt;
*Cartella sgarlata/old/PluginBuffer: il plugin implementato mantiene un buffer di N blocchi dati pari a 1/16 di secondo, ed inizia l'invio di un blocco dati nel momento in cui mezzo buffer è stato riempito, utilizzando come clock di invio l'orologio di invocazione del plugin, dato che in maniera molto regolare vi era un invocazione ogni 1/16 di secondo a 512Hz. La strategia dell'utilizzo del buffer è stata abbandonata in quanto, si introduceva ritardo con il buffer ed in oltre i problemi di perdita di regolarità si verificavano comunque perchè non erano dovuti a dei mancati invii di dati da parte del plugin,ma erano dovuti al fatto che il sistema veniva perturbato da un utente esterno ed il modulo sorgente di BCI2000 attendeva nella lettura di un nuovo blocco.&lt;br /&gt;
&lt;br /&gt;
*Cartella sgarlata/old/PluginTemporizzato: questo plugin utilizza un blocco dati pari a 1/16 di secondo, ma diversamente dal plugin finale manca della stampa di diversi valori di debug e della possibilità di connessione con il sistema di BCI2000 non sincrona.&lt;br /&gt;
&lt;br /&gt;
Le diverse strategie di sviluppo del plugin sono state studiate ed implementate per poter utilizzare un applicativo di stimolazione che rimanesse sincrono con l'intero sistema e quindi che avesse la possibilità di essere implementato da un modulo applicativo di BCI2000.&lt;br /&gt;
Uno stimolatore sincrono è un vantaggio in quanto consente di farlo evolvere durante l'acquisizione dei segnali e di effettuare diverse scelte sulla base di questi e dei risultati fin ora ottenuti.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Per quanto riguarda il modulo sorgente di BCI2000 questo si occupa di leggere dalla pipe: il numero di canali, il numero di campioni per canale e la frequenza di campionamento. Una volta letti questi valori controlla che l'utente abbia inserito tra i parametri gli stessi valori letti tramite pipe, se questo non avviene blocca l'intero sistema e comunica l'errore all'utente con i valori esatti da inserire. Questa procedura viene ripetuta finché l'utente non inserisce gli stessi parametri letti dal modulo source.  Si è visto che invece non si riesce a passare i parametri dal modulo sorgente agli altri moduli di BCI2000 durante la fase di inizializzazione.&lt;br /&gt;
&lt;br /&gt;
A run time il modulo source si occupa di leggere dalla pipe una blocco di dati e di inviarlo al modulo successivo (modulo filtro); ogni blocco viene inoltrato non appena è disponibile.&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
* (alta) Misurare il numero di campioni per chiamata a varie frequenze.&lt;br /&gt;
* (alta) Fare in modo che non vengano segnalati gli errori di pipe piena relativi a quando non si sta registrando. Suggerimento: far mandare dal modulo sorgente sulla pipe ogni cambiamento di stato (registro/non registro); il plugin quindi aggiornerà lo stato internamento e lo userà per segnalare solo gli errori rilevanti.&lt;br /&gt;
* (alta) Fare in modo che '''trigger.txt''' e '''triggerData.txt''' vengano scritti solo se sia definita una costante specifica per quello (non quella generica di debug); non definire la costante.&lt;br /&gt;
* (media) Script per il confronto tra dati registrati da BCI2000 e da Galileo; si lancia passandogli il nome dei due file e una soglia, e restituisce un valore binario per dire se sono uguali (all'interno della soglia) oppure no; eventualmente disegna qualche grafico.&lt;br /&gt;
&lt;br /&gt;
=== Fatto ===&lt;br /&gt;
&lt;br /&gt;
* Eliminare la finestra del plugin, e salvare eventuali tempi (istanti) di perdite di dati (pipe piena) su file e alla fine della registrazione avvisare l'utente se ci sono state perdite. Il file verrà cancellato se non contiene errori. Nessun file di log va sovrascritto.	 &lt;br /&gt;
:Per come è fatto il sistema, è inevitabile che la pipe si riempia prima dell'inizio della registrazione vera e propria. Questo periodo non va segnalato né salvato su file (andrà ideato un opportuno sistema per identificarlo).&lt;br /&gt;
&lt;br /&gt;
==Modulo di elaborazione del segnale BCI2000==&lt;br /&gt;
&lt;br /&gt;
Attualmente la catena di filtri del modulo di BCI2000 è suddivisa nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)un filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)un filtro di Trigger che si occupa di rilevare gli inizi delle stimolazioni tramite l'analisi del segnale proveniente dal fototransistor&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa di accumulare più forme d'onda p300 relative alla stessa stimolazione e tra queste farne la media&lt;br /&gt;
&lt;br /&gt;
4)un filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
Si vuole modificare sia la sequenza di filtri che il funzionamento di alcuni di questi nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
#filtro spaziale&lt;br /&gt;
#filtro di Trigger che determina in maniera automatica, tramite una fase iniziale dettata dal modulo applicativo, il valore di soglia per distinguere gli istanti di tempo in cui il riquadro è nero oppure bianco.&lt;br /&gt;
#*PARAMETRI DEFINITI: &lt;br /&gt;
#**WindowSize = definisce la dimensione della finestra mobile utilizzata per filtrare il segnale&lt;br /&gt;
#**TriggerChannel = definisce il numero del segnale sul quale identificare i trigger&lt;br /&gt;
#*STATI DEFINITI:&lt;br /&gt;
#**TriggerFound = posto a 1 se il filtro identifica nel blocco analizzato l'inizio di una stimolazione&lt;br /&gt;
#**TriggerIndex = se TriggerFound è posto a 1, questo stato contiene indice del campione nel blocco analizzato che ha determinato l'inizio dello stimolo.&lt;br /&gt;
#**Riferimento su Airbat del sorgente filtro Trigger: sgarlata/P3ErrPSignalProcessingGalileo/TriggerFilterAutoThreshold&lt;br /&gt;
#filtro butterworth passa banda con banda passante definibile tramite l'impostazione di appositi parametri (default banda passante 5Hz-10Hz, dato che i potenziali evocati hanno un andamento lento nel tempo). L'output di questo filtro è utilizzato in fase di riconoscimento dell'ErrP.&lt;br /&gt;
#*PARAMETRI DEFINITI: &lt;br /&gt;
#**ButterworthBPLowCorner = definisce il valore di banda passante minimo&lt;br /&gt;
#**ButterworthBPHighCorner = definisce il valore di banda passante massimo&lt;br /&gt;
#**Riferimento su Airbat del sorgente filtro ButterworthBP: sgarlata/P3ErrPSignalProcessingGalileo/ButterworthBP&lt;br /&gt;
#un filtro che si occupa solamente di accumulare le forme d'onda con un ring buffer che memorizza una porzione di segnale precedente.&lt;br /&gt;
#*PARAMETRI DEFINITI:&lt;br /&gt;
#**EpochLength = lunghezza in secondi dell'epoca da accumulare&lt;br /&gt;
#**LengthBeforeStimulus = lunghezza in secondi della porzione di segnale da accumulare prima dell'inizio di una stimolazione&lt;br /&gt;
#**VisualizeCollectorFiltering = se settato questo parametro consente di visualizzare l'intera epoca accumulata&lt;br /&gt;
#*STATI DEFINITI:&lt;br /&gt;
#**StimulusCodeDone = il codice dello stimolo la cui relativa epoca è stata interamente accumulata&lt;br /&gt;
#**StimulusTypeDone = il tipo relativo all'epoca appena accumulata&lt;br /&gt;
#*Riferimento su Airbat del sorgente filtro Collector: sgarlata/P3ErrPSignalProcessingGalileo/CollectorFilterGALILEO&lt;br /&gt;
#filtro di classificazione per P300 ed ErrP.&lt;br /&gt;
Per la classificazione P300 attualmente è implementato il classificatore lineare &amp;quot;Logistic&amp;quot;, mentre per la classificazione ErrP è implementato un classificatore LDA.&lt;br /&gt;
#*PARAMETRI DEFINITI:&lt;br /&gt;
#**ClassifierFunction = identifica la funzione di classificazione P300 da utilizzare (attualmente è solamente implementato il classificatore Logistic)&lt;br /&gt;
#**P3WeightMatrix = matrice in cui ogni colonna indica un canale e il numero di righe è pari al numero di campioni dell'epoca in ingresso aumentato di 1 . La prima riga di ogni colonna indica il canale sul quale applicare i pesi definiti nelle righe successive.&lt;br /&gt;
#**P3Constant = costante utilizzata dal classificatore P300 Logistic&lt;br /&gt;
#**ErrPSamplesIndex = matrice in cui per ogni riga è indicato nella prima colonna il canale segiuto dall'indice dei campioni da prelevare dal segnale d'ingresso&lt;br /&gt;
#**ErrpClassifS, ErrpClassifMm, ErrpClassifMsT, ErrpClassifC = matrici utilizzate dal classificatore ErrP&lt;br /&gt;
#*STATI DEFINITI:&lt;br /&gt;
#**ErrPFound = questo stato è posto a 0 durante il calcolo dell'ErrP, terminato il calcolo se viene identificato un ErrP questo stato è posto a 1 altrimenti è posto a 2.&lt;br /&gt;
#*Riferimento su Airbat del sorgente filtro Collector: sgarlata/P3ErrPSignalProcessingGalileo/P3ErrPClassifier&lt;br /&gt;
#filtro che effettua la media dei valori in uscita dal filtro di classificazione&lt;br /&gt;
#*PARAMETRI DEFINITI:&lt;br /&gt;
#**EpochsToAverage = il numero di classificazioni da mediare&lt;br /&gt;
#*STATI DEFINITI:&lt;br /&gt;
#**StimulusCodeRes = il codice dello stimolo del quale è stata calcolata la media di &amp;quot;EpochsToAverage&amp;quot; stimolazioni&lt;br /&gt;
#**StimulusTypeRes = il tipo relativo allo StimulusCodeRes appena determinato&lt;br /&gt;
#*Riferimento su Airbat del sorgente filtro Media: sgarlata/P3ErrPSignalProcessingGalileo/MeanFilter&lt;br /&gt;
#un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
===Da Fare===&lt;br /&gt;
&lt;br /&gt;
* (alta) Cambiare i nomi dei parametri del classificatore ErrP; esempio: &amp;quot;S&amp;quot; diventa &amp;quot;ErrpClassifS&amp;quot;.&lt;br /&gt;
* (bassa) Fare un filtro FIR (c'è già una classe nel sorgente BCI2000) da usare in alternativa al filtro Butterworth.  Il filtro prende come parametri il vettore di pesi.  L'idea è che si genera il filtro durante l'addestramento in Matlab, e viene usato anche online.  Il problema del Butterworth è che ha una fase non lineare e quindi deforma la forma d'onda.&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
*Filtro che rileva i trigger&lt;br /&gt;
*Adattamento automatico della soglia per i trigger (Analisi switch riquadro: Bianco-&amp;gt;Nero-&amp;gt;Bianco per un tempo definito dall'utente)&lt;br /&gt;
*Accumulare forme d'onda con parti che precedono il trigger&lt;br /&gt;
*Script Matlab per verificare l'accuratezza della rilevazione dei fronti d'onda.&lt;br /&gt;
*Elencare stati e parametri usati dai filtri, e documentare quelli nuovi.&lt;br /&gt;
*Il classificatore per P300 usi questa formula:&lt;br /&gt;
  &amp;lt;math&amp;gt;L_{\rm P300} = \frac{1}{1 + exp( c + \sum_i w_i x_i )}&amp;lt;/math&amp;gt;&lt;br /&gt;
dove &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; sono i campioni EEG di tutti i canali, mentre ''c'' e &amp;lt;math&amp;gt;w_i&amp;lt;/math&amp;gt; sono dei pesi oppurtuni.&lt;br /&gt;
I &amp;lt;math&amp;gt;w_i&amp;lt;/math&amp;gt; saranno organizzati in una matrice bidimensionale, in cui ogni riga contiene: il numero del canale, seguito da tutti i pesi per quel canale.  Poi con un ulteriore parametro si potrà selezionare una funzione alternativa alla logistica.&lt;br /&gt;
&lt;br /&gt;
==Modulo applicativo speller P300==&lt;br /&gt;
&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo Applicativo: sgarlata/P3Speller&lt;br /&gt;
&lt;br /&gt;
Il modulo applicativo deve essere adattato al sistema di trigger.&lt;br /&gt;
&lt;br /&gt;
Per quanto riguarda il modulo applicativo bisogna introdurre un riquadro posto nell'angolo superiore destro dello schermo e farlo variare (bianco/nero) ogni qual volta viene effettuata una stimolazione e, prima dell'inizio della sequenza di stimolazioni, introdurre una fase preliminare in cui si fa variare (bianco/nero) il riquadro per un tempo totale preimpostato in modo da poter far determinare in maniera automatica dal filtro di Trigger il valore di soglia che permette di distinguere se siamo in fase di stimolazione (riquadro nero) o in fase di non stimolazione (riquadro bianco).&lt;br /&gt;
Terminata la fase di taratura del valore di soglia, lo speller può effettuare la sua sequenza di stimolazioni.&lt;br /&gt;
Alla fine di ogni treno di stimolazioni lo speller P300 determina, in base alle classificazioni ricevute, qual'è la stimolazione con classificazione maggiore mostrandola a video. A questo punto inizia una nuova fase in cui viene controllata la presenza dell'ErrP, se è stato identificato una forma d'onda ErrP lo speller non effettua alcuna selezione (modalità &amp;quot;free mode&amp;quot;) altrimenti seleziona la stimolazione mostrata a video precedentemente, riprendendo con una nuova sequenza di stimolazioni.&lt;br /&gt;
&lt;br /&gt;
Per le modifiche da effettuare al modulo applicativo di BCI2000 quando questo deve comunicare tramite protocollo UDP con un altro applicativo che effettua le stimolazioni su una differente macchina Linux si è invitati a visionare la relativa discussione di Roberto Massimini.&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
* (alta) Misurare lo sfasamento tra sync e stimolo	 &lt;br /&gt;
* (media) Segnalare (e recuperare, se possibile) eventuali problemi con la sincronizzazione tra stimolazione e trigger. Alla fine di ogni treno di stimolazioni, verificare che il numero di trigger e di stimolazioni siano uguali. Gli stati devono fornire abbastanza informazioni perché si possa caricare da file una registrazione &amp;quot;rovinata&amp;quot; ignorando (tutto e solo) il treno di stimolazioni fuori sincronia.&lt;br /&gt;
:Scrivere un codice di test opportuno per forzare/simulare errori nella rilevazione del trigger (non riconoscimento di un trigger o riconoscimento di un trigger spurio).&lt;br /&gt;
* (bassa) Scrivere specifiche per comunicazione tra BCI2000 e un modulo applicativo P300 esterno che gira su una macchina Linux separata&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
* Modificare lo stato StimulusBegin anche per lo stimulo ErrP&lt;br /&gt;
* Verifica del sistema per associare la stimolazione ai trigger rilevati dall'apposito filtro&lt;br /&gt;
&lt;br /&gt;
==Integrazione con ErrP==&lt;br /&gt;
&lt;br /&gt;
Il sistema basato su BCI2000 che usa P300 va espanso per poter usar anche i potenziali d'errore&lt;br /&gt;
&lt;br /&gt;
Ciò che si vuole sviluppare è un sistema che si basi su una procedura di verifica automatica tramite l'integrazione del controllo anche sui potenziali d'errore.&lt;br /&gt;
La verifica dell'Errp non è effettuato tramite media di più forme d'onda così come avviene con le rilevazioni della P300, ma sulla singola prova.&lt;br /&gt;
Infatti, dopo l'analisi delle forme d'onda P300 e la determinazione del target voluto dall'utente, si introduce una ulteriore fase in cui si mostra all'utente la probabile selezione voluta e si valuta la presenza del potenziale d'errore. Se non viene riscontrata questa forma d'onda si seleziona il target precedentemente identificato, altrimenti si ripete una nuova sequenza di stimolazioni per identificare nuovamente il target voluto.&lt;br /&gt;
&lt;br /&gt;
Schema del comportamento del classificatore LDA di Gianmaria:&lt;br /&gt;
: c - ((x - media_tr) * scala_tr * medie_tr)&lt;br /&gt;
cioè&lt;br /&gt;
: y = c1 + x * matrice&lt;br /&gt;
e la classe è l'indice del valore minimo del vettore y (che è lungo 2)&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
*Introdurre una nova fase di controllo Errp nel modulo applicativo dello speller&lt;br /&gt;
*Introdurre un nuovo filtro nella catena dei filtri che si occupa del'accumulo dei potenziali d'errore&lt;br /&gt;
*Modificare opportunamente i filtri di: classificazione, media e normalizzazione per supportare il controllo dell'Errp&lt;br /&gt;
*Fare uno script Matlab nuovo, derivato da quelli di Gianmaria, che faccia l'addestramento su dati salvati dallo speller BCI2000 in modalità &amp;quot;copy&amp;quot; e restituisca (su file) le tabelle per il classificatore pronte per essere caricate nel modulo di BCI2000.&lt;br /&gt;
:Questo viene meglio diviso in diversi script: 1. Uno script che carica un file BCI2000 in una struttura eeg_p300_data; meglio se accetta gli stessi parametri di load_eeg_data_dei.m 2. Uno script che prende una struttura eeg_p300_data, calcola l'intervallo ottimo, addestra il classificatore e salva le matrici per l'uso online. 3. Uno script che usa i 2 precedenti: carica i dati da un po' di file, li concatena, e addestra il classificatore ([[User:BernardoDalSeno|BernardoDalSeno]] 17:39, 9 July 2008 (CEST))&lt;br /&gt;
*Far funzionare lo speller in modalità &amp;quot;copy&amp;quot;: il testo viene specificato all'utente e la lettera giusta viene scelta dall'applicazione con una probabilità dell'80% (parametro), in modo da avere dati per l'addestramento sia della P300 che dell'ErrP.  Negli stati va salvata l'informazione su qual è la stimolazione che contiene una P300 (questo dovrebbe esserci già per la P300) e quale contiene un ErrP.&lt;br /&gt;
*Assicurarsi che l'attuale classificatore ErrP faccia esattamente le stesse cose di quello usato da Gianmaria (LDA sui dati grezzi).&lt;br /&gt;
*Nel filtro P3ErrPClassifier: ogni riga specifica più campioni per un solo canale; più righe possono riferirsi allo stesso canale.&lt;br /&gt;
&lt;br /&gt;
==Addestramento==&lt;br /&gt;
Il sistema per il corretto funzionamento on line richiede l'addestramento dei classificatori per il riconoscimento del potenziale P300 e del potenziale d'errore (ErrP).&lt;br /&gt;
L'intera sequenza di addestramento è divisa in 3 diverse 'sessioni'. Ogni 'sessione' corrisponde a una giornata, ed è suddivisa a sua volta in diversi 'run', dove per 'run' si intende un nuovo ciclo di esecuzione dell'applicativo(speller). Per ogni sessione deve essere creata una cartella con nome: 'Iniziale_nome_utenteCognomeNumero_sessione' (es. Andrea Sgarlata sessione 001: 'asgarlata001') contenente tutte le registrazioni (file .dat) effettuate nella stessa sessione.&lt;br /&gt;
In oltre per ogni sessione deve essere compilato un file di log (log-sessione.txt da inserire nella stessa cartella della sessione, template già precompilato nella cartella sgarlata/TestParam), con i dati dell'utente e per ogni 'run' il modo di funzionamente le impedenze registrate per ogni canale ed eventuali note per esempio livello di stanchezza e concentrazione dell'utente ecc...&lt;br /&gt;
Prima di iniziare l'addestramento bisogna spiegare all'utente cosa deve fare e come si deve comportare durante l'utilizzo del sistema.&lt;br /&gt;
La prima sessione è necessaria per l'addestramento del classificatore per il potenziale P300 ed ErrP; questa sessione è svolta in modalità copy ed è suddivisa in 10 run, i diversi run si differenziano per la parola mostrata nella barra 'textToSpell'. &lt;br /&gt;
Per una corretta impostazione dell'intero sistema in questa sessione, bisogna: &lt;br /&gt;
* creare la cartella (es: 'asgarlata001').&lt;br /&gt;
* compilare il log di sessione.&lt;br /&gt;
* avviare il sistema (Galileo + BCI2000)&lt;br /&gt;
* caricare il file Sgarlata/TestParam/P3ErrpSpeller-training.prm in BCI2000&lt;br /&gt;
* modificare nella scheda 'Storage' di BCI2000 il campo 'DataDirectory' indicando la cartella della sessione appena generata ed il campo 'SubjectName' indicando 'Iniziale_nome_utenteCognome'&lt;br /&gt;
:: Assicuriamoci che non ci si possa dimenticare di fare quest'ultimo passo. 'DataDirectory' nel file parametri dovrebbe già contenere un percorso inesistente. Esiste un valore illegale per 'SubjectName'? e.g., vuoto, oppure con qualche carattere strano, oppure un nome troppo lungo...  ([[User:BernardoDalSeno|BernardoDalSeno]] 15:17, 11 September 2008 (CEST))&lt;br /&gt;
&lt;br /&gt;
Impostato il sistema, tramite le operazioni appena elencate, non rimane che per ogni run caricare il file contenente la sola parola da inserire nella barra 'textToSpell' (file presenti nella cartella Sgarlata/TestParam/traning_words), quindi al primo run verrà caricato il file di parametri 'LearningSession1.prm', al secondo run il parametro 'LearningSession1.prm' e così via fin al completamento dei 10 run.&lt;br /&gt;
Terminata la prima sessione con i dati raccolti si procede all'addestramento del classificatore P300 tramite lo script run_ga_speller_dei.m (si veda l'help dello script per il funzionamento), questo script utilizza un'algoritmo genetico di conseguenza è consigliabile utilizzare come parametro di ingresso la creazione di almeno 10 generazioni.&lt;br /&gt;
:Specifica quali run usare per addestramento e test ([[User:BernardoDalSeno|BernardoDalSeno]] 15:17, 11 September 2008 (CEST))&lt;br /&gt;
&lt;br /&gt;
Se non vi sono stati errori lo script genera un file di parametri che deve essere caricato nel sistema consentendo così l'addestramendo del classificatore P300 ed il passaggio alla seconda sessione.&lt;br /&gt;
&lt;br /&gt;
Nella seconda sessione si mantiene il sistema configurato come nella sessione precedente con la differenza che questa sessione è svolta in modalità copy ma con il classificatore P300 funzionante.&lt;br /&gt;
:Bisogna aggiustare il numero di ripetizioni per controllare gli errori, però ([[User:BernardoDalSeno|BernardoDalSeno]] 15:17, 11 September 2008 (CEST))&lt;br /&gt;
Quindi, si procede a creare una nuova cartella per la sessione 002, si modifica il campo 'DataDirectory' e nella scheda 'Application' deve essere posto il campo 'RightSelectionProbabiliity' uguale a 0, in questo modo il target visualizzato è quello che è stato selezionato dal classificatore P300.&lt;br /&gt;
:Facciamo invece un file di parametri per la seconda sessione che contiene già questa impostazione; è più semplice.&lt;br /&gt;
Effettuate queste modifiche si può ripartire nuovamente con il caricare in sequenza per ogni run solamente le 10 parole definite nei parametri 'LearningSession#.prm', indicando, nel file di log, per ogni run il numero di lettere selezionate errate.&lt;br /&gt;
:Questa informazione è presente nel file di log che viene generato da BCI2000 (&amp;quot;*_summary.txt&amp;quot;)? Se no, possiamo aggiungerla? ([[User:BernardoDalSeno|BernardoDalSeno]] 15:17, 11 September 2008 (CEST))&lt;br /&gt;
:Userei altri 10 file per le parole, non vorrei far annoiare i soggetti. ([[User:BernardoDalSeno|BernardoDalSeno]] 15:17, 11 September 2008 (CEST))&lt;br /&gt;
Terminata la seconda sessione si può procedere all'addestramento del classificatore per il riconoscimento dei potenziali d'errore (ErrP). A questo scopo si utilizza uno script matlab che richiama la funzione 'train_errp_visconti_bci2000( params )' generando il file .prm con i parametri necessari al classificatore ErrP. Se lo script non è in grado di identificare una sezione dell'epoca in cui distinguere o meno la presenza di un potenziale d'errore bisogna procede alla registrazione di ulteriori run oppure provare ad introdurre nuovi canali, all'interno dei parametri passati, e ad allargare la sezione temporale in cui individuare la forma d'onda ErrP.&lt;br /&gt;
:Specifica quali run usare per addestramento e test.  Fissiamo una soglia per decidere se possiamo utilizzare gli ErrP online: direi almeno il 70% di recall sia per ErrP che non-ErrP.  Hai ancora il foglio con indicato lo schema per l'addestramento? ricordo che avevo pensato di provare subito il classificatore ErrP con uno o due run di prova. ([[User:BernardoDalSeno|BernardoDalSeno]] 15:17, 11 September 2008 (CEST))&lt;br /&gt;
:L'insieme dei dati usati per l'addestramento va annotato. ([[User:BernardoDalSeno|BernardoDalSeno]] 03:31, 15 September 2008 (CEST))&lt;br /&gt;
&lt;br /&gt;
Se non vi sono stati errori lo script genera un file di parametri che può essere caricato per addestrare questa volta il classificatore ErrP. A questo punto è possibile passare alla terza sessione.&lt;br /&gt;
&lt;br /&gt;
Nella terza sessione si può effettuare una serie di run (un qualsiasi numero) in modalità free mode. &lt;br /&gt;
: Solo se il classificatore ErrP funziona bene, altrimenti questa è ancora una sessione di addestramento; per cui servono altre parole. ([[User:BernardoDalSeno|BernardoDalSeno]] 15:17, 11 September 2008 (CEST))&lt;br /&gt;
L'utente decide quale parola, lettera per lettera, vuole scrivere, e nel caso in cui il sistema scrive un carattere errato l'utente dovrà eliminarlo selezionando l'icona 'BS' che si occupa di cancellare l'ultima lettera inserita. La parola (o frase) che l'utente ha scelto fa segnata sul file di log.&lt;br /&gt;
Anche in questa sessione è necessario creare una nuova cartella con identificativo sessione 003, modificare il campo 'DataDirectory' e nella cartella 'Application' bisogna impostare il campo 'InterpretMode' con il valore 'online free mode'. Naturalmente in fase è nuovamente necessario compilare il file di log introducendo tutte le informazioni necessarie.&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
* (altissima) Scrivere una funzione definita tra in &amp;lt;math&amp;gt;[0,1]&amp;lt;/math&amp;gt; parametrica che valga: 1 in 0 e 1; &amp;lt;math&amp;gt;1-\epsilon&amp;lt;/math&amp;gt; in ''a'' e ''c'', 0 in ''b''. &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt; è un parametro.&lt;br /&gt;
* (alta) Fare un file di parametri per addestrare la gente per P300 e ErrP (modalità copy). &lt;br /&gt;
* (alta) Fare N (con N oppurtuno) file di parametri che contengano le parole da scrivere; considerare lunghezza oppurtuna per singole registrazioni e sessioni. Il file e il nome del file contenga già il numero di sessione e registrazione.&lt;br /&gt;
* (alta) Aggiustare il protocollo per gli esperimenti secondo i commenti.  Fare delle mini-procedure - come per la prima sessione - anche per i run delle sessioni successive.&lt;br /&gt;
* (media) Lo speller in modalità copy quando genera dei feedback sbagliati (per l'addestramento ErrP) deve selezionare effettivamente un simbolo sbagliato a caso tra tutti i simboli disponibili, e non usare il classificatore P300 per questo.&lt;br /&gt;
* (bassa) Far funzionare lo speller in modalità &amp;quot;mista&amp;quot;, cioè: la stringa da scrivere è assegnata; il classificatore P300 viene usato per selezionare le lettere; in caso di lettera sbagliata viene scritta la lettera selezionata, e il simbolo successivo da selezionare sarà BackSpace.  Perché questa cosa funzioni, il tasso di errori deve essere contenuto entro un certo intervallo, definito da 3 valori (''a'',''b'',''c'') in un opportuno parametro (si potrebbe riutilizzare il parametro attualmente usato per il tasso di errori nella stimolazione ErrP); operativamente:&lt;br /&gt;
# Selezionare una lettere con il classificatore P300&lt;br /&gt;
# Calcolare la statistica ''s'' delle selezioni correte sulle ultime N selezioni&lt;br /&gt;
# Si ricava una probabilità ''p'' a partire dall'entità della deviazione dall'intervallo ammesso, usando un'opportuna funzione che dipende da ''a'', ''b'', ''c'', ''s''.&lt;br /&gt;
# Con probabilità ''p'' modificare la selezione in questo modo:&lt;br /&gt;
#* Se ''s'' &amp;lt; ''b'', la selezione corrente viene corretta, se è sbagliata&lt;br /&gt;
#* Se ''s'' &amp;gt; ''b'', la selezione corrente viene fatta diventare sbagliate, se è corretta&lt;br /&gt;
:Il risultato dovrebbe essere che la statistica sia quasi sempre all'interno dell'intervallo ''a''-''c'', e che i valori fuori dall'intervallo non si allontanino troppo dai limiti fissati.&lt;br /&gt;
:Suggerimento: Per questa cosa, fare una classe (e usare un'istanza) in cui ci sia un metodo per aggiornare la statistica e uno per dire se bisogna fare correzioni all'ultima selezione.&lt;br /&gt;
* (bassissima) Fare esperimenti con almeno un paio di soggetto in cui lo speller funziona nella modalità &amp;quot;mista&amp;quot; di cui sopra.&lt;br /&gt;
:Per scegliere il numero di ripetizioni ottimo, bisogna valutare l'accuratezza del classificatore P300 con diversi numeri di ripetizioni (offline sui dati di test) e da questa, insieme all'accuratezza del classificatore ErrP, calcolare la velocità globale dell'interfaccia usando la formula che c'è nella tesi di Bernardo Dal Seno.&lt;br /&gt;
&lt;br /&gt;
==Varie==&lt;br /&gt;
Le priorità indicate per le varie attività servono per fissare un'ordine. La tesi si conclude quando tutte le attività sono complete.&lt;/div&gt;</summary>
		<author><name>AndreaSgarlata</name></author>	</entry>

	<entry>
		<id>https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=3951</id>
		<title>Talk:Online P300 and ErrP recognition with BCI2000</title>
		<link rel="alternate" type="text/html" href="https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=3951"/>
				<updated>2008-09-11T10:02:01Z</updated>
		
		<summary type="html">&lt;p&gt;AndreaSgarlata: /* Addestramento */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Plugin Galileo/Modulo sorgente BCI2000==&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo Plugin: sgarlata/Plugin&lt;br /&gt;
&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo sorgente BCI2000: sgarlata/GalileoSource&lt;br /&gt;
&lt;br /&gt;
Il sistema attualmente è composto da un plugin che si occupa di inviare i dati tramite pipe ad un altro modulo che fa parte dell'intero sistema di BCI2000.&lt;br /&gt;
&lt;br /&gt;
Per ottenere una corretta temporizzazione del sistema di BCI2000 abbiamo sfruttato il fatto che il plugin è più lento nell'invio dei dati rispetto all'intero sistema BCI2000.&lt;br /&gt;
Infatti si è deciso di inviare tramite plugin una quantità di dati costante pari a 1/16 di secondo, tenendo conto del fatto che durante l'esecuzione di una registrazione online la quantità di dati ricevuti dal plugin risulta molto regolare e costante.&lt;br /&gt;
In questo modo ogni invio di dati tramite pipe rappresenta il trascorrere di un tempo prefissato che risulta pari a 1/16 di secondo.&lt;br /&gt;
&lt;br /&gt;
Sono stati effettuati diversi test (aggiunta di un buffer di accumulo, invio di blocchi di dimensione maggiore 0.1 secondi) per cercare di mantenere il più possibile costante l'intervallo che trascorre tra l'invio di un blocco dati e quello successivo, nonostante questi tentativi abbiamo riscontrato il fatto che l'intervallo tra due blocchi risulta in media molto regolare, questa regolarità viene persa però nei momenti in cui il sistema viene perturbato da fattori esterni dovuti all'intervento dell'utente, quali ad esempio: apertura nuova finestra, spostamento finestre, apertura cartelle ecc...&lt;br /&gt;
Tutti questi fattori possono essere trascurati, in quanto durante l'esecuzione dell'intero sistema l'utente non deve interagire direttamente con il sistema, ma deve solamente essere sottoposto a delle stimolazioni, e se l'utente decide di interagire è perché sta effettuando modifiche ed in quel momento non necessita di un sistema sincrono e regolare.&lt;br /&gt;
:Noi speriamo che non capiti durante il funzionamento normale o sia molto raro ([[User:BernardoDalSeno|BernardoDalSeno]] 20:21, 24 May 2008 (CEST))&lt;br /&gt;
&lt;br /&gt;
Per tutte queste motivazioni si è deciso che il plugin non appena accumulato un blocco dati pari a 1/16 di secondo deve subito inviarlo tramite pipe, in modo da mantenere una regolarità tra l'invio consecutivo di due blocchi.&lt;br /&gt;
&lt;br /&gt;
Nel sever Airbat sono presenti i sorgenti dei differenti plugin implementati con le differenti stategie di funzionamento:&lt;br /&gt;
&lt;br /&gt;
*Cartella sgarlata/old/PluginPipe: il plugin implementato consente un invio di dati in blocchi di 0.1secondi, consentendo al modulo sorgente di BCI2000 di occuparsi dell'invio di blocchi dati di dimensioni inferiori all'interno del sistema di BCI2000. Questa strategia è stata abbandonata perchè abbiamo notato che a 512Hz il plugin riceveva blocchi di 32 campioni per ogni chiamata, e doveva inviare blocchi di 51 campioni, questa differenza faceva si che l'invio di blocchi non era regolare in quanto ad esempio dopo due chiamate inviavo un blocco da 51 campioni e poi dovevo aspettare 3 chiamate per inviare un nuovo blocco dati.&lt;br /&gt;
&lt;br /&gt;
*Cartella sgarlata/old/PluginBuffer: il plugin implementato mantiene un buffer di N blocchi dati pari a 1/16 di secondo, ed inizia l'invio di un blocco dati nel momento in cui mezzo buffer è stato riempito, utilizzando come clock di invio l'orologio di invocazione del plugin, dato che in maniera molto regolare vi era un invocazione ogni 1/16 di secondo a 512Hz. La strategia dell'utilizzo del buffer è stata abbandonata in quanto, si introduceva ritardo con il buffer ed in oltre i problemi di perdita di regolarità si verificavano comunque perchè non erano dovuti a dei mancati invii di dati da parte del plugin,ma erano dovuti al fatto che il sistema veniva perturbato da un utente esterno ed il modulo sorgente di BCI2000 attendeva nella lettura di un nuovo blocco.&lt;br /&gt;
&lt;br /&gt;
*Cartella sgarlata/old/PluginTemporizzato: questo plugin utilizza un blocco dati pari a 1/16 di secondo, ma diversamente dal plugin finale manca della stampa di diversi valori di debug e della possibilità di connessione con il sistema di BCI2000 non sincrona.&lt;br /&gt;
&lt;br /&gt;
Le diverse strategie di sviluppo del plugin sono state studiate ed implementate per poter utilizzare un applicativo di stimolazione che rimanesse sincrono con l'intero sistema e quindi che avesse la possibilità di essere implementato da un modulo applicativo di BCI2000.&lt;br /&gt;
Uno stimolatore sincrono è un vantaggio in quanto consente di farlo evolvere durante l'acquisizione dei segnali e di effettuare diverse scelte sulla base di questi e dei risultati fin ora ottenuti.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Per quanto riguarda il modulo sorgente di BCI2000 questo si occupa di leggere dalla pipe: il numero di canali, il numero di campioni per canale e la frequenza di campionamento. Una volta letti questi valori controlla che l'utente abbia inserito tra i parametri gli stessi valori letti tramite pipe, se questo non avviene blocca l'intero sistema e comunica l'errore all'utente con i valori esatti da inserire. Questa procedura viene ripetuta finché l'utente non inserisce gli stessi parametri letti dal modulo source.  Si è visto che invece non si riesce a passare i parametri dal modulo sorgente agli altri moduli di BCI2000 durante la fase di inizializzazione.&lt;br /&gt;
&lt;br /&gt;
A run time il modulo source si occupa di leggere dalla pipe una blocco di dati e di inviarlo al modulo successivo (modulo filtro); ogni blocco viene inoltrato non appena è disponibile.&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
* (alta) Misurare il numero di campioni per chiamata a varie frequenze.&lt;br /&gt;
* (alta) Fare in modo che non vengano segnalati gli errori di pipe piena relativi a quando non si sta registrando. Suggerimento: far mandare dal modulo sorgente sulla pipe ogni cambiamento di stato (registro/non registro); il plugin quindi aggiornerà lo stato internamento e lo userà per segnalare solo gli errori rilevanti.&lt;br /&gt;
* (alta) Fare in modo che '''trigger.txt''' e '''triggerData.txt''' vengano scritti solo se sia definita una costante specifica per quello (non quella generica di debug); non definire la costante.&lt;br /&gt;
* (media) Script per il confronto tra dati registrati da BCI2000 e da Galileo; si lancia passandogli il nome dei due file e una soglia, e restituisce un valore binario per dire se sono uguali (all'interno della soglia) oppure no; eventualmente disegna qualche grafico.&lt;br /&gt;
&lt;br /&gt;
=== Fatto ===&lt;br /&gt;
&lt;br /&gt;
* Eliminare la finestra del plugin, e salvare eventuali tempi (istanti) di perdite di dati (pipe piena) su file e alla fine della registrazione avvisare l'utente se ci sono state perdite. Il file verrà cancellato se non contiene errori. Nessun file di log va sovrascritto.	 &lt;br /&gt;
:Per come è fatto il sistema, è inevitabile che la pipe si riempia prima dell'inizio della registrazione vera e propria. Questo periodo non va segnalato né salvato su file (andrà ideato un opportuno sistema per identificarlo).&lt;br /&gt;
&lt;br /&gt;
==Modulo di elaborazione del segnale BCI2000==&lt;br /&gt;
&lt;br /&gt;
Attualmente la catena di filtri del modulo di BCI2000 è suddivisa nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)un filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)un filtro di Trigger che si occupa di rilevare gli inizi delle stimolazioni tramite l'analisi del segnale proveniente dal fototransistor&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa di accumulare più forme d'onda p300 relative alla stessa stimolazione e tra queste farne la media&lt;br /&gt;
&lt;br /&gt;
4)un filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
Si vuole modificare sia la sequenza di filtri che il funzionamento di alcuni di questi nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
#filtro spaziale&lt;br /&gt;
#filtro di Trigger che determina in maniera automatica, tramite una fase iniziale dettata dal modulo applicativo, il valore di soglia per distinguere gli istanti di tempo in cui il riquadro è nero oppure bianco.&lt;br /&gt;
#*PARAMETRI DEFINITI: &lt;br /&gt;
#*WindowSize = definisce la dimensione della finestra mobile utilizzata per filtrare il segnale&lt;br /&gt;
#*TriggerChannel = definisce il numero del segnale sul quale identificare i trigger&lt;br /&gt;
#*STATI DEFINITI:&lt;br /&gt;
#*TriggerFound = posto a 1 se il filtro identifica nel blocco analizzato l'inizio di una stimolazione&lt;br /&gt;
#*TriggerIndex = se TriggerFound è posto a 1, questo stato contiene indice del campione nel blocco analizzato che ha determinato l'inizio dello stimolo.&lt;br /&gt;
#*Riferimento su Airbat del sorgente filtro Trigger: sgarlata/P3ErrPSignalProcessingGalileo/TriggerFilterAutoThreshold&lt;br /&gt;
#filtro butterworth passa banda con banda passante definibile tramite l'impostazione di appositi parametri (default banda passante 5Hz-10Hz, dato che i potenziali evocati hanno un andamento lento nel tempo). L'output di questo filtro è utilizzato in fase di riconoscimento dell'ErrP.&lt;br /&gt;
#*PARAMETRI DEFINITI: &lt;br /&gt;
#*ButterworthBPLowCorner = definisce il valore di banda passante minimo&lt;br /&gt;
#*ButterworthBPHighCorner = definisce il valore di banda passante massimo&lt;br /&gt;
#*Riferimento su Airbat del sorgente filtro ButterworthBP: sgarlata/P3ErrPSignalProcessingGalileo/ButterworthBP&lt;br /&gt;
#un filtro che si occupa solamente di accumulare le forme d'onda con un ring buffer che memorizza una porzione di segnale precedente.&lt;br /&gt;
#*PARAMETRI DEFINITI:&lt;br /&gt;
#*EpochLength = lunghezza in secondi dell'epoca da accumulare&lt;br /&gt;
#*LengthBeforeStimulus = lunghezza in secondi della porzione di segnale da accumulare prima dell'inizio di una stimolazione&lt;br /&gt;
#*VisualizeCollectorFiltering = se settato questo parametro consente di visualizzare l'intera epoca accumulata&lt;br /&gt;
#*STATI DEFINITI:&lt;br /&gt;
#*StimulusCodeDone = il codice dello stimolo la cui relativa epoca è stata interamente accumulata&lt;br /&gt;
#*StimulusTypeDone = il tipo relativo all'epoca appena accumulata&lt;br /&gt;
#*Riferimento su Airbat del sorgente filtro Collector: sgarlata/P3ErrPSignalProcessingGalileo/CollectorFilterGALILEO&lt;br /&gt;
#filtro di classificazione per P300 ed ErrP.&lt;br /&gt;
Per la classificazione P300 attualmente è implementato il classificatore lineare &amp;quot;Logistic&amp;quot;, mentre per la classificazione ErrP è implementato un classificatore LDA.&lt;br /&gt;
#*PARAMETRI DEFINITI:&lt;br /&gt;
#*ClassifierFunction = identifica la funzione di classificazione P300 da utilizzare (attualmente è solamente implementato il classificatore Logistic)&lt;br /&gt;
#*P3WeightMatrix = matrice in cui ogni colonna indica un canale e il numero di righe è pari al numero di campioni dell'epoca in ingresso aumentato di 1 . La prima riga di ogni colonna indica il canale sul quale applicare i pesi definiti nelle righe successive.&lt;br /&gt;
#*P3Constant = costante utilizzata dal classificatore P300 Logistic&lt;br /&gt;
#*ErrPSamplesIndex = matrice in cui per ogni riga è indicato nella prima colonna il canale segiuto dall'indice dei campioni da prelevare dal segnale d'ingresso&lt;br /&gt;
#*S, Mm, MsT, C = matrici utilizzate dal classificatore ErrP&lt;br /&gt;
#*STATI DEFINITI:&lt;br /&gt;
#*ErrPFound = questo stato è posto a 0 durante il calcolo dell'ErrP, terminato il calcolo se viene identificato un ErrP questo stato è posto a 1 altrimenti è posto a 2.&lt;br /&gt;
#*Riferimento su Airbat del sorgente filtro Collector: sgarlata/P3ErrPSignalProcessingGalileo/P3ErrPClassifier&lt;br /&gt;
#filtro che effettua la media dei valori in uscita dal filtro di classificazione&lt;br /&gt;
#*PARAMETRI DEFINITI:&lt;br /&gt;
#*EpochsToAverage = il numero di classificazioni da mediare&lt;br /&gt;
#*STATI DEFINITI:&lt;br /&gt;
#*StimulusCodeRes = il codice dello stimolo del quale è stata calcolata la media di &amp;quot;EpochsToAverage&amp;quot; stimolazioni&lt;br /&gt;
#*StimulusTypeRes = il tipo relativo allo StimulusCodeRes appena determinato&lt;br /&gt;
#*Riferimento su Airbat del sorgente filtro Media: sgarlata/P3ErrPSignalProcessingGalileo/MeanFilter&lt;br /&gt;
#un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
===Da Fare===&lt;br /&gt;
&lt;br /&gt;
* (alta) Cambiare i nomi dei parametri del classificatore ErrP; esempio: &amp;quot;S&amp;quot; diventa &amp;quot;ErrpClassifS&amp;quot;.&lt;br /&gt;
* (bassa) Fare un filtro FIR (c'è già una classe nel sorgente BCI2000) da usare in alternativa al filtro Butterworth.  Il filtro prende come parametri il vettore di pesi.  L'idea è che si genera il filtro durante l'addestramento in Matlab, e viene usato anche online.  Il problema del Butterworth è che ha una fase non lineare e quindi deforma la forma d'onda.&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
*Filtro che rileva i trigger&lt;br /&gt;
*Adattamento automatico della soglia per i trigger (Analisi switch riquadro: Bianco-&amp;gt;Nero-&amp;gt;Bianco per un tempo definito dall'utente)&lt;br /&gt;
*Accumulare forme d'onda con parti che precedono il trigger&lt;br /&gt;
*Script Matlab per verificare l'accuratezza della rilevazione dei fronti d'onda.&lt;br /&gt;
*Elencare stati e parametri usati dai filtri, e documentare quelli nuovi.&lt;br /&gt;
*Il classificatore per P300 usi questa formula:&lt;br /&gt;
  &amp;lt;math&amp;gt;L_{\rm P300} = \frac{1}{1 + exp( c + \sum_i w_i x_i )}&amp;lt;/math&amp;gt;&lt;br /&gt;
dove &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; sono i campioni EEG di tutti i canali, mentre ''c'' e &amp;lt;math&amp;gt;w_i&amp;lt;/math&amp;gt; sono dei pesi oppurtuni.&lt;br /&gt;
I &amp;lt;math&amp;gt;w_i&amp;lt;/math&amp;gt; saranno organizzati in una matrice bidimensionale, in cui ogni riga contiene: il numero del canale, seguito da tutti i pesi per quel canale.  Poi con un ulteriore parametro si potrà selezionare una funzione alternativa alla logistica.&lt;br /&gt;
&lt;br /&gt;
==Modulo applicativo speller P300==&lt;br /&gt;
&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo Applicativo: sgarlata/P3Speller&lt;br /&gt;
&lt;br /&gt;
Il modulo applicativo deve essere adattato al sistema di trigger.&lt;br /&gt;
&lt;br /&gt;
Per quanto riguarda il modulo applicativo bisogna introdurre un riquadro posto nell'angolo superiore destro dello schermo e farlo variare (bianco/nero) ogni qual volta viene effettuata una stimolazione e, prima dell'inizio della sequenza di stimolazioni, introdurre una fase preliminare in cui si fa variare (bianco/nero) il riquadro per un tempo totale preimpostato in modo da poter far determinare in maniera automatica dal filtro di Trigger il valore di soglia che permette di distinguere se siamo in fase di stimolazione (riquadro nero) o in fase di non stimolazione (riquadro bianco).&lt;br /&gt;
Terminata la fase di taratura del valore di soglia, lo speller può effettuare la sua sequenza di stimolazioni.&lt;br /&gt;
Alla fine di ogni treno di stimolazioni lo speller P300 determina, in base alle classificazioni ricevute, qual'è la stimolazione con classificazione maggiore mostrandola a video. A questo punto inizia una nuova fase in cui viene controllata la presenza dell'ErrP, se è stato identificato una forma d'onda ErrP lo speller non effettua alcuna selezione (modalità &amp;quot;free mode&amp;quot;) altrimenti seleziona la stimolazione mostrata a video precedentemente, riprendendo con una nuova sequenza di stimolazioni.&lt;br /&gt;
&lt;br /&gt;
Per le modifiche da effettuare al modulo applicativo di BCI2000 quando questo deve comunicare tramite protocollo UDP con un altro applicativo che effettua le stimolazioni su una differente macchina Linux si è invitati a visionare la relativa discussione di Roberto Massimini.&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
* (alta) Misurare lo sfasamento tra sync e stimolo	 &lt;br /&gt;
* (media) Segnalare (e recuperare, se possibile) eventuali problemi con la sincronizzazione tra stimolazione e trigger. Alla fine di ogni treno di stimolazioni, verificare che il numero di trigger e di stimolazioni siano uguali. Gli stati devono fornire abbastanza informazioni perché si possa caricare da file una registrazione &amp;quot;rovinata&amp;quot; ignorando (tutto e solo) il treno di stimolazioni fuori sincronia.&lt;br /&gt;
:Scrivere un codice di test opportuno per forzare/simulare errori nella rilevazione del trigger (non riconoscimento di un trigger o riconoscimento di un trigger spurio).&lt;br /&gt;
* (bassa) Scrivere specifiche per comunicazione tra BCI2000 e un modulo applicativo P300 esterno che gira su una macchina Linux separata&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
* Modificare lo stato StimulusBegin anche per lo stimulo ErrP&lt;br /&gt;
* Verifica del sistema per associare la stimolazione ai trigger rilevati dall'apposito filtro&lt;br /&gt;
&lt;br /&gt;
==Integrazione con ErrP==&lt;br /&gt;
&lt;br /&gt;
Il sistema basato su BCI2000 che usa P300 va espanso per poter usar anche i potenziali d'errore&lt;br /&gt;
&lt;br /&gt;
Ciò che si vuole sviluppare è un sistema che si basi su una procedura di verifica automatica tramite l'integrazione del controllo anche sui potenziali d'errore.&lt;br /&gt;
La verifica dell'Errp non è effettuato tramite media di più forme d'onda così come avviene con le rilevazioni della P300, ma sulla singola prova.&lt;br /&gt;
Infatti, dopo l'analisi delle forme d'onda P300 e la determinazione del target voluto dall'utente, si introduce una ulteriore fase in cui si mostra all'utente la probabile selezione voluta e si valuta la presenza del potenziale d'errore. Se non viene riscontrata questa forma d'onda si seleziona il target precedentemente identificato, altrimenti si ripete una nuova sequenza di stimolazioni per identificare nuovamente il target voluto.&lt;br /&gt;
&lt;br /&gt;
Schema del comportamento del classificatore LDA di Gianmaria:&lt;br /&gt;
: c - ((x - media_tr) * scala_tr * medie_tr)&lt;br /&gt;
cioè&lt;br /&gt;
: y = c1 + x * matrice&lt;br /&gt;
e la classe è l'indice del valore minimo del vettore y (che è lungo 2)&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
*Introdurre una nova fase di controllo Errp nel modulo applicativo dello speller&lt;br /&gt;
*Introdurre un nuovo filtro nella catena dei filtri che si occupa del'accumulo dei potenziali d'errore&lt;br /&gt;
*Modificare opportunamente i filtri di: classificazione, media e normalizzazione per supportare il controllo dell'Errp&lt;br /&gt;
*Fare uno script Matlab nuovo, derivato da quelli di Gianmaria, che faccia l'addestramento su dati salvati dallo speller BCI2000 in modalità &amp;quot;copy&amp;quot; e restituisca (su file) le tabelle per il classificatore pronte per essere caricate nel modulo di BCI2000.&lt;br /&gt;
:Questo viene meglio diviso in diversi script: 1. Uno script che carica un file BCI2000 in una struttura eeg_p300_data; meglio se accetta gli stessi parametri di load_eeg_data_dei.m 2. Uno script che prende una struttura eeg_p300_data, calcola l'intervallo ottimo, addestra il classificatore e salva le matrici per l'uso online. 3. Uno script che usa i 2 precedenti: carica i dati da un po' di file, li concatena, e addestra il classificatore ([[User:BernardoDalSeno|BernardoDalSeno]] 17:39, 9 July 2008 (CEST))&lt;br /&gt;
*Far funzionare lo speller in modalità &amp;quot;copy&amp;quot;: il testo viene specificato all'utente e la lettera giusta viene scelta dall'applicazione con una probabilità dell'80% (parametro), in modo da avere dati per l'addestramento sia della P300 che dell'ErrP.  Negli stati va salvata l'informazione su qual è la stimolazione che contiene una P300 (questo dovrebbe esserci già per la P300) e quale contiene un ErrP.&lt;br /&gt;
*Assicurarsi che l'attuale classificatore ErrP faccia esattamente le stesse cose di quello usato da Gianmaria (LDA sui dati grezzi).&lt;br /&gt;
*Nel filtro P3ErrPClassifier: ogni riga specifica più campioni per un solo canale; più righe possono riferirsi allo stesso canale.&lt;br /&gt;
&lt;br /&gt;
==Addestramento==&lt;br /&gt;
Il sistema per il corretto funzionamento on line richiede l'addestramento dei classificatori per il riconoscimento del potenziale P300 e del potenziale d'errore (ErrP).&lt;br /&gt;
L'intera sequenza di addestramento è divisa in 3 diverse 'sessioni'. Ogni 'sessione' è suddivisa a sua volta in diversi 'run', dove per 'run' si intende un nuovo ciclo di esecuzione dell'applicativo(speller). Per ogni sessione deve essere creata una cartella con nome: 'Iniziale_nome_utenteCognomeNumero_sessione' (es. Andrea Sgarlata sessione 001: 'asgarlata001') contenente tutte le registrazioni (file .dat) effettuate nella stessa sessione.&lt;br /&gt;
In oltre per ogni sessione deve essere compilato un file di log (log-sessione.txt da inserire nella stessa cartella della sessione, template già precompilato nella cartella sgarlata/TestParam), con i dati dell'utente e per ogni 'run' il modo di funzionamente le impedenze registrate per ogni canale ed eventuali note per esempio livello di stanchezza e concentrazione dell'utente ecc...&lt;br /&gt;
Prima di iniziare l'addestramento bisogna spiegare all'utente cosa deve fare e come si deve comportare durante l'utilizzo del sistema.&lt;br /&gt;
La prima fase di addestramento è necessaria per l'addestramento del classificatore per il potenziale P300, questa fase è svolta in modalità copy ed è suddivisa in 10 run, i diversi run si differenziano per la parola mostrata nella barra 'textToSpell'. &lt;br /&gt;
Per una corretta impostazione dell'intero sistema in questa sessione, bisogna: &lt;br /&gt;
* creare la cartella (es: 'asgarlata001').&lt;br /&gt;
* compilare il log di sessione.&lt;br /&gt;
* avviare il sistema&lt;br /&gt;
* caricare il file Sgarlata/TestParam/P3ErrpSpeller-training.prm&lt;br /&gt;
* modificare nella scheda 'Storage' il campo 'DataDirectory' indicando la cartella appena generata della sessione ed il campo 'SubjectName' indicando 'Iniziale_nome_utenteCognome'&lt;br /&gt;
&lt;br /&gt;
Impostato il sistema, tramite le operazioni appena elencate, non rimane che per ogni run caricare il file contenente la sola parola da inserire nella barra 'textToSpell' (file presenti nella cartella Sgarlata/TestParam/traning_words), quindi al primo run verrà caricato il file di parametri 'LearningSession1.prm', al secondo run il parametro 'LearningSession1.prm' e così via fin al completamento dei 10 run.&lt;br /&gt;
Terminata la prima fase con i dati raccolti si procede all'addestramento del classificatore P300 tramite lo script run_ga_speller_dei.m (si veda l'help dello script per il funzionamento), questo script utilizza un'algoritmo genetico di conseguenza è consigliabile utilizzare come parametro di ingresso la creazione di almeno 10 generazioni.&lt;br /&gt;
&lt;br /&gt;
Se non vi sono stati errori lo script genera un file di parametri che deve essere caricato nel sistema consentendo così l'addestramendo del classificatore P300 ed il passaggio alla seconda sessione.&lt;br /&gt;
&lt;br /&gt;
Nella seconda fase si mantiene il sistema configurato come nella fase precedente con la differenza che questa sessione è svolta in modalità copy ma con il classificatore P300 funzionante.&lt;br /&gt;
Quindi, si procede a creare una nuova cartella per la sessione 002, si modifica il campo 'DataDirectory' e nella scheda 'Application' deve essere posto il campo 'RightSelectionProbabiliity' uguale a 0, in questo modo il target visualizzato è quello che è stato selezionato dal classificatore P300.&lt;br /&gt;
Effettuate queste modifiche si può ripartire nuovamente con il caricare in sequenza per ogni run solamente le 10 parole definite nei parametri 'LearningSession#.prm', indicando, nel file di log, per ogni run il numero di lettere selezionate errate.&lt;br /&gt;
Terminata la seconda fase si può procedere all'addestramento del classificatore per il riconoscimento dei potenziali d'errore (ErrP). A questo scopo si utilizza uno script matlab che richiama la funzione 'train_errp_visconti_bci2000( params )' generando il file .prm con i parametri necessari al classificatore ErrP. Se lo script non è in grado di identificare una sezione dell'epocha in cui distinguere o meno la presenza di un potenziale d'errore bisogna procede alla registrazione di ulteriori run oppure provare ad introdurre nuovi canali, all'interno dei parametri passati, e ad allargare la sezione temporale in cui individuare la forma d'onda ErrP.&lt;br /&gt;
&lt;br /&gt;
Se non vi sono stati errori lo script genera un file di parametri che può essere caricato per addestrare questa volta il classificatore ErrP. A questo punto è possibile passare alla terza fase.&lt;br /&gt;
&lt;br /&gt;
Nella terza sessione si può effettuare una serie di run (un qualsiasi numero) in modalità free mode. L'utente decide quale parola ,lettera per lettera, vuole scrivere, e nel caso in cui il sistema scrive un carattere errato l'utente dovrà eliminarlo selezionando l'icona 'BS' che si occupa di cancellare l'ultima lettera inserita.&lt;br /&gt;
Anche in questa sessione è necessario creare una nuova cartella con identificativo sessione 003, modificare il campo 'DataDirectory' e nella cartella 'Application' bisogna impostare il campo 'InterpretMode' con il valore 'online free mode'. Naturalmente in fase è nuovamente necessario compilare il file di log introducendo tutte le informazioni necessarie.&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
* (altissima) Scrivere una funzione definita tra in &amp;lt;math&amp;gt;[0,1]&amp;lt;/math&amp;gt; parametrica che valga: 1 in 0 e 1; &amp;lt;math&amp;gt;1-\epsilon&amp;lt;/math&amp;gt; in ''a'' e ''c'', 0 in ''b''. &amp;lt;math&amp;gt;\epsilon&amp;lt;/math&amp;gt; è un parametro.&lt;br /&gt;
* (alta) Fare un file di parametri per addestrare la gente per P300 e ErrP (modalità copy). &lt;br /&gt;
* (alta) Fare N (con N oppurtuno) file di parametri che contengano le parole da scrivere; considerare lunghezza oppurtuna per singole registrazioni e sessioni. Il file e il nome del file contenga già il numero di sessione e registrazione.&lt;br /&gt;
* (alta) Scrivere il protocollo per gli esperimenti; cioè, quante acquisizioni fare per ogni sessione, in che modalità, quando addestrare i classificatori...&lt;br /&gt;
* (media) Lo speller in modalità copy quando genera dei feedback sbagliati (per l'addestramento ErrP) deve selezionare effettivamente un simbolo sbagliato a caso tra tutti i simboli disponibili, e non usare il classificatore P300 per questo.&lt;br /&gt;
* (bassa) Far funzionare lo speller in modalità &amp;quot;mista&amp;quot;, cioè: la stringa da scrivere è assegnata; il classificatore P300 viene usato per selezionare le lettere; in caso di lettera sbagliata viene scritta la lettera selezionata, e il simbolo successivo da selezionare sarà BackSpace.  Perché questa cosa funzioni, il tasso di errori deve essere contenuto entro un certo intervallo, definito da 3 valori (''a'',''b'',''c'') in un opportuno parametro (si potrebbe riutilizzare il parametro attualmente usato per il tasso di errori nella stimolazione ErrP); operativamente:&lt;br /&gt;
# Selezionare una lettere con il classificatore P300&lt;br /&gt;
# Calcolare la statistica ''s'' delle selezioni correte sulle ultime N selezioni&lt;br /&gt;
# Si ricava una probabilità ''p'' a partire dall'entità della deviazione dall'intervallo ammesso, usando un'opportuna funzione che dipende da ''a'', ''b'', ''c'', ''s''.&lt;br /&gt;
# Con probabilità ''p'' modificare la selezione in questo modo:&lt;br /&gt;
#* Se ''s'' &amp;lt; ''b'', la selezione corrente viene corretta, se è sbagliata&lt;br /&gt;
#* Se ''s'' &amp;gt; ''b'', la selezione corrente viene fatta diventare sbagliate, se è corretta&lt;br /&gt;
:Il risultato dovrebbe essere che la statistica sia quasi sempre all'interno dell'intervallo ''a''-''c'', e che i valori fuori dall'intervallo non si allontanino troppo dai limiti fissati.&lt;br /&gt;
:Suggerimento: Per questa cosa, fare una classe (e usare un'istanza) in cui ci sia un metodo per aggiornare la statistica e uno per dire se bisogna fare correzioni all'ultima selezione.&lt;br /&gt;
* (bassissima) Fare esperimenti con almeno un paio di soggetto in cui lo speller funziona nella modalità &amp;quot;mista&amp;quot; di cui sopra.&lt;br /&gt;
:Per scegliere il numero di ripetizioni ottimo, bisogna valutare l'accuratezza del classificatore P300 con diversi numeri di ripetizioni (offline sui dati di test) e da questa, insieme all'accuratezza del classificatore ErrP, calcolare la velocità globale dell'interfaccia usando la formula che c'è nella tesi di Bernardo Dal Seno.&lt;br /&gt;
&lt;br /&gt;
==Varie==&lt;br /&gt;
Le priorità indicate per le varie attività servono per fissare un'ordine. La tesi si conclude quando tutte le attività sono complete.&lt;/div&gt;</summary>
		<author><name>AndreaSgarlata</name></author>	</entry>

	<entry>
		<id>https://airwiki.deib.polimi.it/index.php?title=Electroencephalographs&amp;diff=3910</id>
		<title>Electroencephalographs</title>
		<link rel="alternate" type="text/html" href="https://airwiki.deib.polimi.it/index.php?title=Electroencephalographs&amp;diff=3910"/>
				<updated>2008-08-29T11:44:41Z</updated>
		
		<summary type="html">&lt;p&gt;AndreaSgarlata: /* Booking */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== BeLight ==&lt;br /&gt;
&lt;br /&gt;
A brief description of EbNeuro BeLight should go here.&lt;br /&gt;
&lt;br /&gt;
=== Connectors ===&lt;br /&gt;
* '''1-21:''' EEG inputs&lt;br /&gt;
* '''A, B, C, D''' Bipolar inputs&lt;br /&gt;
* '''NE:''' EEG reference&lt;br /&gt;
* '''ISOGN:''' EEG ground (Isolated ground)&lt;br /&gt;
* '''22-24:''' Poly channels&lt;br /&gt;
* '''NEP:''' Poly reference&lt;br /&gt;
&lt;br /&gt;
=== Booking ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Please keep the table lines ordered by time (nearest bookings first); add new entries like this:&lt;br /&gt;
---CUT---&lt;br /&gt;
| Monday 13 March || 11:00-18:00 || Donald Duck&lt;br /&gt;
|- &lt;br /&gt;
---CUT---&lt;br /&gt;
Use abbreviations, if you like.&lt;br /&gt;
Please remove old entries.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Day !! Time !! Person&lt;br /&gt;
|-&lt;br /&gt;
| Mond 25 August || 10:30-19:00 || Rossella&lt;br /&gt;
|-&lt;br /&gt;
| Wednesday 03 September || 10:00-19:00 || Bernardo&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Electrodes ===&lt;br /&gt;
&lt;br /&gt;
There are two types of electrodes: electrodes pre-mounted on caps, and single electrodes.  They are very simple, but as they are very important for the quality of the signal and are delicate (and also incredibly expensive, btw), please treat them carefully (avoid rattling them against each other, for example).&lt;br /&gt;
&lt;br /&gt;
==== Maintenance ====&lt;br /&gt;
&lt;br /&gt;
The paste or gel used during acquisitions must be thoroughly removed after use.  Please follow the following procedure:&lt;br /&gt;
# Rinse the electrodes under running water.  This step can remove only a part of the gel/paste.  Please avoid washing or wetting the plugs.&lt;br /&gt;
# Put the electrodes in a container half-filled with water (there is a suitable container in the cabinet of the IITLab), so that the electrodes are completely submerged.  Leave them there for some minutes, until all the gel/paste become dissolved.  Change the water if it becomes too murky.  Do not leave the electrodes underwater for too long.&lt;br /&gt;
# Rinse the electrodes under running water (and also rinse the container).&lt;br /&gt;
# Put the electrodes in a dry place, where they can dry up.  You can accelerate this phase by first patting them with a towel.  Again, make sure that plugs don't come in contact with water; if you hang a cap, make sure that water cannot drip along the cable onto the plug.&lt;br /&gt;
# Put the electrodes away in their bag in their box.  Please make sure that they are absolutely dry before you put them away; the coating of electrodes is rather delicate.&lt;br /&gt;
&lt;br /&gt;
Please take into account also the time for electrode cleaning when you plan your EEG acquisitions.&lt;br /&gt;
&lt;br /&gt;
== Presets ==&lt;br /&gt;
&lt;br /&gt;
Description of the presets saved in the Galileo software.&lt;br /&gt;
&lt;br /&gt;
===P300===&lt;br /&gt;
Used for P300 and ErrP recordings.  There are 4 EEG channels, 1 EOG, 2 external signals in DC; sampling frequency is 512 Hz.&lt;br /&gt;
;Channels and connectors:&lt;br /&gt;
:'''EOG''': EOG, input &amp;quot;A&amp;quot;; the &amp;quot;+&amp;quot; input for the electrode above the eye, the &amp;quot;-&amp;quot; input for the one below&lt;br /&gt;
:'''Fz''': Fz, input 7&lt;br /&gt;
:'''Cz''': Cz, input 12&lt;br /&gt;
:'''Pz''': Pz, input 17&lt;br /&gt;
:'''Oz''': Oz, input 20 (labeled as &amp;quot;O1&amp;quot; on the amplifier)&lt;br /&gt;
:'''Sync''': phototransistor for stimulus synchronization; positive lead (red) in input 22, negative lead (black) in input NEP&lt;br /&gt;
:'''Button''': button, used for target signaling; positive lead in input 23, negative lead in input NEP. If it's not used, please short the input 23 with NEP.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* [[Brain-Computer Interface]] page on this Wiki&lt;br /&gt;
* [[EEG Montage]] for instructions on how to mount electrodes&lt;/div&gt;</summary>
		<author><name>AndreaSgarlata</name></author>	</entry>

	<entry>
		<id>https://airwiki.deib.polimi.it/index.php?title=Electroencephalographs&amp;diff=3902</id>
		<title>Electroencephalographs</title>
		<link rel="alternate" type="text/html" href="https://airwiki.deib.polimi.it/index.php?title=Electroencephalographs&amp;diff=3902"/>
				<updated>2008-08-21T22:48:45Z</updated>
		
		<summary type="html">&lt;p&gt;AndreaSgarlata: /* Booking */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== BeLight ==&lt;br /&gt;
&lt;br /&gt;
A brief description of EbNeuro BeLight should go here.&lt;br /&gt;
&lt;br /&gt;
=== Connectors ===&lt;br /&gt;
* '''1-21:''' EEG inputs&lt;br /&gt;
* '''A, B, C, D''' Bipolar inputs&lt;br /&gt;
* '''NE:''' EEG reference&lt;br /&gt;
* '''ISOGN:''' EEG ground (Isolated ground)&lt;br /&gt;
* '''22-24:''' Poly channels&lt;br /&gt;
* '''NEP:''' Poly reference&lt;br /&gt;
&lt;br /&gt;
=== Booking ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Please keep the table lines ordered by time (nearest bookings first); add new entries like this:&lt;br /&gt;
---CUT---&lt;br /&gt;
| Monday 13 March || 11:00-18:00 || Donald Duck&lt;br /&gt;
|- &lt;br /&gt;
---CUT---&lt;br /&gt;
Use abbreviations, if you like.&lt;br /&gt;
Please remove old entries.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Day !! Time !! Person&lt;br /&gt;
|-&lt;br /&gt;
| Thursday 21 August || 10:00-19:00 || Bernardo &lt;br /&gt;
|-&lt;br /&gt;
| Wed (Friday?) 22 August || 10:00-14:00 || Rossella &lt;br /&gt;
|-&lt;br /&gt;
| Wednesday 27 August || 10:00-19:00 || Bernardo&lt;br /&gt;
|-&lt;br /&gt;
| Thursday 28 August || 10:00-19:00 || Bernardo&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Electrodes ===&lt;br /&gt;
&lt;br /&gt;
There are two types of electrodes: electrodes pre-mounted on caps, and single electrodes.  They are very simple, but as they are very important for the quality of the signal and are delicate (and also incredibly expensive, btw), please treat them carefully (avoid rattling them against each other, for example).&lt;br /&gt;
&lt;br /&gt;
==== Maintenance ====&lt;br /&gt;
&lt;br /&gt;
The paste or gel used during acquisitions must be thoroughly removed after use.  Please follow the following procedure:&lt;br /&gt;
# Rinse the electrodes under running water.  This step can remove only a part of the gel/paste.  Please avoid washing or wetting the plugs.&lt;br /&gt;
# Put the electrodes in a container half-filled with water (there is a suitable container in the cabinet of the IITLab), so that the electrodes are completely submerged.  Leave them there for some minutes, until all the gel/paste become dissolved.  Change the water if it becomes too murky.  Do not leave the electrodes underwater for too long.&lt;br /&gt;
# Rinse the electrodes under running water (and also rinse the container).&lt;br /&gt;
# Put the electrodes in a dry place, where they can dry up.  You can accelerate this phase by first patting them with a towel.  Again, make sure that plugs don't come in contact with water; if you hang a cap, make sure that water cannot drip along the cable onto the plug.&lt;br /&gt;
# Put the electrodes away in their bag in their box.  Please make sure that they are absolutely dry before you put them away; the coating of electrodes is rather delicate.&lt;br /&gt;
&lt;br /&gt;
Please take into account also the time for electrode cleaning when you plan your EEG acquisitions.&lt;br /&gt;
&lt;br /&gt;
== Presets ==&lt;br /&gt;
&lt;br /&gt;
Description of the presets saved in the Galileo software.&lt;br /&gt;
&lt;br /&gt;
===P300===&lt;br /&gt;
Used for P300 and ErrP recordings.  There are 4 EEG channels, 1 EOG, 2 external signals in DC; sampling frequency is 512 Hz.&lt;br /&gt;
;Channels and connectors:&lt;br /&gt;
:'''EOG''': EOG, input &amp;quot;A&amp;quot;; the &amp;quot;+&amp;quot; input for the electrode above the eye, the &amp;quot;-&amp;quot; input for the one below&lt;br /&gt;
:'''Fz''': Fz, input 7&lt;br /&gt;
:'''Cz''': Cz, input 12&lt;br /&gt;
:'''Pz''': Pz, input 17&lt;br /&gt;
:'''Oz''': Oz, input 20 (labeled as &amp;quot;O1&amp;quot; on the amplifier)&lt;br /&gt;
:'''Sync''': phototransistor for stimulus synchronization; positive lead (red) in input 22, negative lead (black) in input NEP&lt;br /&gt;
:'''Button''': button, used for target signaling; positive lead in input 23, negative lead in input NEP. If it's not used, please short the input 23 with NEP.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* [[Brain-Computer Interface]] page on this Wiki&lt;br /&gt;
* [[EEG Montage]] for instructions on how to mount electrodes&lt;/div&gt;</summary>
		<author><name>AndreaSgarlata</name></author>	</entry>

	<entry>
		<id>https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=3872</id>
		<title>Talk:Online P300 and ErrP recognition with BCI2000</title>
		<link rel="alternate" type="text/html" href="https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=3872"/>
				<updated>2008-08-17T09:11:43Z</updated>
		
		<summary type="html">&lt;p&gt;AndreaSgarlata: /* Fatto */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Plugin Galileo/Modulo sorgente BCI2000==&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo Plugin: sgarlata/Plugin&lt;br /&gt;
&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo sorgente BCI2000: sgarlata/GalileoSource&lt;br /&gt;
&lt;br /&gt;
Il sistema attualmente è composto da un plugin che si occupa di inviare i dati tramite pipe ad un altro modulo che fa parte dell'intero sistema di BCI2000.&lt;br /&gt;
&lt;br /&gt;
Per ottenere una corretta temporizzazione del sistema di BCI2000 abbiamo sfruttato il fatto che il plugin è più lento nell'invio dei dati rispetto all'intero sistema BCI2000.&lt;br /&gt;
Infatti si è deciso di inviare tramite plugin una quantità di dati costante pari a 1/16 di secondo, tenendo conto del fatto che durante l'esecuzione di una registrazione online la quantità di dati ricevuti dal plugin risulta molto regolare e costante.&lt;br /&gt;
In questo modo ogni invio di dati tramite pipe rappresenta il trascorrere di un tempo prefissato che risulta pari a 1/16 di secondo.&lt;br /&gt;
&lt;br /&gt;
Sono stati effettuati diversi test (aggiunta di un buffer di accumulo, invio di blocchi di dimensione maggiore 0.1 secondi) per cercare di mantenere il più possibile costante l'intervallo che trascorre tra l'invio di un blocco dati e quello successivo, nonostante questi tentativi abbiamo riscontrato il fatto che l'intervallo tra due blocchi risulta in media molto regolare, questa regolarità viene persa però nei momenti in cui il sistema viene perturbato da fattori esterni dovuti all'intervento dell'utente, quali ad esempio: apertura nuova finestra, spostamento finestre, apertura cartelle ecc...&lt;br /&gt;
Tutti questi fattori possono essere trascurati, in quanto durante l'esecuzione dell'intero sistema l'utente non deve interagire direttamente con il sistema, ma deve solamente essere sottoposto a delle stimolazioni, e se l'utente decide di interagire è perché sta effettuando modifiche ed in quel momento non necessita di un sistema sincrono e regolare.&lt;br /&gt;
:Noi speriamo che non capiti durante il funzionamento normale o sia molto raro ([[User:BernardoDalSeno|BernardoDalSeno]] 20:21, 24 May 2008 (CEST))&lt;br /&gt;
&lt;br /&gt;
Per tutte queste motivazioni si è deciso che il plugin non appena accumulato un blocco dati pari a 1/16 di secondo deve subito inviarlo tramite pipe, in modo da mantenere una regolarità tra l'invio consecutivo di due blocchi.&lt;br /&gt;
&lt;br /&gt;
Nel sever Airbat sono presenti i sorgenti dei differenti plugin implementati con le differenti stategie di funzionamento:&lt;br /&gt;
&lt;br /&gt;
*Cartella sgarlata/old/PluginPipe: il plugin implementato consente un invio di dati in blocchi di 0.1secondi, consentendo al modulo sorgente di BCI2000 di occuparsi dell'invio di blocchi dati di dimensioni inferiori all'interno del sistema di BCI2000. Questa strategia è stata abbandonata perchè abbiamo notato che a 512Hz il plugin riceveva blocchi di 32 campioni per ogni chiamata, e doveva inviare blocchi di 51 campioni, questa differenza faceva si che l'invio di blocchi non era regolare in quanto ad esempio dopo due chiamate inviavo un blocco da 51 campioni e poi dovevo aspettare 3 chiamate per inviare un nuovo blocco dati.&lt;br /&gt;
&lt;br /&gt;
*Cartella sgarlata/old/PluginBuffer: il plugin implementato mantiene un buffer di N blocchi dati pari a 1/16 di secondo, ed inizia l'invio di un blocco dati nel momento in cui mezzo buffer è stato riempito, utilizzando come clock di invio l'orologio di invocazione del plugin, dato che in maniera molto regolare vi era un invocazione ogni 1/16 di secondo a 512Hz. La strategia dell'utilizzo del buffer è stata abbandonata in quanto, si introduceva ritardo con il buffer ed in oltre i problemi di perdita di regolarità si verificavano comunque perchè non erano dovuti a dei mancati invii di dati da parte del plugin,ma erano dovuti al fatto che il sistema veniva perturbato da un utente esterno ed il modulo sorgente di BCI2000 attendeva nella lettura di un nuovo blocco.&lt;br /&gt;
&lt;br /&gt;
*Cartella sgarlata/old/PluginTemporizzato: questo plugin utilizza un blocco dati pari a 1/16 di secondo, ma diversamente dal plugin finale manca della stampa di diversi valori di debug e della possibilità di connessione con il sistema di BCI2000 non sincrona.&lt;br /&gt;
&lt;br /&gt;
Le diverse strategie di sviluppo del plugin sono state studiate ed implementate per poter utilizzare un applicativo di stimolazione che rimanesse sincrono con l'intero sistema e quindi che avesse la possibilità di essere implementato da un modulo applicativo di BCI2000.&lt;br /&gt;
Uno stimolatore sincrono è un vantaggio in quanto consente di farlo evolvere durante l'acquisizione dei segnali e di effettuare diverse scelte sulla base di questi e dei risultati fin ora ottenuti.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Per quanto riguarda il modulo sorgente di BCI2000 questo si occupa di leggere dalla pipe: il numero di canali, il numero di campioni per canale e la frequenza di campionamento. Una volta letti questi valori controlla che l'utente abbia inserito tra i parametri gli stessi valori letti tramite pipe, se questo non avviene blocca l'intero sistema e comunica l'errore all'utente con i valori esatti da inserire. Questa procedura viene ripetuta finché l'utente non inserisce gli stessi parametri letti dal modulo source.  Si è visto che invece non si riesce a passare i parametri dal modulo sorgente agli altri moduli di BCI2000 durante la fase di inizializzazione.&lt;br /&gt;
&lt;br /&gt;
A run time il modulo source si occupa di leggere dalla pipe una blocco di dati e di inviarlo al modulo successivo (modulo filtro); ogni blocco viene inoltrato non appena è disponibile.&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
* Script per il confronto tra dati registrati da BCI2000 e da Galileo.&lt;br /&gt;
* Misurare il numero di campioni per chiamata a varie frequenze.&lt;br /&gt;
* Eliminare la finestra del plugin, e salvare eventuali tempi (istanti) di perdite di dati (pipe piena) su file e alla fine della registrazione avvisare l'utente se ci sono state perdite. Il file verrà cancellato se non contiene errori. Nessun file di log va sovrascritto.	 &lt;br /&gt;
:Per come è fatto il sistema, è inevitabile che la pipe si riempia prima dell'inizio della registrazione vera e propria. Questo periodo non va segnalato né salvato su file (andrà ideato un opportuno sistema per identificarlo).&lt;br /&gt;
&lt;br /&gt;
==CATENA DI FILTRI DI BCI2000==&lt;br /&gt;
&lt;br /&gt;
Attualmente la catena di filtri del modulo di BCI2000 è suddivisa nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)un filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)un filtro di Trigger che si occupa di rilevare gli inizi delle stimolazioni tramite l'analisi del segnale proveniente dal fototransistor&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa di accumulare più forme d'onda p300 relative alla stessa stimolazione e tra queste farne la media&lt;br /&gt;
&lt;br /&gt;
4)un filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
Si vuole modificare sia la sequenza di filtri che il funzionamento di alcuni di questi nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)filtro di Trigger che determina in maniera automatica, tramite una fase iniziale dettata dal modulo applicativo, il valore di soglia per distinguere gli istanti di tempo in cui il riquadro è nero oppure bianco.&lt;br /&gt;
PARAMETRI DEFINITI: &lt;br /&gt;
*WindowSize = definisce la dimensione della finestra mobile utilizzata per filtrare il segnale&lt;br /&gt;
*TriggerChannel = definisce il numero del segnale sul quale identificare i trigger&lt;br /&gt;
STATI DEFINITI:&lt;br /&gt;
*TriggerFound = posto a 1 se il filtro identifica nel blocco analizzato l'inizio di una stimolazione&lt;br /&gt;
*TriggerIndex = se TriggerFound è posto a 1, questo stato contiene indice del campione nel blocco analizzato che ha determinato l'inizio dello stimolo.&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro Trigger: sgarlata/P3ErrPSignalProcessingGalileo/TriggerFilterAutoThreshold&lt;br /&gt;
&lt;br /&gt;
3)filtro butterworth passa banda con banda passante definibile tramite l'impostazione di appositi parametri (default banda passante 5Hz-10Hz, dato che i potenziali evocati hanno un andamento lento nel tempo). L'output di questo filtro è utilizzato in fase di riconoscimento dell'ErrP.&lt;br /&gt;
PARAMETRI DEFINITI: &lt;br /&gt;
*ButterworthBPLowCorner = definisce il valore di banda passante minimo&lt;br /&gt;
*ButterworthBPHighCorner = definisce il valore di banda passante massimo&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro ButterworthBP: sgarlata/P3ErrPSignalProcessingGalileo/ButterworthBP&lt;br /&gt;
&lt;br /&gt;
4)un filtro che si occupa solamente di accumulare le forme d'onda con un ring buffer che memorizza una porzione di segnale precedente.&lt;br /&gt;
PARAMETRI DEFINITI:&lt;br /&gt;
*EpochLength = lunghezza in secondi dell'epoca da accumulare&lt;br /&gt;
*LengthBeforeStimulus = lunghezza in secondi della porzione di segnale da accumulare prima dell'inizio di una stimolazione&lt;br /&gt;
*VisualizeCollectorFiltering = se settato questo parametro consente di visualizzare l'intera epoca accumulata&lt;br /&gt;
STATI DEFINITI:&lt;br /&gt;
*StimulusCodeDone = il codice dello stimolo la cui relativa epoca è stata interamente accumulata&lt;br /&gt;
*StimulusTypeDone = il tipo relativo all'epoca appena accumulata&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro Collector: sgarlata/P3ErrPSignalProcessingGalileo/CollectorFilterGALILEO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
5)filtro di classificazione per P300 ed ErrP.&lt;br /&gt;
Per la classificazione P300 attualmente è implementato il classificatore lineare &amp;quot;Logistic&amp;quot;, mentre per la classificazione ErrP è implementato un classificatore LDA.&lt;br /&gt;
PARAMETRI DEFINITI:&lt;br /&gt;
*ClassifierFunction = identifica la funzione di classificazione P300 da utilizzare (attualmente è solamente implementato il classificatore Logistic)&lt;br /&gt;
*P3WeightMatrix = matrice in cui ogni colonna indica un canale e il numero di righe è pari al numero di campioni dell'epoca in ingresso aumentato di 1 . La prima riga di ogni colonna indica il canale sul quale applicare i pesi definiti nelle righe successive.&lt;br /&gt;
*P3Constant = costante utilizzata dal classificatore P300 Logistic&lt;br /&gt;
*ErrPSamplesIndex = matrice in cui per ogni riga è indicato nella prima colonna il canale segiuto dall'indice dei campioni da prelevare dal segnale d'ingresso&lt;br /&gt;
*S, Mm, MsT, C = matrici utilizzate dal classificatore ErrP&lt;br /&gt;
STATI DEFINITI:&lt;br /&gt;
*ErrPFound = questo stato è posto a 0 durante il calcolo dell'ErrP, terminato il calcolo se viene identificato un ErrP questo stato è posto a 1 altrimenti è posto a 2.&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro Collector: sgarlata/P3ErrPSignalProcessingGalileo/P3ErrPClassifier&lt;br /&gt;
&lt;br /&gt;
6)filtro che effettua la media dei valori in uscita dal filtro di classificazione&lt;br /&gt;
PARAMETRI DEFINITI:&lt;br /&gt;
*EpochsToAverage = il numero di classificazioni da mediare&lt;br /&gt;
STATI DEFINITI:&lt;br /&gt;
*StimulusCodeRes = il codice dello stimolo del quale è stata calcolata la media di &amp;quot;EpochsToAverage&amp;quot; stimolazioni&lt;br /&gt;
*StimulusTypeRes = il tipo relativo allo StimulusCodeRes appena determinato&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro Media: sgarlata/P3ErrPSignalProcessingGalileo/MeanFilter&lt;br /&gt;
&lt;br /&gt;
7)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
Filtro che rileva i trigger&lt;br /&gt;
&lt;br /&gt;
Adattamento automatico della soglia per i trigger (Analisi switch riquadro: Bianco-&amp;gt;Nero-&amp;gt;Bianco per un tempo definito dall'utente)&lt;br /&gt;
&lt;br /&gt;
Accumulare forme d'onda con parti che precedono il trigger&lt;br /&gt;
&lt;br /&gt;
Script Matlab per verificare l'accuratezza della rilevazione dei fronti d'onda.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Elencare stati e parametri usati dai filtri, e documentare quelli nuovi.&lt;br /&gt;
&lt;br /&gt;
Il classificatore per P300 usi questa formula:&lt;br /&gt;
  &amp;lt;math&amp;gt;L_{\rm P300} = \frac{1}{1 + exp( c + \sum_i w_i x_i )}&amp;lt;/math&amp;gt;&lt;br /&gt;
dove &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; sono i campioni EEG di tutti i canali, mentre ''c'' e &amp;lt;math&amp;gt;w_i&amp;lt;/math&amp;gt; sono dei pesi oppurtuni.&lt;br /&gt;
I &amp;lt;math&amp;gt;w_i&amp;lt;/math&amp;gt; saranno organizzati in una matrice bidimensionale, in cui ogni riga contiene: il numero del canale, seguito da tutti i pesi per quel canale.  Poi con un ulteriore parametro si potrà selezionare una funzione alternativa alla logistica.&lt;br /&gt;
&lt;br /&gt;
==Modulo applicativo speller P300==&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo Applicativo: sgarlata/P3Speller&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il modulo applicativo deve essere adattato al sistema di trigger.&lt;br /&gt;
&lt;br /&gt;
Per quanto riguarda il modulo applicativo bisogna introdurre un riquadro posto nell'angolo superiore destro dello schermo e farlo variare (bianco/nero) ogni qual volta viene effettuata una stimolazione e, prima dell'inizio della sequenza di stimolazioni, introdurre una fase preliminare in cui si fa variare (bianco/nero) il riquadro per un tempo totale preimpostato in modo da poter far determinare in maniera automatica dal filtro di Trigger il valore di soglia che permette di distinguere se siamo in fase di stimolazione (riquadro nero) o in fase di non stimolazione (riquadro bianco).&lt;br /&gt;
Terminata la fase di taratura del valore di soglia, lo speller può effettuare la sua sequenza di stimolazioni.&lt;br /&gt;
Alla fine di ogni treno di stimolazioni lo speller P300 determina, in base alle classificazioni ricevute, qual'è la stimolazione con classificazione maggiore mostrandola a video. A questo punto inizia una nuova fase in cui viene controllata la presenza dell'ErrP, se è stato identificato una forma d'onda ErrP lo speller non effettua alcuna selezione (modalità &amp;quot;free mode&amp;quot;) altrimenti seleziona la stimolazione mostrata a video precedentemente, riprendendo con una nuova sequenza di stimolazioni.&lt;br /&gt;
&lt;br /&gt;
Per le modifiche da effettuare al modulo applicativo di BCI2000 quando questo deve comunicare tramite protocollo UDP con un altro applicativo che effettua le stimolazioni su una differente macchina Linux si è invitati a visionare la relativa discussione di Roberto Massimini.&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
*Modificare lo stato StimulusBegin anche per lo stimulo ErrP&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
*Misurare lo sfasamento tra sync e stimolo	 &lt;br /&gt;
*Verifica del sistema per associare la stimolazione ai trigger rilevati dall'apposito filtro&lt;br /&gt;
*Scrivere specifiche per comunicazione tra BCI2000 e un modulo applicativo P300 esterno che gira su una macchina Linux separata&lt;br /&gt;
&lt;br /&gt;
==Integrazione con ErrP==&lt;br /&gt;
&lt;br /&gt;
Il sistema basato su BCI2000 che usa P300 va espanso per poter usar anche i potenziali d'errore&lt;br /&gt;
&lt;br /&gt;
Ciò che si vuole sviluppare è un sistema che si basi su una procedura di verifica automatica tramite l'integrazione del controllo anche sui potenziali d'errore.&lt;br /&gt;
La verifica dell'Errp non è effettuato tramite media di più forme d'onda così come avviene con le rilevazioni della P300, ma sulla singola prova.&lt;br /&gt;
Infatti, dopo l'analisi delle forme d'onda P300 e la determinazione del target voluto dall'utente, si introduce una ulteriore fase in cui si mostra all'utente la probabile selezione voluta e si valuta la presenza del potenziale d'errore. Se non viene riscontrata questa forma d'onda si seleziona il target precedentemente identificato, altrimenti si ripete una nuova sequenza di stimolazioni per identificare nuovamente il target voluto.&lt;br /&gt;
&lt;br /&gt;
Schema del comportamento del classificatore LDA di Gianmaria:&lt;br /&gt;
: c - ((x - media_tr) * scala_tr * medie_tr)&lt;br /&gt;
cioè&lt;br /&gt;
: y = c1 + x * matrice&lt;br /&gt;
e la classe è l'indice del valore minimo del vettore y (che è lungo 2)&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
Introdurre una nova fase di controllo Errp nel modulo applicativo dello speller&lt;br /&gt;
&lt;br /&gt;
Introdurre un nuovo filtro nella catena dei filtri che si occupa del'accumulo dei potenziali d'errore&lt;br /&gt;
&lt;br /&gt;
Modificare opportunamente i filtri di: classificazione, media e normalizzazione per supportare il controllo dell'Errp&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Far funzionare lo speller in modalità &amp;quot;copy&amp;quot;: il testo viene specificato all'utente e la lettera giusta viene scelta dall'applicazione con una probabilità dell'80% (parametro), in modo da avere dati per l'addestramento sia della P300 che dell'ErrP.  Negli stati va salvata l'informazione su qual è la stimolazione che contiene una P300 (questo dovrebbe esserci già per la P300) e quale contiene un ErrP.&lt;br /&gt;
&lt;br /&gt;
Fare uno script Matlab nuovo, derivato da quelli di Gianmaria, che faccia l'addestramento su dati salvati dallo speller BCI2000 in modalità &amp;quot;copy&amp;quot; e restituisca (su file) le tabelle per il classificatore pronte per essere caricate nel modulo di BCI2000.&lt;br /&gt;
:Questo viene meglio diviso in diversi script: 1. Uno script che carica un file BCI2000 in una struttura eeg_p300_data; meglio se accetta gli stessi parametri di load_eeg_data_dei.m 2. Uno script che prende una struttura eeg_p300_data, calcola l'intervallo ottimo, addestra il classificatore e salva le matrici per l'uso online. 3. Uno script che usa i 2 precedenti: carica i dati da un po' di file, li concatena, e addestra il classificatore ([[User:BernardoDalSeno|BernardoDalSeno]] 17:39, 9 July 2008 (CEST))&lt;br /&gt;
&lt;br /&gt;
Assicurarsi che l'attuale classificatore ErrP faccia esattamente le stesse cose di quello usato da Gianmaria (LDA sui dati grezzi).&lt;br /&gt;
&lt;br /&gt;
Nel filtro P3ErrPClassifier: ogni riga specifica un solo intervallo; più righe possono riferirsi allo stesso canale.&lt;br /&gt;
&lt;br /&gt;
==Varie==&lt;br /&gt;
&lt;br /&gt;
Rinominare ''tutte'' le directory dei sorgenti ''in conformità allo stile di BCI2000'' e senza usare spazi.  Allineare i nomi dei moduli e quelli delle directory che li contengono.&lt;/div&gt;</summary>
		<author><name>AndreaSgarlata</name></author>	</entry>

	<entry>
		<id>https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=3871</id>
		<title>Talk:Online P300 and ErrP recognition with BCI2000</title>
		<link rel="alternate" type="text/html" href="https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=3871"/>
				<updated>2008-08-17T09:07:11Z</updated>
		
		<summary type="html">&lt;p&gt;AndreaSgarlata: /* Modulo applicativo speller P300 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Plugin Galileo/Modulo sorgente BCI2000==&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo Plugin: sgarlata/Plugin&lt;br /&gt;
&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo sorgente BCI2000: sgarlata/GalileoSource&lt;br /&gt;
&lt;br /&gt;
Il sistema attualmente è composto da un plugin che si occupa di inviare i dati tramite pipe ad un altro modulo che fa parte dell'intero sistema di BCI2000.&lt;br /&gt;
&lt;br /&gt;
Per ottenere una corretta temporizzazione del sistema di BCI2000 abbiamo sfruttato il fatto che il plugin è più lento nell'invio dei dati rispetto all'intero sistema BCI2000.&lt;br /&gt;
Infatti si è deciso di inviare tramite plugin una quantità di dati costante pari a 1/16 di secondo, tenendo conto del fatto che durante l'esecuzione di una registrazione online la quantità di dati ricevuti dal plugin risulta molto regolare e costante.&lt;br /&gt;
In questo modo ogni invio di dati tramite pipe rappresenta il trascorrere di un tempo prefissato che risulta pari a 1/16 di secondo.&lt;br /&gt;
&lt;br /&gt;
Sono stati effettuati diversi test (aggiunta di un buffer di accumulo, invio di blocchi di dimensione maggiore 0.1 secondi) per cercare di mantenere il più possibile costante l'intervallo che trascorre tra l'invio di un blocco dati e quello successivo, nonostante questi tentativi abbiamo riscontrato il fatto che l'intervallo tra due blocchi risulta in media molto regolare, questa regolarità viene persa però nei momenti in cui il sistema viene perturbato da fattori esterni dovuti all'intervento dell'utente, quali ad esempio: apertura nuova finestra, spostamento finestre, apertura cartelle ecc...&lt;br /&gt;
Tutti questi fattori possono essere trascurati, in quanto durante l'esecuzione dell'intero sistema l'utente non deve interagire direttamente con il sistema, ma deve solamente essere sottoposto a delle stimolazioni, e se l'utente decide di interagire è perché sta effettuando modifiche ed in quel momento non necessita di un sistema sincrono e regolare.&lt;br /&gt;
:Noi speriamo che non capiti durante il funzionamento normale o sia molto raro ([[User:BernardoDalSeno|BernardoDalSeno]] 20:21, 24 May 2008 (CEST))&lt;br /&gt;
&lt;br /&gt;
Per tutte queste motivazioni si è deciso che il plugin non appena accumulato un blocco dati pari a 1/16 di secondo deve subito inviarlo tramite pipe, in modo da mantenere una regolarità tra l'invio consecutivo di due blocchi.&lt;br /&gt;
&lt;br /&gt;
Nel sever Airbat sono presenti i sorgenti dei differenti plugin implementati con le differenti stategie di funzionamento:&lt;br /&gt;
&lt;br /&gt;
*Cartella sgarlata/old/PluginPipe: il plugin implementato consente un invio di dati in blocchi di 0.1secondi, consentendo al modulo sorgente di BCI2000 di occuparsi dell'invio di blocchi dati di dimensioni inferiori all'interno del sistema di BCI2000. Questa strategia è stata abbandonata perchè abbiamo notato che a 512Hz il plugin riceveva blocchi di 32 campioni per ogni chiamata, e doveva inviare blocchi di 51 campioni, questa differenza faceva si che l'invio di blocchi non era regolare in quanto ad esempio dopo due chiamate inviavo un blocco da 51 campioni e poi dovevo aspettare 3 chiamate per inviare un nuovo blocco dati.&lt;br /&gt;
&lt;br /&gt;
*Cartella sgarlata/old/PluginBuffer: il plugin implementato mantiene un buffer di N blocchi dati pari a 1/16 di secondo, ed inizia l'invio di un blocco dati nel momento in cui mezzo buffer è stato riempito, utilizzando come clock di invio l'orologio di invocazione del plugin, dato che in maniera molto regolare vi era un invocazione ogni 1/16 di secondo a 512Hz. La strategia dell'utilizzo del buffer è stata abbandonata in quanto, si introduceva ritardo con il buffer ed in oltre i problemi di perdita di regolarità si verificavano comunque perchè non erano dovuti a dei mancati invii di dati da parte del plugin,ma erano dovuti al fatto che il sistema veniva perturbato da un utente esterno ed il modulo sorgente di BCI2000 attendeva nella lettura di un nuovo blocco.&lt;br /&gt;
&lt;br /&gt;
*Cartella sgarlata/old/PluginTemporizzato: questo plugin utilizza un blocco dati pari a 1/16 di secondo, ma diversamente dal plugin finale manca della stampa di diversi valori di debug e della possibilità di connessione con il sistema di BCI2000 non sincrona.&lt;br /&gt;
&lt;br /&gt;
Le diverse strategie di sviluppo del plugin sono state studiate ed implementate per poter utilizzare un applicativo di stimolazione che rimanesse sincrono con l'intero sistema e quindi che avesse la possibilità di essere implementato da un modulo applicativo di BCI2000.&lt;br /&gt;
Uno stimolatore sincrono è un vantaggio in quanto consente di farlo evolvere durante l'acquisizione dei segnali e di effettuare diverse scelte sulla base di questi e dei risultati fin ora ottenuti.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Per quanto riguarda il modulo sorgente di BCI2000 questo si occupa di leggere dalla pipe: il numero di canali, il numero di campioni per canale e la frequenza di campionamento. Una volta letti questi valori controlla che l'utente abbia inserito tra i parametri gli stessi valori letti tramite pipe, se questo non avviene blocca l'intero sistema e comunica l'errore all'utente con i valori esatti da inserire. Questa procedura viene ripetuta finché l'utente non inserisce gli stessi parametri letti dal modulo source.  Si è visto che invece non si riesce a passare i parametri dal modulo sorgente agli altri moduli di BCI2000 durante la fase di inizializzazione.&lt;br /&gt;
&lt;br /&gt;
A run time il modulo source si occupa di leggere dalla pipe una blocco di dati e di inviarlo al modulo successivo (modulo filtro); ogni blocco viene inoltrato non appena è disponibile.&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
* Script per il confronto tra dati registrati da BCI2000 e da Galileo.&lt;br /&gt;
* Misurare il numero di campioni per chiamata a varie frequenze.&lt;br /&gt;
* Eliminare la finestra del plugin, e salvare eventuali tempi (istanti) di perdite di dati (pipe piena) su file e alla fine della registrazione avvisare l'utente se ci sono state perdite. Il file verrà cancellato se non contiene errori. Nessun file di log va sovrascritto.	 &lt;br /&gt;
:Per come è fatto il sistema, è inevitabile che la pipe si riempia prima dell'inizio della registrazione vera e propria. Questo periodo non va segnalato né salvato su file (andrà ideato un opportuno sistema per identificarlo).&lt;br /&gt;
&lt;br /&gt;
==CATENA DI FILTRI DI BCI2000==&lt;br /&gt;
&lt;br /&gt;
Attualmente la catena di filtri del modulo di BCI2000 è suddivisa nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)un filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)un filtro di Trigger che si occupa di rilevare gli inizi delle stimolazioni tramite l'analisi del segnale proveniente dal fototransistor&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa di accumulare più forme d'onda p300 relative alla stessa stimolazione e tra queste farne la media&lt;br /&gt;
&lt;br /&gt;
4)un filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
Si vuole modificare sia la sequenza di filtri che il funzionamento di alcuni di questi nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)filtro di Trigger che determina in maniera automatica, tramite una fase iniziale dettata dal modulo applicativo, il valore di soglia per distinguere gli istanti di tempo in cui il riquadro è nero oppure bianco.&lt;br /&gt;
PARAMETRI DEFINITI: &lt;br /&gt;
*WindowSize = definisce la dimensione della finestra mobile utilizzata per filtrare il segnale&lt;br /&gt;
*TriggerChannel = definisce il numero del segnale sul quale identificare i trigger&lt;br /&gt;
STATI DEFINITI:&lt;br /&gt;
*TriggerFound = posto a 1 se il filtro identifica nel blocco analizzato l'inizio di una stimolazione&lt;br /&gt;
*TriggerIndex = se TriggerFound è posto a 1, questo stato contiene indice del campione nel blocco analizzato che ha determinato l'inizio dello stimolo.&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro Trigger: sgarlata/P3ErrPSignalProcessingGalileo/TriggerFilterAutoThreshold&lt;br /&gt;
&lt;br /&gt;
3)filtro butterworth passa banda con banda passante definibile tramite l'impostazione di appositi parametri (default banda passante 5Hz-10Hz, dato che i potenziali evocati hanno un andamento lento nel tempo). L'output di questo filtro è utilizzato in fase di riconoscimento dell'ErrP.&lt;br /&gt;
PARAMETRI DEFINITI: &lt;br /&gt;
*ButterworthBPLowCorner = definisce il valore di banda passante minimo&lt;br /&gt;
*ButterworthBPHighCorner = definisce il valore di banda passante massimo&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro ButterworthBP: sgarlata/P3ErrPSignalProcessingGalileo/ButterworthBP&lt;br /&gt;
&lt;br /&gt;
4)un filtro che si occupa solamente di accumulare le forme d'onda con un ring buffer che memorizza una porzione di segnale precedente.&lt;br /&gt;
PARAMETRI DEFINITI:&lt;br /&gt;
*EpochLength = lunghezza in secondi dell'epoca da accumulare&lt;br /&gt;
*LengthBeforeStimulus = lunghezza in secondi della porzione di segnale da accumulare prima dell'inizio di una stimolazione&lt;br /&gt;
*VisualizeCollectorFiltering = se settato questo parametro consente di visualizzare l'intera epoca accumulata&lt;br /&gt;
STATI DEFINITI:&lt;br /&gt;
*StimulusCodeDone = il codice dello stimolo la cui relativa epoca è stata interamente accumulata&lt;br /&gt;
*StimulusTypeDone = il tipo relativo all'epoca appena accumulata&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro Collector: sgarlata/P3ErrPSignalProcessingGalileo/CollectorFilterGALILEO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
5)filtro di classificazione per P300 ed ErrP.&lt;br /&gt;
Per la classificazione P300 attualmente è implementato il classificatore lineare &amp;quot;Logistic&amp;quot;, mentre per la classificazione ErrP è implementato un classificatore LDA.&lt;br /&gt;
PARAMETRI DEFINITI:&lt;br /&gt;
*ClassifierFunction = identifica la funzione di classificazione P300 da utilizzare (attualmente è solamente implementato il classificatore Logistic)&lt;br /&gt;
*P3WeightMatrix = matrice in cui ogni colonna indica un canale e il numero di righe è pari al numero di campioni dell'epoca in ingresso aumentato di 1 . La prima riga di ogni colonna indica il canale sul quale applicare i pesi definiti nelle righe successive.&lt;br /&gt;
*P3Constant = costante utilizzata dal classificatore P300 Logistic&lt;br /&gt;
*ErrPSamplesIndex = matrice in cui per ogni riga è indicato nella prima colonna il canale segiuto dall'indice dei campioni da prelevare dal segnale d'ingresso&lt;br /&gt;
*S, Mm, MsT, C = matrici utilizzate dal classificatore ErrP&lt;br /&gt;
STATI DEFINITI:&lt;br /&gt;
*ErrPFound = questo stato è posto a 0 durante il calcolo dell'ErrP, terminato il calcolo se viene identificato un ErrP questo stato è posto a 1 altrimenti è posto a 2.&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro Collector: sgarlata/P3ErrPSignalProcessingGalileo/P3ErrPClassifier&lt;br /&gt;
&lt;br /&gt;
6)filtro che effettua la media dei valori in uscita dal filtro di classificazione&lt;br /&gt;
PARAMETRI DEFINITI:&lt;br /&gt;
*EpochsToAverage = il numero di classificazioni da mediare&lt;br /&gt;
STATI DEFINITI:&lt;br /&gt;
*StimulusCodeRes = il codice dello stimolo del quale è stata calcolata la media di &amp;quot;EpochsToAverage&amp;quot; stimolazioni&lt;br /&gt;
*StimulusTypeRes = il tipo relativo allo StimulusCodeRes appena determinato&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro Media: sgarlata/P3ErrPSignalProcessingGalileo/MeanFilter&lt;br /&gt;
&lt;br /&gt;
7)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
Filtro che rileva i trigger&lt;br /&gt;
&lt;br /&gt;
Adattamento automatico della soglia per i trigger (Analisi switch riquadro: Bianco-&amp;gt;Nero-&amp;gt;Bianco per un tempo definito dall'utente)&lt;br /&gt;
&lt;br /&gt;
Accumulare forme d'onda con parti che precedono il trigger&lt;br /&gt;
&lt;br /&gt;
Script Matlab per verificare l'accuratezza della rilevazione dei fronti d'onda.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Elencare stati e parametri usati dai filtri, e documentare quelli nuovi.&lt;br /&gt;
&lt;br /&gt;
Il classificatore per P300 usi questa formula:&lt;br /&gt;
  &amp;lt;math&amp;gt;L_{\rm P300} = \frac{1}{1 + exp( c + \sum_i w_i x_i )}&amp;lt;/math&amp;gt;&lt;br /&gt;
dove &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; sono i campioni EEG di tutti i canali, mentre ''c'' e &amp;lt;math&amp;gt;w_i&amp;lt;/math&amp;gt; sono dei pesi oppurtuni.&lt;br /&gt;
I &amp;lt;math&amp;gt;w_i&amp;lt;/math&amp;gt; saranno organizzati in una matrice bidimensionale, in cui ogni riga contiene: il numero del canale, seguito da tutti i pesi per quel canale.  Poi con un ulteriore parametro si potrà selezionare una funzione alternativa alla logistica.&lt;br /&gt;
&lt;br /&gt;
==Modulo applicativo speller P300==&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo Applicativo: sgarlata/P3Speller&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il modulo applicativo deve essere adattato al sistema di trigger.&lt;br /&gt;
&lt;br /&gt;
Per quanto riguarda il modulo applicativo bisogna introdurre un riquadro posto nell'angolo superiore destro dello schermo e farlo variare (bianco/nero) ogni qual volta viene effettuata una stimolazione e, prima dell'inizio della sequenza di stimolazioni, introdurre una fase preliminare in cui si fa variare (bianco/nero) il riquadro per un tempo totale preimpostato in modo da poter far determinare in maniera automatica dal filtro di Trigger il valore di soglia che permette di distinguere se siamo in fase di stimolazione (riquadro nero) o in fase di non stimolazione (riquadro bianco).&lt;br /&gt;
Terminata la fase di taratura del valore di soglia, lo speller può effettuare la sua sequenza di stimolazioni.&lt;br /&gt;
Alla fine di ogni treno di stimolazioni lo speller P300 determina, in base alle classificazioni ricevute, qual'è la stimolazione con classificazione maggiore mostrandola a video. A questo punto inizia una nuova fase in cui viene controllata la presenza dell'ErrP, se è stato identificato una forma d'onda ErrP lo speller non effettua alcuna selezione (modalità &amp;quot;free mode&amp;quot;) altrimenti seleziona la stimolazione mostrata a video precedentemente, riprendendo con una nuova sequenza di stimolazioni.&lt;br /&gt;
&lt;br /&gt;
Per le modifiche da effettuare al modulo applicativo di BCI2000 quando questo deve comunicare tramite protocollo UDP con un altro applicativo che effettua le stimolazioni su una differente macchina Linux si è invitati a visionare la relativa discussione di Roberto Massimini.&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
*Misurare lo sfasamento tra sync e stimolo	 &lt;br /&gt;
*Verifica del sistema per associare la stimolazione ai trigger rilevati dall'apposito filtro&lt;br /&gt;
*Scrivere specifiche per comunicazione tra BCI2000 e un modulo applicativo P300 esterno che gira su una macchina Linux separata&lt;br /&gt;
&lt;br /&gt;
==Integrazione con ErrP==&lt;br /&gt;
&lt;br /&gt;
Il sistema basato su BCI2000 che usa P300 va espanso per poter usar anche i potenziali d'errore&lt;br /&gt;
&lt;br /&gt;
Ciò che si vuole sviluppare è un sistema che si basi su una procedura di verifica automatica tramite l'integrazione del controllo anche sui potenziali d'errore.&lt;br /&gt;
La verifica dell'Errp non è effettuato tramite media di più forme d'onda così come avviene con le rilevazioni della P300, ma sulla singola prova.&lt;br /&gt;
Infatti, dopo l'analisi delle forme d'onda P300 e la determinazione del target voluto dall'utente, si introduce una ulteriore fase in cui si mostra all'utente la probabile selezione voluta e si valuta la presenza del potenziale d'errore. Se non viene riscontrata questa forma d'onda si seleziona il target precedentemente identificato, altrimenti si ripete una nuova sequenza di stimolazioni per identificare nuovamente il target voluto.&lt;br /&gt;
&lt;br /&gt;
Schema del comportamento del classificatore LDA di Gianmaria:&lt;br /&gt;
: c - ((x - media_tr) * scala_tr * medie_tr)&lt;br /&gt;
cioè&lt;br /&gt;
: y = c1 + x * matrice&lt;br /&gt;
e la classe è l'indice del valore minimo del vettore y (che è lungo 2)&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
Introdurre una nova fase di controllo Errp nel modulo applicativo dello speller&lt;br /&gt;
&lt;br /&gt;
Introdurre un nuovo filtro nella catena dei filtri che si occupa del'accumulo dei potenziali d'errore&lt;br /&gt;
&lt;br /&gt;
Modificare opportunamente i filtri di: classificazione, media e normalizzazione per supportare il controllo dell'Errp&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Far funzionare lo speller in modalità &amp;quot;copy&amp;quot;: il testo viene specificato all'utente e la lettera giusta viene scelta dall'applicazione con una probabilità dell'80% (parametro), in modo da avere dati per l'addestramento sia della P300 che dell'ErrP.  Negli stati va salvata l'informazione su qual è la stimolazione che contiene una P300 (questo dovrebbe esserci già per la P300) e quale contiene un ErrP.&lt;br /&gt;
&lt;br /&gt;
Fare uno script Matlab nuovo, derivato da quelli di Gianmaria, che faccia l'addestramento su dati salvati dallo speller BCI2000 in modalità &amp;quot;copy&amp;quot; e restituisca (su file) le tabelle per il classificatore pronte per essere caricate nel modulo di BCI2000.&lt;br /&gt;
:Questo viene meglio diviso in diversi script: 1. Uno script che carica un file BCI2000 in una struttura eeg_p300_data; meglio se accetta gli stessi parametri di load_eeg_data_dei.m 2. Uno script che prende una struttura eeg_p300_data, calcola l'intervallo ottimo, addestra il classificatore e salva le matrici per l'uso online. 3. Uno script che usa i 2 precedenti: carica i dati da un po' di file, li concatena, e addestra il classificatore ([[User:BernardoDalSeno|BernardoDalSeno]] 17:39, 9 July 2008 (CEST))&lt;br /&gt;
&lt;br /&gt;
Assicurarsi che l'attuale classificatore ErrP faccia esattamente le stesse cose di quello usato da Gianmaria (LDA sui dati grezzi).&lt;br /&gt;
&lt;br /&gt;
Nel filtro P3ErrPClassifier: ogni riga specifica un solo intervallo; più righe possono riferirsi allo stesso canale.&lt;br /&gt;
&lt;br /&gt;
==Varie==&lt;br /&gt;
&lt;br /&gt;
Rinominare ''tutte'' le directory dei sorgenti ''in conformità allo stile di BCI2000'' e senza usare spazi.  Allineare i nomi dei moduli e quelli delle directory che li contengono.&lt;/div&gt;</summary>
		<author><name>AndreaSgarlata</name></author>	</entry>

	<entry>
		<id>https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=3870</id>
		<title>Talk:Online P300 and ErrP recognition with BCI2000</title>
		<link rel="alternate" type="text/html" href="https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=3870"/>
				<updated>2008-08-17T08:54:51Z</updated>
		
		<summary type="html">&lt;p&gt;AndreaSgarlata: /* CATENA DI FILTRI DI BCI2000 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Plugin Galileo/Modulo sorgente BCI2000==&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo Plugin: sgarlata/Plugin&lt;br /&gt;
&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo sorgente BCI2000: sgarlata/GalileoSource&lt;br /&gt;
&lt;br /&gt;
Il sistema attualmente è composto da un plugin che si occupa di inviare i dati tramite pipe ad un altro modulo che fa parte dell'intero sistema di BCI2000.&lt;br /&gt;
&lt;br /&gt;
Per ottenere una corretta temporizzazione del sistema di BCI2000 abbiamo sfruttato il fatto che il plugin è più lento nell'invio dei dati rispetto all'intero sistema BCI2000.&lt;br /&gt;
Infatti si è deciso di inviare tramite plugin una quantità di dati costante pari a 1/16 di secondo, tenendo conto del fatto che durante l'esecuzione di una registrazione online la quantità di dati ricevuti dal plugin risulta molto regolare e costante.&lt;br /&gt;
In questo modo ogni invio di dati tramite pipe rappresenta il trascorrere di un tempo prefissato che risulta pari a 1/16 di secondo.&lt;br /&gt;
&lt;br /&gt;
Sono stati effettuati diversi test (aggiunta di un buffer di accumulo, invio di blocchi di dimensione maggiore 0.1 secondi) per cercare di mantenere il più possibile costante l'intervallo che trascorre tra l'invio di un blocco dati e quello successivo, nonostante questi tentativi abbiamo riscontrato il fatto che l'intervallo tra due blocchi risulta in media molto regolare, questa regolarità viene persa però nei momenti in cui il sistema viene perturbato da fattori esterni dovuti all'intervento dell'utente, quali ad esempio: apertura nuova finestra, spostamento finestre, apertura cartelle ecc...&lt;br /&gt;
Tutti questi fattori possono essere trascurati, in quanto durante l'esecuzione dell'intero sistema l'utente non deve interagire direttamente con il sistema, ma deve solamente essere sottoposto a delle stimolazioni, e se l'utente decide di interagire è perché sta effettuando modifiche ed in quel momento non necessita di un sistema sincrono e regolare.&lt;br /&gt;
:Noi speriamo che non capiti durante il funzionamento normale o sia molto raro ([[User:BernardoDalSeno|BernardoDalSeno]] 20:21, 24 May 2008 (CEST))&lt;br /&gt;
&lt;br /&gt;
Per tutte queste motivazioni si è deciso che il plugin non appena accumulato un blocco dati pari a 1/16 di secondo deve subito inviarlo tramite pipe, in modo da mantenere una regolarità tra l'invio consecutivo di due blocchi.&lt;br /&gt;
&lt;br /&gt;
Nel sever Airbat sono presenti i sorgenti dei differenti plugin implementati con le differenti stategie di funzionamento:&lt;br /&gt;
&lt;br /&gt;
*Cartella sgarlata/old/PluginPipe: il plugin implementato consente un invio di dati in blocchi di 0.1secondi, consentendo al modulo sorgente di BCI2000 di occuparsi dell'invio di blocchi dati di dimensioni inferiori all'interno del sistema di BCI2000. Questa strategia è stata abbandonata perchè abbiamo notato che a 512Hz il plugin riceveva blocchi di 32 campioni per ogni chiamata, e doveva inviare blocchi di 51 campioni, questa differenza faceva si che l'invio di blocchi non era regolare in quanto ad esempio dopo due chiamate inviavo un blocco da 51 campioni e poi dovevo aspettare 3 chiamate per inviare un nuovo blocco dati.&lt;br /&gt;
&lt;br /&gt;
*Cartella sgarlata/old/PluginBuffer: il plugin implementato mantiene un buffer di N blocchi dati pari a 1/16 di secondo, ed inizia l'invio di un blocco dati nel momento in cui mezzo buffer è stato riempito, utilizzando come clock di invio l'orologio di invocazione del plugin, dato che in maniera molto regolare vi era un invocazione ogni 1/16 di secondo a 512Hz. La strategia dell'utilizzo del buffer è stata abbandonata in quanto, si introduceva ritardo con il buffer ed in oltre i problemi di perdita di regolarità si verificavano comunque perchè non erano dovuti a dei mancati invii di dati da parte del plugin,ma erano dovuti al fatto che il sistema veniva perturbato da un utente esterno ed il modulo sorgente di BCI2000 attendeva nella lettura di un nuovo blocco.&lt;br /&gt;
&lt;br /&gt;
*Cartella sgarlata/old/PluginTemporizzato: questo plugin utilizza un blocco dati pari a 1/16 di secondo, ma diversamente dal plugin finale manca della stampa di diversi valori di debug e della possibilità di connessione con il sistema di BCI2000 non sincrona.&lt;br /&gt;
&lt;br /&gt;
Le diverse strategie di sviluppo del plugin sono state studiate ed implementate per poter utilizzare un applicativo di stimolazione che rimanesse sincrono con l'intero sistema e quindi che avesse la possibilità di essere implementato da un modulo applicativo di BCI2000.&lt;br /&gt;
Uno stimolatore sincrono è un vantaggio in quanto consente di farlo evolvere durante l'acquisizione dei segnali e di effettuare diverse scelte sulla base di questi e dei risultati fin ora ottenuti.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Per quanto riguarda il modulo sorgente di BCI2000 questo si occupa di leggere dalla pipe: il numero di canali, il numero di campioni per canale e la frequenza di campionamento. Una volta letti questi valori controlla che l'utente abbia inserito tra i parametri gli stessi valori letti tramite pipe, se questo non avviene blocca l'intero sistema e comunica l'errore all'utente con i valori esatti da inserire. Questa procedura viene ripetuta finché l'utente non inserisce gli stessi parametri letti dal modulo source.  Si è visto che invece non si riesce a passare i parametri dal modulo sorgente agli altri moduli di BCI2000 durante la fase di inizializzazione.&lt;br /&gt;
&lt;br /&gt;
A run time il modulo source si occupa di leggere dalla pipe una blocco di dati e di inviarlo al modulo successivo (modulo filtro); ogni blocco viene inoltrato non appena è disponibile.&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
* Script per il confronto tra dati registrati da BCI2000 e da Galileo.&lt;br /&gt;
* Misurare il numero di campioni per chiamata a varie frequenze.&lt;br /&gt;
* Eliminare la finestra del plugin, e salvare eventuali tempi (istanti) di perdite di dati (pipe piena) su file e alla fine della registrazione avvisare l'utente se ci sono state perdite. Il file verrà cancellato se non contiene errori. Nessun file di log va sovrascritto.	 &lt;br /&gt;
:Per come è fatto il sistema, è inevitabile che la pipe si riempia prima dell'inizio della registrazione vera e propria. Questo periodo non va segnalato né salvato su file (andrà ideato un opportuno sistema per identificarlo).&lt;br /&gt;
&lt;br /&gt;
==CATENA DI FILTRI DI BCI2000==&lt;br /&gt;
&lt;br /&gt;
Attualmente la catena di filtri del modulo di BCI2000 è suddivisa nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)un filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)un filtro di Trigger che si occupa di rilevare gli inizi delle stimolazioni tramite l'analisi del segnale proveniente dal fototransistor&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa di accumulare più forme d'onda p300 relative alla stessa stimolazione e tra queste farne la media&lt;br /&gt;
&lt;br /&gt;
4)un filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
Si vuole modificare sia la sequenza di filtri che il funzionamento di alcuni di questi nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)filtro di Trigger che determina in maniera automatica, tramite una fase iniziale dettata dal modulo applicativo, il valore di soglia per distinguere gli istanti di tempo in cui il riquadro è nero oppure bianco.&lt;br /&gt;
PARAMETRI DEFINITI: &lt;br /&gt;
*WindowSize = definisce la dimensione della finestra mobile utilizzata per filtrare il segnale&lt;br /&gt;
*TriggerChannel = definisce il numero del segnale sul quale identificare i trigger&lt;br /&gt;
STATI DEFINITI:&lt;br /&gt;
*TriggerFound = posto a 1 se il filtro identifica nel blocco analizzato l'inizio di una stimolazione&lt;br /&gt;
*TriggerIndex = se TriggerFound è posto a 1, questo stato contiene indice del campione nel blocco analizzato che ha determinato l'inizio dello stimolo.&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro Trigger: sgarlata/P3ErrPSignalProcessingGalileo/TriggerFilterAutoThreshold&lt;br /&gt;
&lt;br /&gt;
3)filtro butterworth passa banda con banda passante definibile tramite l'impostazione di appositi parametri (default banda passante 5Hz-10Hz, dato che i potenziali evocati hanno un andamento lento nel tempo). L'output di questo filtro è utilizzato in fase di riconoscimento dell'ErrP.&lt;br /&gt;
PARAMETRI DEFINITI: &lt;br /&gt;
*ButterworthBPLowCorner = definisce il valore di banda passante minimo&lt;br /&gt;
*ButterworthBPHighCorner = definisce il valore di banda passante massimo&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro ButterworthBP: sgarlata/P3ErrPSignalProcessingGalileo/ButterworthBP&lt;br /&gt;
&lt;br /&gt;
4)un filtro che si occupa solamente di accumulare le forme d'onda con un ring buffer che memorizza una porzione di segnale precedente.&lt;br /&gt;
PARAMETRI DEFINITI:&lt;br /&gt;
*EpochLength = lunghezza in secondi dell'epoca da accumulare&lt;br /&gt;
*LengthBeforeStimulus = lunghezza in secondi della porzione di segnale da accumulare prima dell'inizio di una stimolazione&lt;br /&gt;
*VisualizeCollectorFiltering = se settato questo parametro consente di visualizzare l'intera epoca accumulata&lt;br /&gt;
STATI DEFINITI:&lt;br /&gt;
*StimulusCodeDone = il codice dello stimolo la cui relativa epoca è stata interamente accumulata&lt;br /&gt;
*StimulusTypeDone = il tipo relativo all'epoca appena accumulata&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro Collector: sgarlata/P3ErrPSignalProcessingGalileo/CollectorFilterGALILEO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
5)filtro di classificazione per P300 ed ErrP.&lt;br /&gt;
Per la classificazione P300 attualmente è implementato il classificatore lineare &amp;quot;Logistic&amp;quot;, mentre per la classificazione ErrP è implementato un classificatore LDA.&lt;br /&gt;
PARAMETRI DEFINITI:&lt;br /&gt;
*ClassifierFunction = identifica la funzione di classificazione P300 da utilizzare (attualmente è solamente implementato il classificatore Logistic)&lt;br /&gt;
*P3WeightMatrix = matrice in cui ogni colonna indica un canale e il numero di righe è pari al numero di campioni dell'epoca in ingresso aumentato di 1 . La prima riga di ogni colonna indica il canale sul quale applicare i pesi definiti nelle righe successive.&lt;br /&gt;
*P3Constant = costante utilizzata dal classificatore P300 Logistic&lt;br /&gt;
*ErrPSamplesIndex = matrice in cui per ogni riga è indicato nella prima colonna il canale segiuto dall'indice dei campioni da prelevare dal segnale d'ingresso&lt;br /&gt;
*S, Mm, MsT, C = matrici utilizzate dal classificatore ErrP&lt;br /&gt;
STATI DEFINITI:&lt;br /&gt;
*ErrPFound = questo stato è posto a 0 durante il calcolo dell'ErrP, terminato il calcolo se viene identificato un ErrP questo stato è posto a 1 altrimenti è posto a 2.&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro Collector: sgarlata/P3ErrPSignalProcessingGalileo/P3ErrPClassifier&lt;br /&gt;
&lt;br /&gt;
6)filtro che effettua la media dei valori in uscita dal filtro di classificazione&lt;br /&gt;
PARAMETRI DEFINITI:&lt;br /&gt;
*EpochsToAverage = il numero di classificazioni da mediare&lt;br /&gt;
STATI DEFINITI:&lt;br /&gt;
*StimulusCodeRes = il codice dello stimolo del quale è stata calcolata la media di &amp;quot;EpochsToAverage&amp;quot; stimolazioni&lt;br /&gt;
*StimulusTypeRes = il tipo relativo allo StimulusCodeRes appena determinato&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro Media: sgarlata/P3ErrPSignalProcessingGalileo/MeanFilter&lt;br /&gt;
&lt;br /&gt;
7)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
Filtro che rileva i trigger&lt;br /&gt;
&lt;br /&gt;
Adattamento automatico della soglia per i trigger (Analisi switch riquadro: Bianco-&amp;gt;Nero-&amp;gt;Bianco per un tempo definito dall'utente)&lt;br /&gt;
&lt;br /&gt;
Accumulare forme d'onda con parti che precedono il trigger&lt;br /&gt;
&lt;br /&gt;
Script Matlab per verificare l'accuratezza della rilevazione dei fronti d'onda.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Elencare stati e parametri usati dai filtri, e documentare quelli nuovi.&lt;br /&gt;
&lt;br /&gt;
Il classificatore per P300 usi questa formula:&lt;br /&gt;
  &amp;lt;math&amp;gt;L_{\rm P300} = \frac{1}{1 + exp( c + \sum_i w_i x_i )}&amp;lt;/math&amp;gt;&lt;br /&gt;
dove &amp;lt;math&amp;gt;x_i&amp;lt;/math&amp;gt; sono i campioni EEG di tutti i canali, mentre ''c'' e &amp;lt;math&amp;gt;w_i&amp;lt;/math&amp;gt; sono dei pesi oppurtuni.&lt;br /&gt;
I &amp;lt;math&amp;gt;w_i&amp;lt;/math&amp;gt; saranno organizzati in una matrice bidimensionale, in cui ogni riga contiene: il numero del canale, seguito da tutti i pesi per quel canale.  Poi con un ulteriore parametro si potrà selezionare una funzione alternativa alla logistica.&lt;br /&gt;
&lt;br /&gt;
==Modulo applicativo speller P300==&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo Applicativo: sgarlata/P3Speller&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il modulo applicativo deve essere adattato al sistema di trigger.&lt;br /&gt;
&lt;br /&gt;
Per quanto riguarda il modulo applicativo bisogna introdurre un riquadro posto nell'angolo superiore destro dello schermo e farlo variare (bianco/nero) ogni qual volta viene effettuata una stimolazione e, prima dell'inizio della sequenza di stimolazioni, introdurre una fase preliminare in cui si fa variare (bianco/nero) il riquadro per un tempo totale preimpostato in modo da poter far determinare in maniera automatica dal filtro di Trigger il valore di soglia che permette di distinguere se siamo in fase di stimolazione (riquadro nero) o in fase di non stimolazione (riquadro bianco).&lt;br /&gt;
Terminata la fase di taratura del valore di soglia, lo speller può effettuare la sua sequenza di stimolazioni.&lt;br /&gt;
&lt;br /&gt;
Per le modifiche da effettuare al modulo applicativo di BCI2000 quando questo deve comunicare tramite protocollo UDP con un altro applicativo che effettua le stimolazioni su una differente macchina Linux si è invitati a visionare la relativa discussione di Roberto Massimini.&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
* Aggiungere quadrato di sync nell'applicazione speller&lt;br /&gt;
*Modificare lo stato StimulusBegin anche per lo stimulo ErrP&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
*Misurare lo sfasamento tra sync e stimolo	 &lt;br /&gt;
*Verifica del sistema per associare la stimolazione ai trigger rilevati dall'apposito filtro&lt;br /&gt;
*Scrivere specifiche per comunicazione tra BCI2000 e un modulo applicativo P300 esterno che gira su una macchina Linux separata&lt;br /&gt;
&lt;br /&gt;
==Integrazione con ErrP==&lt;br /&gt;
&lt;br /&gt;
Il sistema basato su BCI2000 che usa P300 va espanso per poter usar anche i potenziali d'errore&lt;br /&gt;
&lt;br /&gt;
Ciò che si vuole sviluppare è un sistema che si basi su una procedura di verifica automatica tramite l'integrazione del controllo anche sui potenziali d'errore.&lt;br /&gt;
La verifica dell'Errp non è effettuato tramite media di più forme d'onda così come avviene con le rilevazioni della P300, ma sulla singola prova.&lt;br /&gt;
Infatti, dopo l'analisi delle forme d'onda P300 e la determinazione del target voluto dall'utente, si introduce una ulteriore fase in cui si mostra all'utente la probabile selezione voluta e si valuta la presenza del potenziale d'errore. Se non viene riscontrata questa forma d'onda si seleziona il target precedentemente identificato, altrimenti si ripete una nuova sequenza di stimolazioni per identificare nuovamente il target voluto.&lt;br /&gt;
&lt;br /&gt;
Schema del comportamento del classificatore LDA di Gianmaria:&lt;br /&gt;
: c - ((x - media_tr) * scala_tr * medie_tr)&lt;br /&gt;
cioè&lt;br /&gt;
: y = c1 + x * matrice&lt;br /&gt;
e la classe è l'indice del valore minimo del vettore y (che è lungo 2)&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
Introdurre una nova fase di controllo Errp nel modulo applicativo dello speller&lt;br /&gt;
&lt;br /&gt;
Introdurre un nuovo filtro nella catena dei filtri che si occupa del'accumulo dei potenziali d'errore&lt;br /&gt;
&lt;br /&gt;
Modificare opportunamente i filtri di: classificazione, media e normalizzazione per supportare il controllo dell'Errp&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Far funzionare lo speller in modalità &amp;quot;copy&amp;quot;: il testo viene specificato all'utente e la lettera giusta viene scelta dall'applicazione con una probabilità dell'80% (parametro), in modo da avere dati per l'addestramento sia della P300 che dell'ErrP.  Negli stati va salvata l'informazione su qual è la stimolazione che contiene una P300 (questo dovrebbe esserci già per la P300) e quale contiene un ErrP.&lt;br /&gt;
&lt;br /&gt;
Fare uno script Matlab nuovo, derivato da quelli di Gianmaria, che faccia l'addestramento su dati salvati dallo speller BCI2000 in modalità &amp;quot;copy&amp;quot; e restituisca (su file) le tabelle per il classificatore pronte per essere caricate nel modulo di BCI2000.&lt;br /&gt;
:Questo viene meglio diviso in diversi script: 1. Uno script che carica un file BCI2000 in una struttura eeg_p300_data; meglio se accetta gli stessi parametri di load_eeg_data_dei.m 2. Uno script che prende una struttura eeg_p300_data, calcola l'intervallo ottimo, addestra il classificatore e salva le matrici per l'uso online. 3. Uno script che usa i 2 precedenti: carica i dati da un po' di file, li concatena, e addestra il classificatore ([[User:BernardoDalSeno|BernardoDalSeno]] 17:39, 9 July 2008 (CEST))&lt;br /&gt;
&lt;br /&gt;
Assicurarsi che l'attuale classificatore ErrP faccia esattamente le stesse cose di quello usato da Gianmaria (LDA sui dati grezzi).&lt;br /&gt;
&lt;br /&gt;
Nel filtro P3ErrPClassifier: ogni riga specifica un solo intervallo; più righe possono riferirsi allo stesso canale.&lt;br /&gt;
&lt;br /&gt;
==Varie==&lt;br /&gt;
&lt;br /&gt;
Rinominare ''tutte'' le directory dei sorgenti ''in conformità allo stile di BCI2000'' e senza usare spazi.  Allineare i nomi dei moduli e quelli delle directory che li contengono.&lt;/div&gt;</summary>
		<author><name>AndreaSgarlata</name></author>	</entry>

	<entry>
		<id>https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=3429</id>
		<title>Talk:Online P300 and ErrP recognition with BCI2000</title>
		<link rel="alternate" type="text/html" href="https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=3429"/>
				<updated>2008-06-14T12:59:35Z</updated>
		
		<summary type="html">&lt;p&gt;AndreaSgarlata: /* CATENA DI FILTRI DI BCI2000 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Plugin Galileo/Modulo sorgente BCI2000==&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo Plugin: sgarlata/Plugin&lt;br /&gt;
&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo sorgente BCI2000: sgarlata/GalileoSource&lt;br /&gt;
&lt;br /&gt;
Il sistema attualmente è composto da un plugin che si occupa di inviare i dati tramite pipe ad un altro modulo che fa parte dell'intero sistema di BCI2000.&lt;br /&gt;
&lt;br /&gt;
Per ottenere una corretta temporizzazione del sistema di BCI2000 abbiamo sfruttato il fatto che il plugin è più lento nell'invio dei dati rispetto all'intero sistema BCI2000.&lt;br /&gt;
Infatti si è deciso di inviare tramite plugin una quantità di dati costante pari a 1/16 di secondo, tenendo conto del fatto che durante l'esecuzione di una registrazione online la quantità di dati ricevuti dal plugin risulta molto regolare e costante.&lt;br /&gt;
In questo modo ogni invio di dati tramite pipe rappresenta il trascorrere di un tempo prefissato che risulta pari a 1/16 di secondo.&lt;br /&gt;
&lt;br /&gt;
Sono stati effettuati diversi test (aggiunta di un buffer di accumulo, invio di blocchi di dimensione maggiore 0.1 secondi) per cercare di mantenere il più possibile costante l'intervallo che trascorre tra l'invio di un blocco dati e quello successivo, nonostante questi tentativi abbiamo riscontrato il fatto che l'intervallo tra due blocchi risulta in media molto regolare, questa regolarità viene persa però nei momenti in cui il sistema viene perturbato da fattori esterni dovuti all'intervento dell'utente, quali ad esempio: apertura nuova finestra, spostamento finestre, apertura cartelle ecc...&lt;br /&gt;
Tutti questi fattori possono essere trascurati, in quanto durante l'esecuzione dell'intero sistema l'utente non deve interagire direttamente con il sistema, ma deve solamente essere sottoposto a delle stimolazioni, e se l'utente decide di interagire è perché sta effettuando modifiche ed in quel momento non necessita di un sistema sincrono e regolare.&lt;br /&gt;
:Noi speriamo che non capiti durante il funzionamento normale o sia molto raro ([[User:BernardoDalSeno|BernardoDalSeno]] 20:21, 24 May 2008 (CEST))&lt;br /&gt;
&lt;br /&gt;
Per tutte queste motivazioni si è deciso che il plugin non appena accumulato un blocco dati pari a 1/16 di secondo deve subito inviarlo tramite pipe, in modo da mantenere una regolarità tra l'invio consecutivo di due blocchi.&lt;br /&gt;
&lt;br /&gt;
Nel sever Airbat sono presenti i sorgenti dei differenti plugin implementati con le differenti stategie di funzionamento:&lt;br /&gt;
&lt;br /&gt;
*Cartella sgarlata/old/PluginPipe: il plugin implementato consente un invio di dati in blocchi di 0.1secondi, consentendo al modulo sorgente di BCI2000 di occuparsi dell'invio di blocchi dati di dimensioni inferiori all'interno del sistema di BCI2000. Questa strategia è stata abbandonata perchè abbiamo notato che a 512Hz il plugin riceveva blocchi di 32 campioni per ogni chiamata, e doveva inviare blocchi di 51 campioni, questa differenza faceva si che l'invio di blocchi non era regolare in quanto ad esempio dopo due chiamate inviavo un blocco da 51 campioni e poi dovevo aspettare 3 chiamate per inviare un nuovo blocco dati.&lt;br /&gt;
&lt;br /&gt;
*Cartella sgarlata/old/PluginBuffer: il plugin implementato mantiene un buffer di N blocchi dati pari a 1/16 di secondo, ed inizia l'invio di un blocco dati nel momento in cui mezzo buffer è stato riempito, utilizzando come clock di invio l'orologio di invocazione del plugin, dato che in maniera molto regolare vi era un invocazione ogni 1/16 di secondo a 512Hz. La strategia dell'utilizzo del buffer è stata abbandonata in quanto, si introduceva ritardo con il buffer ed in oltre i problemi di perdita di regolarità si verificavano comunque perchè non erano dovuti a dei mancati invii di dati da parte del plugin,ma erano dovuti al fatto che il sistema veniva perturbato da un utente esterno ed il modulo sorgente di BCI2000 attendeva nella lettura di un nuovo blocco.&lt;br /&gt;
&lt;br /&gt;
*Cartella sgarlata/old/PluginTemporizzato: questo plugin utilizza un blocco dati pari a 1/16 di secondo, ma diversamente dal plugin finale manca della stampa di diversi valori di debug e della possibilità di connessione con il sistema di BCI2000 non sincrona.&lt;br /&gt;
&lt;br /&gt;
Le diverse strategie di sviluppo del plugin sono state studiate ed implementate per poter utilizzare un applicativo di stimolazione che rimanesse sincrono con l'intero sistema e quindi che avesse la possibilità di essere implementato da un modulo applicativo di BCI2000.&lt;br /&gt;
Uno stimolatore sincrono è un vantaggio in quanto consente di farlo evolvere durante l'acquisizione dei segnali e di effettuare diverse scelte sulla base di questi e dei risultati fin ora ottenuti.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Per quanto riguarda il modulo sorgente di BCI2000 questo si occupa di leggere dalla pipe: il numero di canali, il numero di campioni per canale e la frequenza di campionamento. Una volta letti questi valori controlla che l'utente abbia inserito tra i parametri gli stessi valori letti tramite pipe, se questo non avviene blocca l'intero sistema e comunica l'errore all'utente con i valori esatti da inserire. Questa procedura viene ripetuta finché l'utente non inserisce gli stessi parametri letti dal modulo source.  Si è visto che invece non si riesce a passare i parametri dal modulo sorgente agli altri moduli di BCI2000 durante la fase di inizializzazione.&lt;br /&gt;
&lt;br /&gt;
A run time il modulo source si occupa di leggere dalla pipe una blocco di dati e di inviarlo al modulo successivo (modulo filtro); ogni blocco viene inoltrato non appena è disponibile.&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
* Script per il confronto tra dati registrati da BCI2000 e da Galileo.&lt;br /&gt;
&lt;br /&gt;
==CATENA DI FILTRI DI BCI2000==&lt;br /&gt;
&lt;br /&gt;
Attualmente la catena di filtri del modulo di BCI2000 è suddivisa nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)un filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)un filtro di Trigger che si occupa di rilevare gli inizi delle stimolazioni tramite l'analisi del segnale proveniente dal fototransistor&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa di accumulare più forme d'onda p300 relative alla stessa stimolazione e tra queste farne la media&lt;br /&gt;
&lt;br /&gt;
4)un filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
Si vuole modificare sia la sequenza di filtri che il funzionamento di alcuni di questi nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)filtro di Trigger che determina in maniera automatica, tramite una fase iniziale dettata dal modulo applicativo, il valore di soglia per distinguere gli istanti di tempo in cui il riquadro è nero oppure bianco&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro Trigger: sgarlata/P3ErrPSignalProcessingGalileo/TriggerFilterAutoThreshold&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa solamente di accumulare le forme d'onda con un ring buffer che memorizza una porzione di segnale precedente&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro Collector: sgarlata/P3ErrPSignalProcessingGalileo/CollectorFilterGALILEO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4)filtro di classificazione per P300 ed ErrP&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro Collector: sgarlata/P3ErrPSignalProcessingGalileo/P3ErrPClassifier&lt;br /&gt;
&lt;br /&gt;
5)filtro che effettua la media dei valori in uscita dal filtro di classificazione&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro Media: sgarlata/P3ErrPSignalProcessingGalileo/MeanFilter&lt;br /&gt;
&lt;br /&gt;
6)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
Filtro che rileva i trigger&lt;br /&gt;
&lt;br /&gt;
Adattamento automatico della soglia per i trigger (Analisi switch riquadro: Bianco-&amp;gt;Nero-&amp;gt;Bianco per un tempo definito dall'utente)&lt;br /&gt;
&lt;br /&gt;
Accumulare forme d'onda con parti che precedono il trigger&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Verificare l'accuratezza della rilevazione dei fronti d'onda, con script Matlab.&lt;br /&gt;
&lt;br /&gt;
==Modulo applicativo speller P300==&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo Applicativo: sgarlata/P3Speller&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il modulo applicativo deve essere adattato al sistema di trigger.&lt;br /&gt;
&lt;br /&gt;
Per quanto riguarda il modulo applicativo bisogna introdurre un riquadro posto nell'angolo superiore destro dello schermo e farlo variare (bianco/nero) ogni qual volta viene effettuata una stimolazione e, prima dell'inizio della sequenza di stimolazioni, introdurre una fase preliminare in cui si fa variare (bianco/nero) il riquadro per un tempo totale preimpostato in modo da poter far determinare in maniera automatica dal filtro di Trigger il valore di soglia che permette di distinguere se siamo in fase di stimolazione (riquadro nero) o in fase di non stimolazione (riquadro bianco).&lt;br /&gt;
Terminata la fase di taratura del valore di soglia, lo speller può effettuare la sua sequenza di stimolazioni.&lt;br /&gt;
&lt;br /&gt;
Per le modifiche da effettuare al modulo applicativo di BCI2000 quando questo deve comunicare tramite protocollo UDP con un altro applicativo che effettua le stimolazioni su una differente macchina Linux si è invitati a visionare la relativa discussione di Roberto Massimini.&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
Aggiungere quadrato di sync nell'applicazione speller&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Scrivere specifiche per comunicazione tra BCI2000 e un modulo applicativo P300 esterno che gira su una macchina Linux separata&lt;br /&gt;
&lt;br /&gt;
==Integrazione con ErrP==&lt;br /&gt;
&lt;br /&gt;
Il sistema basato su BCI2000 che usa P300 va espanso per poter usar anche i potenziali d'errore&lt;br /&gt;
&lt;br /&gt;
Ciò che si vuole sviluppare è un sistema che si basi su una procedura di verifica automatica tramite l'integrazione del controllo anche sui potenziali d'errore.&lt;br /&gt;
La verifica dell'Errp non è effettuato tramite media di più forme d'onda così come avviene con le rilevazioni della P300, ma sulla singola prova.&lt;br /&gt;
Infatti, dopo l'analisi delle forme d'onda P300 e la determinazione del target voluto dall'utente, si introduce una ulteriore fase in cui si mostra all'utente la probabile selezione voluta e si valuta la presenza del potenziale d'errore. Se non viene riscontrata questa forma d'onda si seleziona il target precedentemente identificato, altrimenti si ripete una nuova sequenza di stimolazioni per identificare nuovamente il target voluto.&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
Introdurre una nova fase di controllo Errp nel modulo applicativo dello speller&lt;br /&gt;
&lt;br /&gt;
Introdurre un nuovo filtro nella catena dei filtri che si occupa del'accumulo dei potenziali d'errore&lt;br /&gt;
&lt;br /&gt;
Modificare opportunamente i filtri di: classificazione, media e normalizzazione per supportare il controllo dell'Errp&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Fare uno script Matlab nuovo, derivato da quelli di Gianmaria, che faccia l'addestramento su dati salvati e restituisca (su file) le tabelle per il classificatore pronte per essere caricate nel modulo di BCI2000.&lt;br /&gt;
&lt;br /&gt;
Nel filtro P3ErrPClassifier: ogni riga specifica un solo intervallo; più righe possono riferirsi allo stesso canale.&lt;br /&gt;
&lt;br /&gt;
==Varie==&lt;br /&gt;
&lt;br /&gt;
Rinominare ''tutte'' le directory dei sorgenti ''in conformità allo stile di BCI2000'' e senza usare spazi.  Allineare i nomi dei moduli e quelli delle directory che li contengono.&lt;/div&gt;</summary>
		<author><name>AndreaSgarlata</name></author>	</entry>

	<entry>
		<id>https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=3428</id>
		<title>Talk:Online P300 and ErrP recognition with BCI2000</title>
		<link rel="alternate" type="text/html" href="https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=3428"/>
				<updated>2008-06-14T12:57:05Z</updated>
		
		<summary type="html">&lt;p&gt;AndreaSgarlata: /* Plugin Galileo/Modulo sorgente BCI2000 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Plugin Galileo/Modulo sorgente BCI2000==&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo Plugin: sgarlata/Plugin&lt;br /&gt;
&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo sorgente BCI2000: sgarlata/GalileoSource&lt;br /&gt;
&lt;br /&gt;
Il sistema attualmente è composto da un plugin che si occupa di inviare i dati tramite pipe ad un altro modulo che fa parte dell'intero sistema di BCI2000.&lt;br /&gt;
&lt;br /&gt;
Per ottenere una corretta temporizzazione del sistema di BCI2000 abbiamo sfruttato il fatto che il plugin è più lento nell'invio dei dati rispetto all'intero sistema BCI2000.&lt;br /&gt;
Infatti si è deciso di inviare tramite plugin una quantità di dati costante pari a 1/16 di secondo, tenendo conto del fatto che durante l'esecuzione di una registrazione online la quantità di dati ricevuti dal plugin risulta molto regolare e costante.&lt;br /&gt;
In questo modo ogni invio di dati tramite pipe rappresenta il trascorrere di un tempo prefissato che risulta pari a 1/16 di secondo.&lt;br /&gt;
&lt;br /&gt;
Sono stati effettuati diversi test (aggiunta di un buffer di accumulo, invio di blocchi di dimensione maggiore 0.1 secondi) per cercare di mantenere il più possibile costante l'intervallo che trascorre tra l'invio di un blocco dati e quello successivo, nonostante questi tentativi abbiamo riscontrato il fatto che l'intervallo tra due blocchi risulta in media molto regolare, questa regolarità viene persa però nei momenti in cui il sistema viene perturbato da fattori esterni dovuti all'intervento dell'utente, quali ad esempio: apertura nuova finestra, spostamento finestre, apertura cartelle ecc...&lt;br /&gt;
Tutti questi fattori possono essere trascurati, in quanto durante l'esecuzione dell'intero sistema l'utente non deve interagire direttamente con il sistema, ma deve solamente essere sottoposto a delle stimolazioni, e se l'utente decide di interagire è perché sta effettuando modifiche ed in quel momento non necessita di un sistema sincrono e regolare.&lt;br /&gt;
:Noi speriamo che non capiti durante il funzionamento normale o sia molto raro ([[User:BernardoDalSeno|BernardoDalSeno]] 20:21, 24 May 2008 (CEST))&lt;br /&gt;
&lt;br /&gt;
Per tutte queste motivazioni si è deciso che il plugin non appena accumulato un blocco dati pari a 1/16 di secondo deve subito inviarlo tramite pipe, in modo da mantenere una regolarità tra l'invio consecutivo di due blocchi.&lt;br /&gt;
&lt;br /&gt;
Nel sever Airbat sono presenti i sorgenti dei differenti plugin implementati con le differenti stategie di funzionamento:&lt;br /&gt;
&lt;br /&gt;
*Cartella sgarlata/old/PluginPipe: il plugin implementato consente un invio di dati in blocchi di 0.1secondi, consentendo al modulo sorgente di BCI2000 di occuparsi dell'invio di blocchi dati di dimensioni inferiori all'interno del sistema di BCI2000. Questa strategia è stata abbandonata perchè abbiamo notato che a 512Hz il plugin riceveva blocchi di 32 campioni per ogni chiamata, e doveva inviare blocchi di 51 campioni, questa differenza faceva si che l'invio di blocchi non era regolare in quanto ad esempio dopo due chiamate inviavo un blocco da 51 campioni e poi dovevo aspettare 3 chiamate per inviare un nuovo blocco dati.&lt;br /&gt;
&lt;br /&gt;
*Cartella sgarlata/old/PluginBuffer: il plugin implementato mantiene un buffer di N blocchi dati pari a 1/16 di secondo, ed inizia l'invio di un blocco dati nel momento in cui mezzo buffer è stato riempito, utilizzando come clock di invio l'orologio di invocazione del plugin, dato che in maniera molto regolare vi era un invocazione ogni 1/16 di secondo a 512Hz. La strategia dell'utilizzo del buffer è stata abbandonata in quanto, si introduceva ritardo con il buffer ed in oltre i problemi di perdita di regolarità si verificavano comunque perchè non erano dovuti a dei mancati invii di dati da parte del plugin,ma erano dovuti al fatto che il sistema veniva perturbato da un utente esterno ed il modulo sorgente di BCI2000 attendeva nella lettura di un nuovo blocco.&lt;br /&gt;
&lt;br /&gt;
*Cartella sgarlata/old/PluginTemporizzato: questo plugin utilizza un blocco dati pari a 1/16 di secondo, ma diversamente dal plugin finale manca della stampa di diversi valori di debug e della possibilità di connessione con il sistema di BCI2000 non sincrona.&lt;br /&gt;
&lt;br /&gt;
Le diverse strategie di sviluppo del plugin sono state studiate ed implementate per poter utilizzare un applicativo di stimolazione che rimanesse sincrono con l'intero sistema e quindi che avesse la possibilità di essere implementato da un modulo applicativo di BCI2000.&lt;br /&gt;
Uno stimolatore sincrono è un vantaggio in quanto consente di farlo evolvere durante l'acquisizione dei segnali e di effettuare diverse scelte sulla base di questi e dei risultati fin ora ottenuti.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Per quanto riguarda il modulo sorgente di BCI2000 questo si occupa di leggere dalla pipe: il numero di canali, il numero di campioni per canale e la frequenza di campionamento. Una volta letti questi valori controlla che l'utente abbia inserito tra i parametri gli stessi valori letti tramite pipe, se questo non avviene blocca l'intero sistema e comunica l'errore all'utente con i valori esatti da inserire. Questa procedura viene ripetuta finché l'utente non inserisce gli stessi parametri letti dal modulo source.  Si è visto che invece non si riesce a passare i parametri dal modulo sorgente agli altri moduli di BCI2000 durante la fase di inizializzazione.&lt;br /&gt;
&lt;br /&gt;
A run time il modulo source si occupa di leggere dalla pipe una blocco di dati e di inviarlo al modulo successivo (modulo filtro); ogni blocco viene inoltrato non appena è disponibile.&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
* Script per il confronto tra dati registrati da BCI2000 e da Galileo.&lt;br /&gt;
&lt;br /&gt;
==CATENA DI FILTRI DI BCI2000==&lt;br /&gt;
&lt;br /&gt;
Attualmente la catena di filtri del modulo di BCI2000 è suddivisa nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)un filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)un filtro di Trigger che si occupa di rilevare gli inizi delle stimolazioni tramite l'analisi del segnale proveniente dal fototransistor&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa di accumulare più forme d'onda p300 relative alla stessa stimolazione e tra queste farne la media&lt;br /&gt;
&lt;br /&gt;
4)un filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
Si vuole modificare sia la sequenza di filtri che il funzionamento di alcuni di questi nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)filtro di Trigger che determina in maniera automatica, tramite una fase iniziale dettata dal modulo applicativo, il valore di soglia per distinguere gli istanti di tempo in cui il riquadro è nero oppure bianco&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro Trigger: sgarlata/P3SignalProcessingGalileo/TriggerFilterAutoThreshold&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa solamente di accumulare le forme d'onda p300 con un ring buffer che memorizza una porzione di segnale precedente, dato che noi rileviamo l'inizio di una stimolazione con un ritardo che è pari alla dimensione della finestra mobile fatta scorrere lungo il segnale di trigger&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro P300: sgarlata/P3SignalProcessingGalileo/P3CollectorFilterGALILEO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4)filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)filtro che effettua la media dei valori in uscita dal filtro di classificazione&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro Media: sgarlata/P3SignalProcessingGalileo/MeanFilter&lt;br /&gt;
&lt;br /&gt;
6)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
Filtro che rileva i trigger&lt;br /&gt;
&lt;br /&gt;
Adattamento automatico della soglia per i trigger (Analisi switch riquadro: Bianco-&amp;gt;Nero-&amp;gt;Bianco per un tempo definito dall'utente)&lt;br /&gt;
&lt;br /&gt;
Accumulare forme d'onda con parti che precedono il trigger&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Verificare l'accuratezza della rilevazione dei fronti d'onda, con script Matlab.&lt;br /&gt;
&lt;br /&gt;
==Modulo applicativo speller P300==&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo Applicativo: sgarlata/P3Speller&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il modulo applicativo deve essere adattato al sistema di trigger.&lt;br /&gt;
&lt;br /&gt;
Per quanto riguarda il modulo applicativo bisogna introdurre un riquadro posto nell'angolo superiore destro dello schermo e farlo variare (bianco/nero) ogni qual volta viene effettuata una stimolazione e, prima dell'inizio della sequenza di stimolazioni, introdurre una fase preliminare in cui si fa variare (bianco/nero) il riquadro per un tempo totale preimpostato in modo da poter far determinare in maniera automatica dal filtro di Trigger il valore di soglia che permette di distinguere se siamo in fase di stimolazione (riquadro nero) o in fase di non stimolazione (riquadro bianco).&lt;br /&gt;
Terminata la fase di taratura del valore di soglia, lo speller può effettuare la sua sequenza di stimolazioni.&lt;br /&gt;
&lt;br /&gt;
Per le modifiche da effettuare al modulo applicativo di BCI2000 quando questo deve comunicare tramite protocollo UDP con un altro applicativo che effettua le stimolazioni su una differente macchina Linux si è invitati a visionare la relativa discussione di Roberto Massimini.&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
Aggiungere quadrato di sync nell'applicazione speller&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Scrivere specifiche per comunicazione tra BCI2000 e un modulo applicativo P300 esterno che gira su una macchina Linux separata&lt;br /&gt;
&lt;br /&gt;
==Integrazione con ErrP==&lt;br /&gt;
&lt;br /&gt;
Il sistema basato su BCI2000 che usa P300 va espanso per poter usar anche i potenziali d'errore&lt;br /&gt;
&lt;br /&gt;
Ciò che si vuole sviluppare è un sistema che si basi su una procedura di verifica automatica tramite l'integrazione del controllo anche sui potenziali d'errore.&lt;br /&gt;
La verifica dell'Errp non è effettuato tramite media di più forme d'onda così come avviene con le rilevazioni della P300, ma sulla singola prova.&lt;br /&gt;
Infatti, dopo l'analisi delle forme d'onda P300 e la determinazione del target voluto dall'utente, si introduce una ulteriore fase in cui si mostra all'utente la probabile selezione voluta e si valuta la presenza del potenziale d'errore. Se non viene riscontrata questa forma d'onda si seleziona il target precedentemente identificato, altrimenti si ripete una nuova sequenza di stimolazioni per identificare nuovamente il target voluto.&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
Introdurre una nova fase di controllo Errp nel modulo applicativo dello speller&lt;br /&gt;
&lt;br /&gt;
Introdurre un nuovo filtro nella catena dei filtri che si occupa del'accumulo dei potenziali d'errore&lt;br /&gt;
&lt;br /&gt;
Modificare opportunamente i filtri di: classificazione, media e normalizzazione per supportare il controllo dell'Errp&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Fare uno script Matlab nuovo, derivato da quelli di Gianmaria, che faccia l'addestramento su dati salvati e restituisca (su file) le tabelle per il classificatore pronte per essere caricate nel modulo di BCI2000.&lt;br /&gt;
&lt;br /&gt;
Nel filtro P3ErrPClassifier: ogni riga specifica un solo intervallo; più righe possono riferirsi allo stesso canale.&lt;br /&gt;
&lt;br /&gt;
==Varie==&lt;br /&gt;
&lt;br /&gt;
Rinominare ''tutte'' le directory dei sorgenti ''in conformità allo stile di BCI2000'' e senza usare spazi.  Allineare i nomi dei moduli e quelli delle directory che li contengono.&lt;/div&gt;</summary>
		<author><name>AndreaSgarlata</name></author>	</entry>

	<entry>
		<id>https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=3427</id>
		<title>Talk:Online P300 and ErrP recognition with BCI2000</title>
		<link rel="alternate" type="text/html" href="https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=3427"/>
				<updated>2008-06-14T12:55:51Z</updated>
		
		<summary type="html">&lt;p&gt;AndreaSgarlata: /* Da fare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Plugin Galileo/Modulo sorgente BCI2000==&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo Plugin: sgarlata/Plugin&lt;br /&gt;
&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo sorgente BCI2000: sgarlata/GalileoSourceJitter&lt;br /&gt;
&lt;br /&gt;
Il sistema attualmente è composto da un plugin che si occupa di inviare i dati tramite pipe ad un altro modulo che fa parte dell'intero sistema di BCI2000.&lt;br /&gt;
&lt;br /&gt;
Per ottenere una corretta temporizzazione del sistema di BCI2000 abbiamo sfruttato il fatto che il plugin è più lento nell'invio dei dati rispetto all'intero sistema BCI2000.&lt;br /&gt;
Infatti si è deciso di inviare tramite plugin una quantità di dati costante pari a 1/16 di secondo, tenendo conto del fatto che durante l'esecuzione di una registrazione online la quantità di dati ricevuti dal plugin risulta molto regolare e costante.&lt;br /&gt;
In questo modo ogni invio di dati tramite pipe rappresenta il trascorrere di un tempo prefissato che risulta pari a 1/16 di secondo.&lt;br /&gt;
&lt;br /&gt;
Sono stati effettuati diversi test (aggiunta di un buffer di accumulo, invio di blocchi di dimensione maggiore 0.1 secondi) per cercare di mantenere il più possibile costante l'intervallo che trascorre tra l'invio di un blocco dati e quello successivo, nonostante questi tentativi abbiamo riscontrato il fatto che l'intervallo tra due blocchi risulta in media molto regolare, questa regolarità viene persa però nei momenti in cui il sistema viene perturbato da fattori esterni dovuti all'intervento dell'utente, quali ad esempio: apertura nuova finestra, spostamento finestre, apertura cartelle ecc...&lt;br /&gt;
Tutti questi fattori possono essere trascurati, in quanto durante l'esecuzione dell'intero sistema l'utente non deve interagire direttamente con il sistema, ma deve solamente essere sottoposto a delle stimolazioni, e se l'utente decide di interagire è perché sta effettuando modifiche ed in quel momento non necessita di un sistema sincrono e regolare.&lt;br /&gt;
:Noi speriamo che non capiti durante il funzionamento normale o sia molto raro ([[User:BernardoDalSeno|BernardoDalSeno]] 20:21, 24 May 2008 (CEST))&lt;br /&gt;
&lt;br /&gt;
Per tutte queste motivazioni si è deciso che il plugin non appena accumulato un blocco dati pari a 1/16 di secondo deve subito inviarlo tramite pipe, in modo da mantenere una regolarità tra l'invio consecutivo di due blocchi.&lt;br /&gt;
&lt;br /&gt;
Nel sever Airbat sono presenti i sorgenti dei differenti plugin implementati con le differenti stategie di funzionamento:&lt;br /&gt;
&lt;br /&gt;
*Cartella sgarlata/PluginPipe: il plugin implementato consente un invio di dati in blocchi di 0.1secondi, consentendo al modulo sorgente di BCI2000 di occuparsi dell'invio di blocchi dati di dimensioni inferiori all'interno del sistema di BCI2000. Questa strategia è stata abbandonata perchè abbiamo notato che a 512Hz il plugin riceveva blocchi di 32 campioni per ogni chiamata, e doveva inviare blocchi di 51 campioni, questa differenza faceva si che l'invio di blocchi non era regolare in quanto ad esempio dopo due chiamate inviavo un blocco da 51 campioni e poi dovevo aspettare 3 chiamate per inviare un nuovo blocco dati.&lt;br /&gt;
&lt;br /&gt;
*Cartella sgarlata/PluginBuffer: il plugin implementato mantiene un buffer di N blocchi dati pari a 1/16 di secondo, ed inizia l'invio di un blocco dati nel momento in cui mezzo buffer è stato riempito, utilizzando come clock di invio l'orologio di invocazione del plugin, dato che in maniera molto regolare vi era un invocazione ogni 1/16 di secondo a 512Hz. La strategia dell'utilizzo del buffer è stata abbandonata in quanto, si introduceva ritardo con il buffer ed in oltre i problemi di perdita di regolarità si verificavano comunque perchè non erano dovuti a dei mancati invii di dati da parte del plugin,ma erano dovuti al fatto che il sistema veniva perturbato da un utente esterno ed il modulo sorgente di BCI2000 attendeva nella lettura di un nuovo blocco.&lt;br /&gt;
&lt;br /&gt;
*Cartella sgarlata/PluginTemporizzato: questo plugin utilizza un blocco dati pari a 1/16 di secondo, ma diversamente dal plugin finale manca della stampa di diversi valori di debug e della possibilità di connessione con il sistema di BCI2000 non sincrona.&lt;br /&gt;
&lt;br /&gt;
Le diverse strategie di sviluppo del plugin sono state studiate ed implementate per poter utilizzare un applicativo di stimolazione che rimanesse sincrono con l'intero sistema e quindi che avesse la possibilità di essere implementato da un modulo applicativo di BCI2000.&lt;br /&gt;
Uno stimolatore sincrono è un vantaggio in quanto consente di farlo evolvere durante l'acquisizione dei segnali e di effettuare diverse scelte sulla base di questi e dei risultati fin ora ottenuti.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Per quanto riguarda il modulo sorgente di BCI2000 questo si occupa di leggere dalla pipe: il numero di canali, il numero di campioni per canale e la frequenza di campionamento. Una volta letti questi valori controlla che l'utente abbia inserito tra i parametri gli stessi valori letti tramite pipe, se questo non avviene blocca l'intero sistema e comunica l'errore all'utente con i valori esatti da inserire. Questa procedura viene ripetuta finché l'utente non inserisce gli stessi parametri letti dal modulo source.  Si è visto che invece non si riesce a passare i parametri dal modulo sorgente agli altri moduli di BCI2000 durante la fase di inizializzazione.&lt;br /&gt;
&lt;br /&gt;
A run time il modulo source si occupa di leggere dalla pipe una blocco di dati e di inviarlo al modulo successivo (modulo filtro); ogni blocco viene inoltrato non appena è disponibile.&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
* Script per il confronto tra dati registrati da BCI2000 e da Galileo.&lt;br /&gt;
&lt;br /&gt;
==CATENA DI FILTRI DI BCI2000==&lt;br /&gt;
&lt;br /&gt;
Attualmente la catena di filtri del modulo di BCI2000 è suddivisa nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)un filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)un filtro di Trigger che si occupa di rilevare gli inizi delle stimolazioni tramite l'analisi del segnale proveniente dal fototransistor&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa di accumulare più forme d'onda p300 relative alla stessa stimolazione e tra queste farne la media&lt;br /&gt;
&lt;br /&gt;
4)un filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
Si vuole modificare sia la sequenza di filtri che il funzionamento di alcuni di questi nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)filtro di Trigger che determina in maniera automatica, tramite una fase iniziale dettata dal modulo applicativo, il valore di soglia per distinguere gli istanti di tempo in cui il riquadro è nero oppure bianco&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro Trigger: sgarlata/P3SignalProcessingGalileo/TriggerFilterAutoThreshold&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa solamente di accumulare le forme d'onda p300 con un ring buffer che memorizza una porzione di segnale precedente, dato che noi rileviamo l'inizio di una stimolazione con un ritardo che è pari alla dimensione della finestra mobile fatta scorrere lungo il segnale di trigger&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro P300: sgarlata/P3SignalProcessingGalileo/P3CollectorFilterGALILEO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4)filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)filtro che effettua la media dei valori in uscita dal filtro di classificazione&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro Media: sgarlata/P3SignalProcessingGalileo/MeanFilter&lt;br /&gt;
&lt;br /&gt;
6)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
Filtro che rileva i trigger&lt;br /&gt;
&lt;br /&gt;
Adattamento automatico della soglia per i trigger (Analisi switch riquadro: Bianco-&amp;gt;Nero-&amp;gt;Bianco per un tempo definito dall'utente)&lt;br /&gt;
&lt;br /&gt;
Accumulare forme d'onda con parti che precedono il trigger&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Verificare l'accuratezza della rilevazione dei fronti d'onda, con script Matlab.&lt;br /&gt;
&lt;br /&gt;
==Modulo applicativo speller P300==&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo Applicativo: sgarlata/P3Speller&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il modulo applicativo deve essere adattato al sistema di trigger.&lt;br /&gt;
&lt;br /&gt;
Per quanto riguarda il modulo applicativo bisogna introdurre un riquadro posto nell'angolo superiore destro dello schermo e farlo variare (bianco/nero) ogni qual volta viene effettuata una stimolazione e, prima dell'inizio della sequenza di stimolazioni, introdurre una fase preliminare in cui si fa variare (bianco/nero) il riquadro per un tempo totale preimpostato in modo da poter far determinare in maniera automatica dal filtro di Trigger il valore di soglia che permette di distinguere se siamo in fase di stimolazione (riquadro nero) o in fase di non stimolazione (riquadro bianco).&lt;br /&gt;
Terminata la fase di taratura del valore di soglia, lo speller può effettuare la sua sequenza di stimolazioni.&lt;br /&gt;
&lt;br /&gt;
Per le modifiche da effettuare al modulo applicativo di BCI2000 quando questo deve comunicare tramite protocollo UDP con un altro applicativo che effettua le stimolazioni su una differente macchina Linux si è invitati a visionare la relativa discussione di Roberto Massimini.&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
Aggiungere quadrato di sync nell'applicazione speller&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Scrivere specifiche per comunicazione tra BCI2000 e un modulo applicativo P300 esterno che gira su una macchina Linux separata&lt;br /&gt;
&lt;br /&gt;
==Integrazione con ErrP==&lt;br /&gt;
&lt;br /&gt;
Il sistema basato su BCI2000 che usa P300 va espanso per poter usar anche i potenziali d'errore&lt;br /&gt;
&lt;br /&gt;
Ciò che si vuole sviluppare è un sistema che si basi su una procedura di verifica automatica tramite l'integrazione del controllo anche sui potenziali d'errore.&lt;br /&gt;
La verifica dell'Errp non è effettuato tramite media di più forme d'onda così come avviene con le rilevazioni della P300, ma sulla singola prova.&lt;br /&gt;
Infatti, dopo l'analisi delle forme d'onda P300 e la determinazione del target voluto dall'utente, si introduce una ulteriore fase in cui si mostra all'utente la probabile selezione voluta e si valuta la presenza del potenziale d'errore. Se non viene riscontrata questa forma d'onda si seleziona il target precedentemente identificato, altrimenti si ripete una nuova sequenza di stimolazioni per identificare nuovamente il target voluto.&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
Introdurre una nova fase di controllo Errp nel modulo applicativo dello speller&lt;br /&gt;
&lt;br /&gt;
Introdurre un nuovo filtro nella catena dei filtri che si occupa del'accumulo dei potenziali d'errore&lt;br /&gt;
&lt;br /&gt;
Modificare opportunamente i filtri di: classificazione, media e normalizzazione per supportare il controllo dell'Errp&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Fare uno script Matlab nuovo, derivato da quelli di Gianmaria, che faccia l'addestramento su dati salvati e restituisca (su file) le tabelle per il classificatore pronte per essere caricate nel modulo di BCI2000.&lt;br /&gt;
&lt;br /&gt;
Nel filtro P3ErrPClassifier: ogni riga specifica un solo intervallo; più righe possono riferirsi allo stesso canale.&lt;br /&gt;
&lt;br /&gt;
==Varie==&lt;br /&gt;
&lt;br /&gt;
Rinominare ''tutte'' le directory dei sorgenti ''in conformità allo stile di BCI2000'' e senza usare spazi.  Allineare i nomi dei moduli e quelli delle directory che li contengono.&lt;/div&gt;</summary>
		<author><name>AndreaSgarlata</name></author>	</entry>

	<entry>
		<id>https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=3426</id>
		<title>Talk:Online P300 and ErrP recognition with BCI2000</title>
		<link rel="alternate" type="text/html" href="https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=3426"/>
				<updated>2008-06-14T12:54:59Z</updated>
		
		<summary type="html">&lt;p&gt;AndreaSgarlata: /* Da fare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Plugin Galileo/Modulo sorgente BCI2000==&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo Plugin: sgarlata/Plugin&lt;br /&gt;
&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo sorgente BCI2000: sgarlata/GalileoSourceJitter&lt;br /&gt;
&lt;br /&gt;
Il sistema attualmente è composto da un plugin che si occupa di inviare i dati tramite pipe ad un altro modulo che fa parte dell'intero sistema di BCI2000.&lt;br /&gt;
&lt;br /&gt;
Per ottenere una corretta temporizzazione del sistema di BCI2000 abbiamo sfruttato il fatto che il plugin è più lento nell'invio dei dati rispetto all'intero sistema BCI2000.&lt;br /&gt;
Infatti si è deciso di inviare tramite plugin una quantità di dati costante pari a 1/16 di secondo, tenendo conto del fatto che durante l'esecuzione di una registrazione online la quantità di dati ricevuti dal plugin risulta molto regolare e costante.&lt;br /&gt;
In questo modo ogni invio di dati tramite pipe rappresenta il trascorrere di un tempo prefissato che risulta pari a 1/16 di secondo.&lt;br /&gt;
&lt;br /&gt;
Sono stati effettuati diversi test (aggiunta di un buffer di accumulo, invio di blocchi di dimensione maggiore 0.1 secondi) per cercare di mantenere il più possibile costante l'intervallo che trascorre tra l'invio di un blocco dati e quello successivo, nonostante questi tentativi abbiamo riscontrato il fatto che l'intervallo tra due blocchi risulta in media molto regolare, questa regolarità viene persa però nei momenti in cui il sistema viene perturbato da fattori esterni dovuti all'intervento dell'utente, quali ad esempio: apertura nuova finestra, spostamento finestre, apertura cartelle ecc...&lt;br /&gt;
Tutti questi fattori possono essere trascurati, in quanto durante l'esecuzione dell'intero sistema l'utente non deve interagire direttamente con il sistema, ma deve solamente essere sottoposto a delle stimolazioni, e se l'utente decide di interagire è perché sta effettuando modifiche ed in quel momento non necessita di un sistema sincrono e regolare.&lt;br /&gt;
:Noi speriamo che non capiti durante il funzionamento normale o sia molto raro ([[User:BernardoDalSeno|BernardoDalSeno]] 20:21, 24 May 2008 (CEST))&lt;br /&gt;
&lt;br /&gt;
Per tutte queste motivazioni si è deciso che il plugin non appena accumulato un blocco dati pari a 1/16 di secondo deve subito inviarlo tramite pipe, in modo da mantenere una regolarità tra l'invio consecutivo di due blocchi.&lt;br /&gt;
&lt;br /&gt;
Nel sever Airbat sono presenti i sorgenti dei differenti plugin implementati con le differenti stategie di funzionamento:&lt;br /&gt;
&lt;br /&gt;
*Cartella sgarlata/PluginPipe: il plugin implementato consente un invio di dati in blocchi di 0.1secondi, consentendo al modulo sorgente di BCI2000 di occuparsi dell'invio di blocchi dati di dimensioni inferiori all'interno del sistema di BCI2000. Questa strategia è stata abbandonata perchè abbiamo notato che a 512Hz il plugin riceveva blocchi di 32 campioni per ogni chiamata, e doveva inviare blocchi di 51 campioni, questa differenza faceva si che l'invio di blocchi non era regolare in quanto ad esempio dopo due chiamate inviavo un blocco da 51 campioni e poi dovevo aspettare 3 chiamate per inviare un nuovo blocco dati.&lt;br /&gt;
&lt;br /&gt;
*Cartella sgarlata/PluginBuffer: il plugin implementato mantiene un buffer di N blocchi dati pari a 1/16 di secondo, ed inizia l'invio di un blocco dati nel momento in cui mezzo buffer è stato riempito, utilizzando come clock di invio l'orologio di invocazione del plugin, dato che in maniera molto regolare vi era un invocazione ogni 1/16 di secondo a 512Hz. La strategia dell'utilizzo del buffer è stata abbandonata in quanto, si introduceva ritardo con il buffer ed in oltre i problemi di perdita di regolarità si verificavano comunque perchè non erano dovuti a dei mancati invii di dati da parte del plugin,ma erano dovuti al fatto che il sistema veniva perturbato da un utente esterno ed il modulo sorgente di BCI2000 attendeva nella lettura di un nuovo blocco.&lt;br /&gt;
&lt;br /&gt;
*Cartella sgarlata/PluginTemporizzato: questo plugin utilizza un blocco dati pari a 1/16 di secondo, ma diversamente dal plugin finale manca della stampa di diversi valori di debug e della possibilità di connessione con il sistema di BCI2000 non sincrona.&lt;br /&gt;
&lt;br /&gt;
Le diverse strategie di sviluppo del plugin sono state studiate ed implementate per poter utilizzare un applicativo di stimolazione che rimanesse sincrono con l'intero sistema e quindi che avesse la possibilità di essere implementato da un modulo applicativo di BCI2000.&lt;br /&gt;
Uno stimolatore sincrono è un vantaggio in quanto consente di farlo evolvere durante l'acquisizione dei segnali e di effettuare diverse scelte sulla base di questi e dei risultati fin ora ottenuti.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Per quanto riguarda il modulo sorgente di BCI2000 questo si occupa di leggere dalla pipe: il numero di canali, il numero di campioni per canale e la frequenza di campionamento. Una volta letti questi valori controlla che l'utente abbia inserito tra i parametri gli stessi valori letti tramite pipe, se questo non avviene blocca l'intero sistema e comunica l'errore all'utente con i valori esatti da inserire. Questa procedura viene ripetuta finché l'utente non inserisce gli stessi parametri letti dal modulo source.  Si è visto che invece non si riesce a passare i parametri dal modulo sorgente agli altri moduli di BCI2000 durante la fase di inizializzazione.&lt;br /&gt;
&lt;br /&gt;
A run time il modulo source si occupa di leggere dalla pipe una blocco di dati e di inviarlo al modulo successivo (modulo filtro); ogni blocco viene inoltrato non appena è disponibile.&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
* Script per il confronto tra dati registrati da BCI2000 e da Galileo.&lt;br /&gt;
&lt;br /&gt;
==CATENA DI FILTRI DI BCI2000==&lt;br /&gt;
&lt;br /&gt;
Attualmente la catena di filtri del modulo di BCI2000 è suddivisa nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)un filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)un filtro di Trigger che si occupa di rilevare gli inizi delle stimolazioni tramite l'analisi del segnale proveniente dal fototransistor&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa di accumulare più forme d'onda p300 relative alla stessa stimolazione e tra queste farne la media&lt;br /&gt;
&lt;br /&gt;
4)un filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
Si vuole modificare sia la sequenza di filtri che il funzionamento di alcuni di questi nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)filtro di Trigger che determina in maniera automatica, tramite una fase iniziale dettata dal modulo applicativo, il valore di soglia per distinguere gli istanti di tempo in cui il riquadro è nero oppure bianco&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro Trigger: sgarlata/P3SignalProcessingGalileo/TriggerFilterAutoThreshold&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa solamente di accumulare le forme d'onda p300 con un ring buffer che memorizza una porzione di segnale precedente, dato che noi rileviamo l'inizio di una stimolazione con un ritardo che è pari alla dimensione della finestra mobile fatta scorrere lungo il segnale di trigger&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro P300: sgarlata/P3SignalProcessingGalileo/P3CollectorFilterGALILEO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4)filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)filtro che effettua la media dei valori in uscita dal filtro di classificazione&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro Media: sgarlata/P3SignalProcessingGalileo/MeanFilter&lt;br /&gt;
&lt;br /&gt;
6)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
Filtro che rileva i trigger&lt;br /&gt;
&lt;br /&gt;
Adattamento automatico della soglia per i trigger (Analisi switch riquadro: Bianco-&amp;gt;Nero-&amp;gt;Bianco per un tempo definito dall'utente)&lt;br /&gt;
&lt;br /&gt;
Accumulare forme d'onda con parti che precedono il trigger&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Verificare l'accuratezza della rilevazione dei fronti d'onda, con script Matlab.&lt;br /&gt;
&lt;br /&gt;
==Modulo applicativo speller P300==&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo Applicativo: sgarlata/P3Speller&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il modulo applicativo deve essere adattato al sistema di trigger.&lt;br /&gt;
&lt;br /&gt;
Per quanto riguarda il modulo applicativo bisogna introdurre un riquadro posto nell'angolo superiore destro dello schermo e farlo variare (bianco/nero) ogni qual volta viene effettuata una stimolazione e, prima dell'inizio della sequenza di stimolazioni, introdurre una fase preliminare in cui si fa variare (bianco/nero) il riquadro per un tempo totale preimpostato in modo da poter far determinare in maniera automatica dal filtro di Trigger il valore di soglia che permette di distinguere se siamo in fase di stimolazione (riquadro nero) o in fase di non stimolazione (riquadro bianco).&lt;br /&gt;
Terminata la fase di taratura del valore di soglia, lo speller può effettuare la sua sequenza di stimolazioni.&lt;br /&gt;
&lt;br /&gt;
Per le modifiche da effettuare al modulo applicativo di BCI2000 quando questo deve comunicare tramite protocollo UDP con un altro applicativo che effettua le stimolazioni su una differente macchina Linux si è invitati a visionare la relativa discussione di Roberto Massimini.&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
Aggiungere quadrato di sync nell'applicazione speller&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Misurare lo sfasamento tra sync e stimolo&lt;br /&gt;
&lt;br /&gt;
Sviluppare sistema per associare la stimolazione ai trigger rilevati dall'apposito filtro&lt;br /&gt;
&lt;br /&gt;
Scrivere specifiche per comunicazione tra BCI2000 e un modulo applicativo P300 esterno che gira su una macchina Linux separata&lt;br /&gt;
&lt;br /&gt;
==Integrazione con ErrP==&lt;br /&gt;
&lt;br /&gt;
Il sistema basato su BCI2000 che usa P300 va espanso per poter usar anche i potenziali d'errore&lt;br /&gt;
&lt;br /&gt;
Ciò che si vuole sviluppare è un sistema che si basi su una procedura di verifica automatica tramite l'integrazione del controllo anche sui potenziali d'errore.&lt;br /&gt;
La verifica dell'Errp non è effettuato tramite media di più forme d'onda così come avviene con le rilevazioni della P300, ma sulla singola prova.&lt;br /&gt;
Infatti, dopo l'analisi delle forme d'onda P300 e la determinazione del target voluto dall'utente, si introduce una ulteriore fase in cui si mostra all'utente la probabile selezione voluta e si valuta la presenza del potenziale d'errore. Se non viene riscontrata questa forma d'onda si seleziona il target precedentemente identificato, altrimenti si ripete una nuova sequenza di stimolazioni per identificare nuovamente il target voluto.&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
Introdurre una nova fase di controllo Errp nel modulo applicativo dello speller&lt;br /&gt;
&lt;br /&gt;
Introdurre un nuovo filtro nella catena dei filtri che si occupa del'accumulo dei potenziali d'errore&lt;br /&gt;
&lt;br /&gt;
Modificare opportunamente i filtri di: classificazione, media e normalizzazione per supportare il controllo dell'Errp&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Fare uno script Matlab nuovo, derivato da quelli di Gianmaria, che faccia l'addestramento su dati salvati e restituisca (su file) le tabelle per il classificatore pronte per essere caricate nel modulo di BCI2000.&lt;br /&gt;
&lt;br /&gt;
Nel filtro P3ErrPClassifier: ogni riga specifica un solo intervallo; più righe possono riferirsi allo stesso canale.&lt;br /&gt;
&lt;br /&gt;
==Varie==&lt;br /&gt;
&lt;br /&gt;
Rinominare ''tutte'' le directory dei sorgenti ''in conformità allo stile di BCI2000'' e senza usare spazi.  Allineare i nomi dei moduli e quelli delle directory che li contengono.&lt;/div&gt;</summary>
		<author><name>AndreaSgarlata</name></author>	</entry>

	<entry>
		<id>https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=3425</id>
		<title>Talk:Online P300 and ErrP recognition with BCI2000</title>
		<link rel="alternate" type="text/html" href="https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=3425"/>
				<updated>2008-06-14T12:52:41Z</updated>
		
		<summary type="html">&lt;p&gt;AndreaSgarlata: /* Fatto */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Plugin Galileo/Modulo sorgente BCI2000==&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo Plugin: sgarlata/Plugin&lt;br /&gt;
&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo sorgente BCI2000: sgarlata/GalileoSourceJitter&lt;br /&gt;
&lt;br /&gt;
Il sistema attualmente è composto da un plugin che si occupa di inviare i dati tramite pipe ad un altro modulo che fa parte dell'intero sistema di BCI2000.&lt;br /&gt;
&lt;br /&gt;
Per ottenere una corretta temporizzazione del sistema di BCI2000 abbiamo sfruttato il fatto che il plugin è più lento nell'invio dei dati rispetto all'intero sistema BCI2000.&lt;br /&gt;
Infatti si è deciso di inviare tramite plugin una quantità di dati costante pari a 1/16 di secondo, tenendo conto del fatto che durante l'esecuzione di una registrazione online la quantità di dati ricevuti dal plugin risulta molto regolare e costante.&lt;br /&gt;
In questo modo ogni invio di dati tramite pipe rappresenta il trascorrere di un tempo prefissato che risulta pari a 1/16 di secondo.&lt;br /&gt;
&lt;br /&gt;
Sono stati effettuati diversi test (aggiunta di un buffer di accumulo, invio di blocchi di dimensione maggiore 0.1 secondi) per cercare di mantenere il più possibile costante l'intervallo che trascorre tra l'invio di un blocco dati e quello successivo, nonostante questi tentativi abbiamo riscontrato il fatto che l'intervallo tra due blocchi risulta in media molto regolare, questa regolarità viene persa però nei momenti in cui il sistema viene perturbato da fattori esterni dovuti all'intervento dell'utente, quali ad esempio: apertura nuova finestra, spostamento finestre, apertura cartelle ecc...&lt;br /&gt;
Tutti questi fattori possono essere trascurati, in quanto durante l'esecuzione dell'intero sistema l'utente non deve interagire direttamente con il sistema, ma deve solamente essere sottoposto a delle stimolazioni, e se l'utente decide di interagire è perché sta effettuando modifiche ed in quel momento non necessita di un sistema sincrono e regolare.&lt;br /&gt;
:Noi speriamo che non capiti durante il funzionamento normale o sia molto raro ([[User:BernardoDalSeno|BernardoDalSeno]] 20:21, 24 May 2008 (CEST))&lt;br /&gt;
&lt;br /&gt;
Per tutte queste motivazioni si è deciso che il plugin non appena accumulato un blocco dati pari a 1/16 di secondo deve subito inviarlo tramite pipe, in modo da mantenere una regolarità tra l'invio consecutivo di due blocchi.&lt;br /&gt;
&lt;br /&gt;
Nel sever Airbat sono presenti i sorgenti dei differenti plugin implementati con le differenti stategie di funzionamento:&lt;br /&gt;
&lt;br /&gt;
*Cartella sgarlata/PluginPipe: il plugin implementato consente un invio di dati in blocchi di 0.1secondi, consentendo al modulo sorgente di BCI2000 di occuparsi dell'invio di blocchi dati di dimensioni inferiori all'interno del sistema di BCI2000. Questa strategia è stata abbandonata perchè abbiamo notato che a 512Hz il plugin riceveva blocchi di 32 campioni per ogni chiamata, e doveva inviare blocchi di 51 campioni, questa differenza faceva si che l'invio di blocchi non era regolare in quanto ad esempio dopo due chiamate inviavo un blocco da 51 campioni e poi dovevo aspettare 3 chiamate per inviare un nuovo blocco dati.&lt;br /&gt;
&lt;br /&gt;
*Cartella sgarlata/PluginBuffer: il plugin implementato mantiene un buffer di N blocchi dati pari a 1/16 di secondo, ed inizia l'invio di un blocco dati nel momento in cui mezzo buffer è stato riempito, utilizzando come clock di invio l'orologio di invocazione del plugin, dato che in maniera molto regolare vi era un invocazione ogni 1/16 di secondo a 512Hz. La strategia dell'utilizzo del buffer è stata abbandonata in quanto, si introduceva ritardo con il buffer ed in oltre i problemi di perdita di regolarità si verificavano comunque perchè non erano dovuti a dei mancati invii di dati da parte del plugin,ma erano dovuti al fatto che il sistema veniva perturbato da un utente esterno ed il modulo sorgente di BCI2000 attendeva nella lettura di un nuovo blocco.&lt;br /&gt;
&lt;br /&gt;
*Cartella sgarlata/PluginTemporizzato: questo plugin utilizza un blocco dati pari a 1/16 di secondo, ma diversamente dal plugin finale manca della stampa di diversi valori di debug e della possibilità di connessione con il sistema di BCI2000 non sincrona.&lt;br /&gt;
&lt;br /&gt;
Le diverse strategie di sviluppo del plugin sono state studiate ed implementate per poter utilizzare un applicativo di stimolazione che rimanesse sincrono con l'intero sistema e quindi che avesse la possibilità di essere implementato da un modulo applicativo di BCI2000.&lt;br /&gt;
Uno stimolatore sincrono è un vantaggio in quanto consente di farlo evolvere durante l'acquisizione dei segnali e di effettuare diverse scelte sulla base di questi e dei risultati fin ora ottenuti.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Per quanto riguarda il modulo sorgente di BCI2000 questo si occupa di leggere dalla pipe: il numero di canali, il numero di campioni per canale e la frequenza di campionamento. Una volta letti questi valori controlla che l'utente abbia inserito tra i parametri gli stessi valori letti tramite pipe, se questo non avviene blocca l'intero sistema e comunica l'errore all'utente con i valori esatti da inserire. Questa procedura viene ripetuta finché l'utente non inserisce gli stessi parametri letti dal modulo source.  Si è visto che invece non si riesce a passare i parametri dal modulo sorgente agli altri moduli di BCI2000 durante la fase di inizializzazione.&lt;br /&gt;
&lt;br /&gt;
A run time il modulo source si occupa di leggere dalla pipe una blocco di dati e di inviarlo al modulo successivo (modulo filtro); ogni blocco viene inoltrato non appena è disponibile.&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
* Script per il confronto tra dati registrati da BCI2000 e da Galileo.&lt;br /&gt;
* Misurare il numero di campioni per chiamata a varie frequenze.&lt;br /&gt;
* Verifica del jitter (e di eventuale drift) del modulo sorgente di BCI2000.&lt;br /&gt;
* Spostare tutte le vecchie versioni di plugin e modulo sorgente in una nuova directory 'old'&lt;br /&gt;
* Eliminare la finestra del plugin, e salvare eventuali tempi (istanti) di perdite di dati (pipe piena) su file e alla fine della registrazione avvisare l'utente se ci sono state perdite.  Il file verrà cancellato se non contiene errori.  Nessun file di log va sovrascritto.&lt;br /&gt;
:Per come è fatto il sistema, è inevitabile che la pipe si riempia prima dell'inizio della registrazione vera e propria. Questo periodo non va segnalato né salvato su file (andrà ideato un opportuno sistema per identificarlo).&lt;br /&gt;
&lt;br /&gt;
==CATENA DI FILTRI DI BCI2000==&lt;br /&gt;
&lt;br /&gt;
Attualmente la catena di filtri del modulo di BCI2000 è suddivisa nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)un filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)un filtro di Trigger che si occupa di rilevare gli inizi delle stimolazioni tramite l'analisi del segnale proveniente dal fototransistor&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa di accumulare più forme d'onda p300 relative alla stessa stimolazione e tra queste farne la media&lt;br /&gt;
&lt;br /&gt;
4)un filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
Si vuole modificare sia la sequenza di filtri che il funzionamento di alcuni di questi nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)filtro di Trigger che determina in maniera automatica, tramite una fase iniziale dettata dal modulo applicativo, il valore di soglia per distinguere gli istanti di tempo in cui il riquadro è nero oppure bianco&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro Trigger: sgarlata/P3SignalProcessingGalileo/TriggerFilterAutoThreshold&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa solamente di accumulare le forme d'onda p300 con un ring buffer che memorizza una porzione di segnale precedente, dato che noi rileviamo l'inizio di una stimolazione con un ritardo che è pari alla dimensione della finestra mobile fatta scorrere lungo il segnale di trigger&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro P300: sgarlata/P3SignalProcessingGalileo/P3CollectorFilterGALILEO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4)filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)filtro che effettua la media dei valori in uscita dal filtro di classificazione&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro Media: sgarlata/P3SignalProcessingGalileo/MeanFilter&lt;br /&gt;
&lt;br /&gt;
6)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
Filtro che rileva i trigger&lt;br /&gt;
&lt;br /&gt;
Adattamento automatico della soglia per i trigger (Analisi switch riquadro: Bianco-&amp;gt;Nero-&amp;gt;Bianco per un tempo definito dall'utente)&lt;br /&gt;
&lt;br /&gt;
Accumulare forme d'onda con parti che precedono il trigger&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Verificare l'accuratezza della rilevazione dei fronti d'onda, con script Matlab.&lt;br /&gt;
&lt;br /&gt;
==Modulo applicativo speller P300==&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo Applicativo: sgarlata/P3Speller&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il modulo applicativo deve essere adattato al sistema di trigger.&lt;br /&gt;
&lt;br /&gt;
Per quanto riguarda il modulo applicativo bisogna introdurre un riquadro posto nell'angolo superiore destro dello schermo e farlo variare (bianco/nero) ogni qual volta viene effettuata una stimolazione e, prima dell'inizio della sequenza di stimolazioni, introdurre una fase preliminare in cui si fa variare (bianco/nero) il riquadro per un tempo totale preimpostato in modo da poter far determinare in maniera automatica dal filtro di Trigger il valore di soglia che permette di distinguere se siamo in fase di stimolazione (riquadro nero) o in fase di non stimolazione (riquadro bianco).&lt;br /&gt;
Terminata la fase di taratura del valore di soglia, lo speller può effettuare la sua sequenza di stimolazioni.&lt;br /&gt;
&lt;br /&gt;
Per le modifiche da effettuare al modulo applicativo di BCI2000 quando questo deve comunicare tramite protocollo UDP con un altro applicativo che effettua le stimolazioni su una differente macchina Linux si è invitati a visionare la relativa discussione di Roberto Massimini.&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
Aggiungere quadrato di sync nell'applicazione speller&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Misurare lo sfasamento tra sync e stimolo&lt;br /&gt;
&lt;br /&gt;
Sviluppare sistema per associare la stimolazione ai trigger rilevati dall'apposito filtro&lt;br /&gt;
&lt;br /&gt;
Scrivere specifiche per comunicazione tra BCI2000 e un modulo applicativo P300 esterno che gira su una macchina Linux separata&lt;br /&gt;
&lt;br /&gt;
==Integrazione con ErrP==&lt;br /&gt;
&lt;br /&gt;
Il sistema basato su BCI2000 che usa P300 va espanso per poter usar anche i potenziali d'errore&lt;br /&gt;
&lt;br /&gt;
Ciò che si vuole sviluppare è un sistema che si basi su una procedura di verifica automatica tramite l'integrazione del controllo anche sui potenziali d'errore.&lt;br /&gt;
La verifica dell'Errp non è effettuato tramite media di più forme d'onda così come avviene con le rilevazioni della P300, ma sulla singola prova.&lt;br /&gt;
Infatti, dopo l'analisi delle forme d'onda P300 e la determinazione del target voluto dall'utente, si introduce una ulteriore fase in cui si mostra all'utente la probabile selezione voluta e si valuta la presenza del potenziale d'errore. Se non viene riscontrata questa forma d'onda si seleziona il target precedentemente identificato, altrimenti si ripete una nuova sequenza di stimolazioni per identificare nuovamente il target voluto.&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
Introdurre una nova fase di controllo Errp nel modulo applicativo dello speller&lt;br /&gt;
&lt;br /&gt;
Introdurre un nuovo filtro nella catena dei filtri che si occupa del'accumulo dei potenziali d'errore&lt;br /&gt;
&lt;br /&gt;
Modificare opportunamente i filtri di: classificazione, media e normalizzazione per supportare il controllo dell'Errp&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Fare uno script Matlab nuovo, derivato da quelli di Gianmaria, che faccia l'addestramento su dati salvati e restituisca (su file) le tabelle per il classificatore pronte per essere caricate nel modulo di BCI2000.&lt;br /&gt;
&lt;br /&gt;
Nel filtro P3ErrPClassifier: ogni riga specifica un solo intervallo; più righe possono riferirsi allo stesso canale.&lt;br /&gt;
&lt;br /&gt;
==Varie==&lt;br /&gt;
&lt;br /&gt;
Rinominare ''tutte'' le directory dei sorgenti ''in conformità allo stile di BCI2000'' e senza usare spazi.  Allineare i nomi dei moduli e quelli delle directory che li contengono.&lt;/div&gt;</summary>
		<author><name>AndreaSgarlata</name></author>	</entry>

	<entry>
		<id>https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=3424</id>
		<title>Talk:Online P300 and ErrP recognition with BCI2000</title>
		<link rel="alternate" type="text/html" href="https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=3424"/>
				<updated>2008-06-14T12:52:24Z</updated>
		
		<summary type="html">&lt;p&gt;AndreaSgarlata: /* Da fare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Plugin Galileo/Modulo sorgente BCI2000==&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo Plugin: sgarlata/Plugin&lt;br /&gt;
&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo sorgente BCI2000: sgarlata/GalileoSourceJitter&lt;br /&gt;
&lt;br /&gt;
Il sistema attualmente è composto da un plugin che si occupa di inviare i dati tramite pipe ad un altro modulo che fa parte dell'intero sistema di BCI2000.&lt;br /&gt;
&lt;br /&gt;
Per ottenere una corretta temporizzazione del sistema di BCI2000 abbiamo sfruttato il fatto che il plugin è più lento nell'invio dei dati rispetto all'intero sistema BCI2000.&lt;br /&gt;
Infatti si è deciso di inviare tramite plugin una quantità di dati costante pari a 1/16 di secondo, tenendo conto del fatto che durante l'esecuzione di una registrazione online la quantità di dati ricevuti dal plugin risulta molto regolare e costante.&lt;br /&gt;
In questo modo ogni invio di dati tramite pipe rappresenta il trascorrere di un tempo prefissato che risulta pari a 1/16 di secondo.&lt;br /&gt;
&lt;br /&gt;
Sono stati effettuati diversi test (aggiunta di un buffer di accumulo, invio di blocchi di dimensione maggiore 0.1 secondi) per cercare di mantenere il più possibile costante l'intervallo che trascorre tra l'invio di un blocco dati e quello successivo, nonostante questi tentativi abbiamo riscontrato il fatto che l'intervallo tra due blocchi risulta in media molto regolare, questa regolarità viene persa però nei momenti in cui il sistema viene perturbato da fattori esterni dovuti all'intervento dell'utente, quali ad esempio: apertura nuova finestra, spostamento finestre, apertura cartelle ecc...&lt;br /&gt;
Tutti questi fattori possono essere trascurati, in quanto durante l'esecuzione dell'intero sistema l'utente non deve interagire direttamente con il sistema, ma deve solamente essere sottoposto a delle stimolazioni, e se l'utente decide di interagire è perché sta effettuando modifiche ed in quel momento non necessita di un sistema sincrono e regolare.&lt;br /&gt;
:Noi speriamo che non capiti durante il funzionamento normale o sia molto raro ([[User:BernardoDalSeno|BernardoDalSeno]] 20:21, 24 May 2008 (CEST))&lt;br /&gt;
&lt;br /&gt;
Per tutte queste motivazioni si è deciso che il plugin non appena accumulato un blocco dati pari a 1/16 di secondo deve subito inviarlo tramite pipe, in modo da mantenere una regolarità tra l'invio consecutivo di due blocchi.&lt;br /&gt;
&lt;br /&gt;
Nel sever Airbat sono presenti i sorgenti dei differenti plugin implementati con le differenti stategie di funzionamento:&lt;br /&gt;
&lt;br /&gt;
*Cartella sgarlata/PluginPipe: il plugin implementato consente un invio di dati in blocchi di 0.1secondi, consentendo al modulo sorgente di BCI2000 di occuparsi dell'invio di blocchi dati di dimensioni inferiori all'interno del sistema di BCI2000. Questa strategia è stata abbandonata perchè abbiamo notato che a 512Hz il plugin riceveva blocchi di 32 campioni per ogni chiamata, e doveva inviare blocchi di 51 campioni, questa differenza faceva si che l'invio di blocchi non era regolare in quanto ad esempio dopo due chiamate inviavo un blocco da 51 campioni e poi dovevo aspettare 3 chiamate per inviare un nuovo blocco dati.&lt;br /&gt;
&lt;br /&gt;
*Cartella sgarlata/PluginBuffer: il plugin implementato mantiene un buffer di N blocchi dati pari a 1/16 di secondo, ed inizia l'invio di un blocco dati nel momento in cui mezzo buffer è stato riempito, utilizzando come clock di invio l'orologio di invocazione del plugin, dato che in maniera molto regolare vi era un invocazione ogni 1/16 di secondo a 512Hz. La strategia dell'utilizzo del buffer è stata abbandonata in quanto, si introduceva ritardo con il buffer ed in oltre i problemi di perdita di regolarità si verificavano comunque perchè non erano dovuti a dei mancati invii di dati da parte del plugin,ma erano dovuti al fatto che il sistema veniva perturbato da un utente esterno ed il modulo sorgente di BCI2000 attendeva nella lettura di un nuovo blocco.&lt;br /&gt;
&lt;br /&gt;
*Cartella sgarlata/PluginTemporizzato: questo plugin utilizza un blocco dati pari a 1/16 di secondo, ma diversamente dal plugin finale manca della stampa di diversi valori di debug e della possibilità di connessione con il sistema di BCI2000 non sincrona.&lt;br /&gt;
&lt;br /&gt;
Le diverse strategie di sviluppo del plugin sono state studiate ed implementate per poter utilizzare un applicativo di stimolazione che rimanesse sincrono con l'intero sistema e quindi che avesse la possibilità di essere implementato da un modulo applicativo di BCI2000.&lt;br /&gt;
Uno stimolatore sincrono è un vantaggio in quanto consente di farlo evolvere durante l'acquisizione dei segnali e di effettuare diverse scelte sulla base di questi e dei risultati fin ora ottenuti.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Per quanto riguarda il modulo sorgente di BCI2000 questo si occupa di leggere dalla pipe: il numero di canali, il numero di campioni per canale e la frequenza di campionamento. Una volta letti questi valori controlla che l'utente abbia inserito tra i parametri gli stessi valori letti tramite pipe, se questo non avviene blocca l'intero sistema e comunica l'errore all'utente con i valori esatti da inserire. Questa procedura viene ripetuta finché l'utente non inserisce gli stessi parametri letti dal modulo source.  Si è visto che invece non si riesce a passare i parametri dal modulo sorgente agli altri moduli di BCI2000 durante la fase di inizializzazione.&lt;br /&gt;
&lt;br /&gt;
A run time il modulo source si occupa di leggere dalla pipe una blocco di dati e di inviarlo al modulo successivo (modulo filtro); ogni blocco viene inoltrato non appena è disponibile.&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
* Script per il confronto tra dati registrati da BCI2000 e da Galileo.&lt;br /&gt;
* Misurare il numero di campioni per chiamata a varie frequenze.&lt;br /&gt;
* Verifica del jitter (e di eventuale drift) del modulo sorgente di BCI2000.&lt;br /&gt;
* Spostare tutte le vecchie versioni di plugin e modulo sorgente in una nuova directory 'old'&lt;br /&gt;
* Eliminare la finestra del plugin, e salvare eventuali tempi (istanti) di perdite di dati (pipe piena) su file e alla fine della registrazione avvisare l'utente se ci sono state perdite.  Il file verrà cancellato se non contiene errori.  Nessun file di log va sovrascritto.&lt;br /&gt;
:Per come è fatto il sistema, è inevitabile che la pipe si riempia prima dell'inizio della registrazione vera e propria. Questo periodo non va segnalato né salvato su file (andrà ideato un opportuno sistema per identificarlo).&lt;br /&gt;
&lt;br /&gt;
==CATENA DI FILTRI DI BCI2000==&lt;br /&gt;
&lt;br /&gt;
Attualmente la catena di filtri del modulo di BCI2000 è suddivisa nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)un filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)un filtro di Trigger che si occupa di rilevare gli inizi delle stimolazioni tramite l'analisi del segnale proveniente dal fototransistor&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa di accumulare più forme d'onda p300 relative alla stessa stimolazione e tra queste farne la media&lt;br /&gt;
&lt;br /&gt;
4)un filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
Si vuole modificare sia la sequenza di filtri che il funzionamento di alcuni di questi nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)filtro di Trigger che determina in maniera automatica, tramite una fase iniziale dettata dal modulo applicativo, il valore di soglia per distinguere gli istanti di tempo in cui il riquadro è nero oppure bianco&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro Trigger: sgarlata/P3SignalProcessingGalileo/TriggerFilterAutoThreshold&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa solamente di accumulare le forme d'onda p300 con un ring buffer che memorizza una porzione di segnale precedente, dato che noi rileviamo l'inizio di una stimolazione con un ritardo che è pari alla dimensione della finestra mobile fatta scorrere lungo il segnale di trigger&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro P300: sgarlata/P3SignalProcessingGalileo/P3CollectorFilterGALILEO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4)filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)filtro che effettua la media dei valori in uscita dal filtro di classificazione&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro Media: sgarlata/P3SignalProcessingGalileo/MeanFilter&lt;br /&gt;
&lt;br /&gt;
6)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
Filtro che rileva i trigger&lt;br /&gt;
&lt;br /&gt;
Adattamento automatico della soglia per i trigger (Analisi switch riquadro: Bianco-&amp;gt;Nero-&amp;gt;Bianco per un tempo definito dall'utente)&lt;br /&gt;
&lt;br /&gt;
Accumulare forme d'onda con parti che precedono il trigger&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Verificare l'accuratezza della rilevazione dei fronti d'onda, con script Matlab.&lt;br /&gt;
&lt;br /&gt;
==Modulo applicativo speller P300==&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo Applicativo: sgarlata/P3Speller&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il modulo applicativo deve essere adattato al sistema di trigger.&lt;br /&gt;
&lt;br /&gt;
Per quanto riguarda il modulo applicativo bisogna introdurre un riquadro posto nell'angolo superiore destro dello schermo e farlo variare (bianco/nero) ogni qual volta viene effettuata una stimolazione e, prima dell'inizio della sequenza di stimolazioni, introdurre una fase preliminare in cui si fa variare (bianco/nero) il riquadro per un tempo totale preimpostato in modo da poter far determinare in maniera automatica dal filtro di Trigger il valore di soglia che permette di distinguere se siamo in fase di stimolazione (riquadro nero) o in fase di non stimolazione (riquadro bianco).&lt;br /&gt;
Terminata la fase di taratura del valore di soglia, lo speller può effettuare la sua sequenza di stimolazioni.&lt;br /&gt;
&lt;br /&gt;
Per le modifiche da effettuare al modulo applicativo di BCI2000 quando questo deve comunicare tramite protocollo UDP con un altro applicativo che effettua le stimolazioni su una differente macchina Linux si è invitati a visionare la relativa discussione di Roberto Massimini.&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
Aggiungere quadrato di sync nell'applicazione speller&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Misurare lo sfasamento tra sync e stimolo&lt;br /&gt;
&lt;br /&gt;
Sviluppare sistema per associare la stimolazione ai trigger rilevati dall'apposito filtro&lt;br /&gt;
&lt;br /&gt;
Scrivere specifiche per comunicazione tra BCI2000 e un modulo applicativo P300 esterno che gira su una macchina Linux separata&lt;br /&gt;
&lt;br /&gt;
==Integrazione con ErrP==&lt;br /&gt;
&lt;br /&gt;
Il sistema basato su BCI2000 che usa P300 va espanso per poter usar anche i potenziali d'errore&lt;br /&gt;
&lt;br /&gt;
Ciò che si vuole sviluppare è un sistema che si basi su una procedura di verifica automatica tramite l'integrazione del controllo anche sui potenziali d'errore.&lt;br /&gt;
La verifica dell'Errp non è effettuato tramite media di più forme d'onda così come avviene con le rilevazioni della P300, ma sulla singola prova.&lt;br /&gt;
Infatti, dopo l'analisi delle forme d'onda P300 e la determinazione del target voluto dall'utente, si introduce una ulteriore fase in cui si mostra all'utente la probabile selezione voluta e si valuta la presenza del potenziale d'errore. Se non viene riscontrata questa forma d'onda si seleziona il target precedentemente identificato, altrimenti si ripete una nuova sequenza di stimolazioni per identificare nuovamente il target voluto.&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Fare uno script Matlab nuovo, derivato da quelli di Gianmaria, che faccia l'addestramento su dati salvati e restituisca (su file) le tabelle per il classificatore pronte per essere caricate nel modulo di BCI2000.&lt;br /&gt;
&lt;br /&gt;
Nel filtro P3ErrPClassifier: ogni riga specifica un solo intervallo; più righe possono riferirsi allo stesso canale.&lt;br /&gt;
&lt;br /&gt;
==Varie==&lt;br /&gt;
&lt;br /&gt;
Rinominare ''tutte'' le directory dei sorgenti ''in conformità allo stile di BCI2000'' e senza usare spazi.  Allineare i nomi dei moduli e quelli delle directory che li contengono.&lt;/div&gt;</summary>
		<author><name>AndreaSgarlata</name></author>	</entry>

	<entry>
		<id>https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=3153</id>
		<title>Talk:Online P300 and ErrP recognition with BCI2000</title>
		<link rel="alternate" type="text/html" href="https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=3153"/>
				<updated>2008-05-25T08:25:10Z</updated>
		
		<summary type="html">&lt;p&gt;AndreaSgarlata: /* Da fare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Plugin Galileo/Modulo sorgente BCI2000==&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo Plugin: sgarlata/Plugin&lt;br /&gt;
&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo sorgente BCI2000: sgarlata/GalileoSourceJitter&lt;br /&gt;
&lt;br /&gt;
Il sistema attualmente è composto da un plugin che si occupa di inviare i dati tramite pipe ad un altro modulo che fa parte dell'intero sistema di BCI2000.&lt;br /&gt;
&lt;br /&gt;
Per ottenere una corretta temporizzazione del sistema di BCI2000 abbiamo sfruttato il fatto che il plugin è più lento nell'invio dei dati rispetto all'intero sistema BCI2000.&lt;br /&gt;
Infatti si è deciso di inviare tramite plugin una quantità di dati costante pari a 1/16 di secondo, tenendo conto del fatto che durante l'esecuzione di una registrazione online la quantità di dati ricevuti dal plugin risulta molto regolare e costante.&lt;br /&gt;
In questo modo ogni invio di dati tramite pipe rappresenta il trascorrere di un tempo prefissato che risulta pari a 1/16 di secondo.&lt;br /&gt;
&lt;br /&gt;
Sono stati effettuati diversi test (aggiunta di un buffer di accumulo, invio di blocchi di dimensione maggiore 0.1 secondi) per cercare di mantenere il più possibile costante l'intervallo che trascorre tra l'invio di un blocco dati e quello successivo, nonostante questi tentativi abbiamo riscontrato il fatto che l'intervallo tra due blocchi risulta in media molto regolare, questa regolarità viene persa però nei momenti in cui il sistema viene perturbato da fattori esterni dovuti all'intervento dell'utente, quali ad esempio: apertura nuova finestra, spostamento finestre, apertura cartelle ecc...&lt;br /&gt;
Tutti questi fattori possono essere trascurati, in quanto durante l'esecuzione dell'intero sistema l'utente non deve interagire direttamente con il sistema, ma deve solamente essere sottoposto a delle stimolazioni, e se l'utente decide di interagire è perché sta effettuando modifiche ed in quel momento non necessita di un sistema sincrono e regolare.&lt;br /&gt;
:Noi speriamo che non capiti durante il funzionamento normale o sia molto raro ([[User:BernardoDalSeno|BernardoDalSeno]] 20:21, 24 May 2008 (CEST))&lt;br /&gt;
&lt;br /&gt;
Per tutte queste motivazioni si è deciso che il plugin non appena accumulato un blocco dati pari a 1/16 di secondo deve subito inviarlo tramite pipe, in modo da mantenere una regolarità tra l'invio consecutivo di due blocchi.&lt;br /&gt;
&lt;br /&gt;
Nel sever Airbat sono presenti i sorgenti dei differenti plugin implementati con le differenti stategie di funzionamento:&lt;br /&gt;
&lt;br /&gt;
*Cartella sgarlata/PluginPipe: il plugin implementato consente un invio di dati in blocchi di 0.1secondi, consentendo al modulo sorgente di BCI2000 di occuparsi dell'invio di blocchi dati di dimensioni inferiori all'interno del sistema di BCI2000. Questa strategia è stata abbandonata perchè abbiamo notato che a 512Hz il plugin riceveva blocchi di 32 campioni per ogni chiamata, e doveva inviare blocchi di 51 campioni, questa differenza faceva si che l'invio di blocchi non era regolare in quanto ad esempio dopo due chiamate inviavo un blocco da 51 campioni e poi dovevo aspettare 3 chiamate per inviare un nuovo blocco dati.&lt;br /&gt;
&lt;br /&gt;
*Cartella sgarlata/PluginBuffer: il plugin implementato mantiene un buffer di N blocchi dati pari a 1/16 di secondo, ed inizia l'invio di un blocco dati nel momento in cui mezzo buffer è stato riempito, utilizzando come clock di invio l'orologio di invocazione del plugin, dato che in maniera molto regolare vi era un invocazione ogni 1/16 di secondo a 512Hz. La strategia dell'utilizzo del buffer è stata abbandonata in quanto, si introduceva ritardo con il buffer ed in oltre i problemi di perdita di regolarità si verificavano comunque perchè non erano dovuti a dei mancati invii di dati da parte del plugin,ma erano dovuti al fatto che il sistema veniva perturbato da un utente esterno ed il modulo sorgente di BCI2000 attendeva nella lettura di un nuovo blocco.&lt;br /&gt;
&lt;br /&gt;
*Cartella sgarlata/PluginTemporizzato: questo plugin utilizza un blocco dati pari a 1/16 di secondo, ma diversamente dal plugin finale manca della stampa di diversi valori di debug e della possibilità di connessione con il sistema di BCI2000 non sincrona.&lt;br /&gt;
&lt;br /&gt;
Le diverse strategie di sviluppo del plugin sono state studiate ed implementate per poter utilizzare un applicativo di stimolazione che rimanesse sincrono con l'intero sistema e quindi che avesse la possibilità di essere implementato da un modulo applicativo di BCI2000.&lt;br /&gt;
Uno stimolatore sincrono è un vantaggio in quanto consente di farlo evolvere durante l'acquisizione dei segnali e di effettuare diverse scelte sulla base di questi e dei risultati fin ora ottenuti.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Per quanto riguarda il modulo sorgente di BCI2000 questo si occupa di leggere dalla pipe: il numero di canali, il numero di campioni per canale e la frequenza di campionamento. Una volta letti questi valori controlla che l'utente abbia inserito tra i parametri gli stessi valori letti tramite pipe, se questo non avviene blocca l'intero sistema e comunica l'errore all'utente con i valori esatti da inserire. Questa procedura viene ripetuta finché l'utente non inserisce gli stessi parametri letti dal modulo source.  Si è visto che invece non si riesce a passare i parametri dal modulo sorgente agli altri moduli di BCI2000 durante la fase di inizializzazione.&lt;br /&gt;
&lt;br /&gt;
A run time il modulo source si occupa di leggere dalla pipe una blocco di dati e di inviarlo al modulo successivo (modulo filtro); ogni blocco viene inoltrato non appena è disponibile.&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
* Script per il confronto tra dati registrati da BCI2000 e da Galileo.&lt;br /&gt;
* Misurare il numero di campioni per chiamata a varie frequenze.&lt;br /&gt;
* Verifica del jitter (e di eventuale drift) del modulo sorgente di BCI2000.&lt;br /&gt;
* Mettere il codice di debug/test all'interno di blocchi &amp;lt;code&amp;gt;#if&amp;lt;/code&amp;gt; e unire GalileoSource con GalileoSourceJitter.&lt;br /&gt;
&lt;br /&gt;
==CATENA DI FILTRI DI BCI2000==&lt;br /&gt;
&lt;br /&gt;
Attualmente la catena di filtri del modulo di BCI2000 è suddivisa nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)un filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)un filtro di Trigger che si occupa di rilevare gli inizi delle stimolazioni tramite l'analisi del segnale proveniente dal fototransistor&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa di accumulare più forme d'onda p300 relative alla stessa stimolazione e tra queste farne la media&lt;br /&gt;
&lt;br /&gt;
4)un filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
Si vuole modificare sia la sequenza di filtri che il funzionamento di alcuni di questi nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)filtro di Trigger che determina in maniera automatica, tramite una fase iniziale dettata dal modulo applicativo, il valore di soglia per distinguere gli istanti di tempo in cui il riquadro è nero oppure bianco&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro Trigger: sgarlata/P3SignalProcessingGalileo/TriggerFilterAutoThreshold&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa solamente di accumulare le forme d'onda p300 con un ring buffer che memorizza una porzione di segnale precedente, dato che noi rileviamo l'inizio di una stimolazione con un ritardo che è pari alla dimensione della finestra mobile fatta scorrere lungo il segnale di trigger&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro P300: sgarlata/P3SignalProcessingGalileo/P3CollectorFilterGALILEO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4)filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)filtro che effettua la media dei valori in uscita dal filtro di classificazione&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro Media: sgarlata/P3SignalProcessingGalileo/MeanFilter&lt;br /&gt;
&lt;br /&gt;
6)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
Filtro che rileva i trigger&lt;br /&gt;
&lt;br /&gt;
Adattamento automatico della soglia per i trigger (Analisi switch riquadro: Bianco-&amp;gt;Nero-&amp;gt;Bianco per un tempo definito dall'utente)&lt;br /&gt;
&lt;br /&gt;
Accumulare forme d'onda con parti che precedono il trigger&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Verificare l'accuratezza della rilevazione dei fronti d'onda, con script Matlab.&lt;br /&gt;
&lt;br /&gt;
==Modulo applicativo speller P300==&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo Applicativo: sgarlata/P3Speller&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il modulo applicativo deve essere adattato al sistema di trigger.&lt;br /&gt;
&lt;br /&gt;
Per quanto riguarda il modulo applicativo bisogna introdurre un riquadro posto nell'angolo superiore destro dello schermo e farlo variare (bianco/nero) ogni qual volta viene effettuata una stimolazione e, prima dell'inizio della sequenza di stimolazioni, introdurre una fase preliminare in cui si fa variare (bianco/nero) il riquadro per un tempo totale preimpostato in modo da poter far determinare in maniera automatica dal filtro di Trigger il valore di soglia che permette di distinguere se siamo in fase di stimolazione (riquadro nero) o in fase di non stimolazione (riquadro bianco).&lt;br /&gt;
Terminata la fase di taratura del valore di soglia, lo speller può effettuare la sua sequenza di stimolazioni.&lt;br /&gt;
&lt;br /&gt;
Per le modifiche da effettuare al modulo applicativo di BCI2000 quando questo deve comunicare tramite protocollo UDP con un altro applicativo che effettua le stimolazioni su una differente macchina Linux si è invitati a visionare la relativa discussione di Roberto Massimini.&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
Aggiungere quadrato di sync nell'applicazione speller&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Misurare lo sfasamento tra sync e stimolo&lt;br /&gt;
&lt;br /&gt;
Sviluppare sistema per associare la stimolazione ai trigger rilevati dall'apposito filtro&lt;br /&gt;
&lt;br /&gt;
Scrivere specifiche per comunicazione tra BCI2000 e un modulo applicativo P300 esterno che gira su una macchina Linux separata&lt;br /&gt;
&lt;br /&gt;
==Integrazione con ErrP==&lt;br /&gt;
&lt;br /&gt;
Il sistema basato su BCI2000 che usa P300 va espanso per poter usar anche i potenziali d'errore&lt;br /&gt;
&lt;br /&gt;
Ciò che si vuole sviluppare è un sistema che si basi su una procedura di verifica automatica tramite l'integrazione del controllo anche sui potenziali d'errore.&lt;br /&gt;
La verifica dell'Errp non è effettuato tramite media di più forme d'onda così come avviene con le rilevazioni della P300, ma sulla singola prova.&lt;br /&gt;
Infatti, dopo l'analisi delle forme d'onda P300 e la determinazione del target voluto dall'utente, si introduce una ulteriore fase in cui si mostra all'utente la probabile selezione voluta e si valuta la presenza del potenziale d'errore. Se non viene riscontrata questa forma d'onda si seleziona il target precedentemente identificato, altrimenti si ripete una nuova sequenza di stimolazioni per identificare nuovamente il target voluto.&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Introdurre una nova fase di controllo Errp nel modulo applicativo dello speller&lt;br /&gt;
&lt;br /&gt;
Introdurre un nuovo filtro nella catena dei filtri che si occupa del'accumulo dei potenziali d'errore&lt;br /&gt;
&lt;br /&gt;
Modificare opportunamente i filtri di: classificazione, media e normalizzazione per supportare il controllo dell'Errp&lt;br /&gt;
&lt;br /&gt;
==Varie==&lt;br /&gt;
&lt;br /&gt;
Rinominare ''tutte'' le directory dei sorgenti ''in conformità allo stile di BCI2000'' e senza usare spazi.  Allineare i nomi dei moduli e quelli delle directory che li contengono.&lt;/div&gt;</summary>
		<author><name>AndreaSgarlata</name></author>	</entry>

	<entry>
		<id>https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=3152</id>
		<title>Talk:Online P300 and ErrP recognition with BCI2000</title>
		<link rel="alternate" type="text/html" href="https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=3152"/>
				<updated>2008-05-25T08:22:55Z</updated>
		
		<summary type="html">&lt;p&gt;AndreaSgarlata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Plugin Galileo/Modulo sorgente BCI2000==&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo Plugin: sgarlata/Plugin&lt;br /&gt;
&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo sorgente BCI2000: sgarlata/GalileoSourceJitter&lt;br /&gt;
&lt;br /&gt;
Il sistema attualmente è composto da un plugin che si occupa di inviare i dati tramite pipe ad un altro modulo che fa parte dell'intero sistema di BCI2000.&lt;br /&gt;
&lt;br /&gt;
Per ottenere una corretta temporizzazione del sistema di BCI2000 abbiamo sfruttato il fatto che il plugin è più lento nell'invio dei dati rispetto all'intero sistema BCI2000.&lt;br /&gt;
Infatti si è deciso di inviare tramite plugin una quantità di dati costante pari a 1/16 di secondo, tenendo conto del fatto che durante l'esecuzione di una registrazione online la quantità di dati ricevuti dal plugin risulta molto regolare e costante.&lt;br /&gt;
In questo modo ogni invio di dati tramite pipe rappresenta il trascorrere di un tempo prefissato che risulta pari a 1/16 di secondo.&lt;br /&gt;
&lt;br /&gt;
Sono stati effettuati diversi test (aggiunta di un buffer di accumulo, invio di blocchi di dimensione maggiore 0.1 secondi) per cercare di mantenere il più possibile costante l'intervallo che trascorre tra l'invio di un blocco dati e quello successivo, nonostante questi tentativi abbiamo riscontrato il fatto che l'intervallo tra due blocchi risulta in media molto regolare, questa regolarità viene persa però nei momenti in cui il sistema viene perturbato da fattori esterni dovuti all'intervento dell'utente, quali ad esempio: apertura nuova finestra, spostamento finestre, apertura cartelle ecc...&lt;br /&gt;
Tutti questi fattori possono essere trascurati, in quanto durante l'esecuzione dell'intero sistema l'utente non deve interagire direttamente con il sistema, ma deve solamente essere sottoposto a delle stimolazioni, e se l'utente decide di interagire è perché sta effettuando modifiche ed in quel momento non necessita di un sistema sincrono e regolare.&lt;br /&gt;
:Noi speriamo che non capiti durante il funzionamento normale o sia molto raro ([[User:BernardoDalSeno|BernardoDalSeno]] 20:21, 24 May 2008 (CEST))&lt;br /&gt;
&lt;br /&gt;
Per tutte queste motivazioni si è deciso che il plugin non appena accumulato un blocco dati pari a 1/16 di secondo deve subito inviarlo tramite pipe, in modo da mantenere una regolarità tra l'invio consecutivo di due blocchi.&lt;br /&gt;
&lt;br /&gt;
Nel sever Airbat sono presenti i sorgenti dei differenti plugin implementati con le differenti stategie di funzionamento:&lt;br /&gt;
&lt;br /&gt;
*Cartella sgarlata/PluginPipe: il plugin implementato consente un invio di dati in blocchi di 0.1secondi, consentendo al modulo sorgente di BCI2000 di occuparsi dell'invio di blocchi dati di dimensioni inferiori all'interno del sistema di BCI2000. Questa strategia è stata abbandonata perchè abbiamo notato che a 512Hz il plugin riceveva blocchi di 32 campioni per ogni chiamata, e doveva inviare blocchi di 51 campioni, questa differenza faceva si che l'invio di blocchi non era regolare in quanto ad esempio dopo due chiamate inviavo un blocco da 51 campioni e poi dovevo aspettare 3 chiamate per inviare un nuovo blocco dati.&lt;br /&gt;
&lt;br /&gt;
*Cartella sgarlata/PluginBuffer: il plugin implementato mantiene un buffer di N blocchi dati pari a 1/16 di secondo, ed inizia l'invio di un blocco dati nel momento in cui mezzo buffer è stato riempito, utilizzando come clock di invio l'orologio di invocazione del plugin, dato che in maniera molto regolare vi era un invocazione ogni 1/16 di secondo a 512Hz. La strategia dell'utilizzo del buffer è stata abbandonata in quanto, si introduceva ritardo con il buffer ed in oltre i problemi di perdita di regolarità si verificavano comunque perchè non erano dovuti a dei mancati invii di dati da parte del plugin,ma erano dovuti al fatto che il sistema veniva perturbato da un utente esterno ed il modulo sorgente di BCI2000 attendeva nella lettura di un nuovo blocco.&lt;br /&gt;
&lt;br /&gt;
*Cartella sgarlata/PluginTemporizzato: questo plugin utilizza un blocco dati pari a 1/16 di secondo, ma diversamente dal plugin finale manca della stampa di diversi valori di debug e della possibilità di connessione con il sistema di BCI2000 non sincrona.&lt;br /&gt;
&lt;br /&gt;
Le diverse strategie di sviluppo del plugin sono state studiate ed implementate per poter utilizzare un applicativo di stimolazione che rimanesse sincrono con l'intero sistema e quindi che avesse la possibilità di essere implementato da un modulo applicativo di BCI2000.&lt;br /&gt;
Uno stimolatore sincrono è un vantaggio in quanto consente di farlo evolvere durante l'acquisizione dei segnali e di effettuare diverse scelte sulla base di questi e dei risultati fin ora ottenuti.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Per quanto riguarda il modulo sorgente di BCI2000 questo si occupa di leggere dalla pipe: il numero di canali, il numero di campioni per canale e la frequenza di campionamento. Una volta letti questi valori controlla che l'utente abbia inserito tra i parametri gli stessi valori letti tramite pipe, se questo non avviene blocca l'intero sistema e comunica l'errore all'utente con i valori esatti da inserire. Questa procedura viene ripetuta finché l'utente non inserisce gli stessi parametri letti dal modulo source.  Si è visto che invece non si riesce a passare i parametri dal modulo sorgente agli altri moduli di BCI2000 durante la fase di inizializzazione.&lt;br /&gt;
&lt;br /&gt;
A run time il modulo source si occupa di leggere dalla pipe una blocco di dati e di inviarlo al modulo successivo (modulo filtro); ogni blocco viene inoltrato non appena è disponibile.&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
* Script per il confronto tra dati registrati da BCI2000 e da Galileo.&lt;br /&gt;
* Misurare il numero di campioni per chiamata a varie frequenze.&lt;br /&gt;
* Verifica del jitter (e di eventuale drift) del modulo sorgente di BCI2000.&lt;br /&gt;
* Mettere il codice di debug/test all'interno di blocchi &amp;lt;code&amp;gt;#if&amp;lt;/code&amp;gt; e unire GalileoSource con GalileoSourceJitter.&lt;br /&gt;
* Spiegare '''brevemente''' il contenuto delle directory sgarlata/Plugin* e i problemi di ognuno degli approcci.&lt;br /&gt;
&lt;br /&gt;
==CATENA DI FILTRI DI BCI2000==&lt;br /&gt;
&lt;br /&gt;
Attualmente la catena di filtri del modulo di BCI2000 è suddivisa nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)un filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)un filtro di Trigger che si occupa di rilevare gli inizi delle stimolazioni tramite l'analisi del segnale proveniente dal fototransistor&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa di accumulare più forme d'onda p300 relative alla stessa stimolazione e tra queste farne la media&lt;br /&gt;
&lt;br /&gt;
4)un filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
Si vuole modificare sia la sequenza di filtri che il funzionamento di alcuni di questi nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)filtro di Trigger che determina in maniera automatica, tramite una fase iniziale dettata dal modulo applicativo, il valore di soglia per distinguere gli istanti di tempo in cui il riquadro è nero oppure bianco&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro Trigger: sgarlata/P3SignalProcessingGalileo/TriggerFilterAutoThreshold&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa solamente di accumulare le forme d'onda p300 con un ring buffer che memorizza una porzione di segnale precedente, dato che noi rileviamo l'inizio di una stimolazione con un ritardo che è pari alla dimensione della finestra mobile fatta scorrere lungo il segnale di trigger&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro P300: sgarlata/P3SignalProcessingGalileo/P3CollectorFilterGALILEO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4)filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)filtro che effettua la media dei valori in uscita dal filtro di classificazione&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro Media: sgarlata/P3SignalProcessingGalileo/MeanFilter&lt;br /&gt;
&lt;br /&gt;
6)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
Filtro che rileva i trigger&lt;br /&gt;
&lt;br /&gt;
Adattamento automatico della soglia per i trigger (Analisi switch riquadro: Bianco-&amp;gt;Nero-&amp;gt;Bianco per un tempo definito dall'utente)&lt;br /&gt;
&lt;br /&gt;
Accumulare forme d'onda con parti che precedono il trigger&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Verificare l'accuratezza della rilevazione dei fronti d'onda, con script Matlab.&lt;br /&gt;
&lt;br /&gt;
==Modulo applicativo speller P300==&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo Applicativo: sgarlata/P3Speller&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il modulo applicativo deve essere adattato al sistema di trigger.&lt;br /&gt;
&lt;br /&gt;
Per quanto riguarda il modulo applicativo bisogna introdurre un riquadro posto nell'angolo superiore destro dello schermo e farlo variare (bianco/nero) ogni qual volta viene effettuata una stimolazione e, prima dell'inizio della sequenza di stimolazioni, introdurre una fase preliminare in cui si fa variare (bianco/nero) il riquadro per un tempo totale preimpostato in modo da poter far determinare in maniera automatica dal filtro di Trigger il valore di soglia che permette di distinguere se siamo in fase di stimolazione (riquadro nero) o in fase di non stimolazione (riquadro bianco).&lt;br /&gt;
Terminata la fase di taratura del valore di soglia, lo speller può effettuare la sua sequenza di stimolazioni.&lt;br /&gt;
&lt;br /&gt;
Per le modifiche da effettuare al modulo applicativo di BCI2000 quando questo deve comunicare tramite protocollo UDP con un altro applicativo che effettua le stimolazioni su una differente macchina Linux si è invitati a visionare la relativa discussione di Roberto Massimini.&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
Aggiungere quadrato di sync nell'applicazione speller&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Misurare lo sfasamento tra sync e stimolo&lt;br /&gt;
&lt;br /&gt;
Sviluppare sistema per associare la stimolazione ai trigger rilevati dall'apposito filtro&lt;br /&gt;
&lt;br /&gt;
Scrivere specifiche per comunicazione tra BCI2000 e un modulo applicativo P300 esterno che gira su una macchina Linux separata&lt;br /&gt;
&lt;br /&gt;
==Integrazione con ErrP==&lt;br /&gt;
&lt;br /&gt;
Il sistema basato su BCI2000 che usa P300 va espanso per poter usar anche i potenziali d'errore&lt;br /&gt;
&lt;br /&gt;
Ciò che si vuole sviluppare è un sistema che si basi su una procedura di verifica automatica tramite l'integrazione del controllo anche sui potenziali d'errore.&lt;br /&gt;
La verifica dell'Errp non è effettuato tramite media di più forme d'onda così come avviene con le rilevazioni della P300, ma sulla singola prova.&lt;br /&gt;
Infatti, dopo l'analisi delle forme d'onda P300 e la determinazione del target voluto dall'utente, si introduce una ulteriore fase in cui si mostra all'utente la probabile selezione voluta e si valuta la presenza del potenziale d'errore. Se non viene riscontrata questa forma d'onda si seleziona il target precedentemente identificato, altrimenti si ripete una nuova sequenza di stimolazioni per identificare nuovamente il target voluto.&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Introdurre una nova fase di controllo Errp nel modulo applicativo dello speller&lt;br /&gt;
&lt;br /&gt;
Introdurre un nuovo filtro nella catena dei filtri che si occupa del'accumulo dei potenziali d'errore&lt;br /&gt;
&lt;br /&gt;
Modificare opportunamente i filtri di: classificazione, media e normalizzazione per supportare il controllo dell'Errp&lt;br /&gt;
&lt;br /&gt;
==Varie==&lt;br /&gt;
&lt;br /&gt;
Rinominare ''tutte'' le directory dei sorgenti ''in conformità allo stile di BCI2000'' e senza usare spazi.  Allineare i nomi dei moduli e quelli delle directory che li contengono.&lt;/div&gt;</summary>
		<author><name>AndreaSgarlata</name></author>	</entry>

	<entry>
		<id>https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=3146</id>
		<title>Talk:Online P300 and ErrP recognition with BCI2000</title>
		<link rel="alternate" type="text/html" href="https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=3146"/>
				<updated>2008-05-24T09:28:46Z</updated>
		
		<summary type="html">&lt;p&gt;AndreaSgarlata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Plugin Galileo/Modulo sorgente BCI2000==&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo Plugin: sgarlata/Plugin&lt;br /&gt;
&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo sorgente BCI2000: sgarlata/GalileoSourceJitter&lt;br /&gt;
&lt;br /&gt;
Il sistema attualmente è composto da un plugin che si occupa di inviare i dati tramite pipe ad un altro modulo che fa parte dell'intero sistema di BCI2000.&lt;br /&gt;
&lt;br /&gt;
Per ottenere una corretta temporizzazione del sistema di BCI2000 abbiamo sfruttato il fatto che il plugin è più lento nell'invio dei dati rispetto all'intero sistema BCI2000.&lt;br /&gt;
Infatti si è deciso di inviare tramite plugin una quantità di dati costante pari a 1/16 di secondo, tenendo conto del fatto che durante l'esecuzione di una registrazione online la quantità di dati ricevuti dal plugin risulta molto regolare e costante.&lt;br /&gt;
In questo modo ogni invio di dati tramite pipe rappresenta il trascorrere di un tempo prefissato che risulta pari a 1/16 di secondo.&lt;br /&gt;
&lt;br /&gt;
Sono stati effettuati diversi test (aggiunta di un buffer di accumulo, invio di blocchi di dimensione maggiore 0.1secondi) per cercare di mantenere il più possibile costante l'intervallo che trascorre tra l'invio di un blocco dati e quello successivo, nonostante questi tentativi abbiamo riscontrato il fatto che l'intervallo tra due blocchi risulta in media molto regolare, questa regolarità viene persa però nei momenti in cui il sistema viene perturbato da fattori esterni dovuti all'intervento dell'utente, quali ad esempio: apertura nuva finestra, spostamento finestre, apertura cartelle ecc...&lt;br /&gt;
Tutti questi fattori possono essere trascurati, in quanto durante l'esecuzione dell'intero sistema l'utente non deve interagire direttamente con il sistema, ma deve solamente essere sottoposto a delle stimolazioni, e se l'utente decide di interagire è perchè sta effettuando modifiche ed in quel momento non necessita di un sistema sincrono e regolare.&lt;br /&gt;
&lt;br /&gt;
Per tutte queste motivazioni si è deciso che il plugin non appena accumulato un blocco dati pari a 1/16 di secondo deve subito inviarlo tramite pipe, in modo da mantenere una regolarità tra l'invio consecutivo di due blocchi.&lt;br /&gt;
&lt;br /&gt;
Per quanto rigurada il modulo sorgente di BCI2000 questo si occupa di leggere dalla pipe: il numero di canali, il numero di campioni per canale e la frequenza di campionamento. Una volta letti questi valori controlla che l'utente abbia inserito tra i parametri gli stessi valori letti tramite pipe, se questo non avviene blocca l'intero sistema e comunica l'errore all'utente con i valori esatti da inserire. Questa procedura viene ripetuta finchè l'utente non inserisce gli stessi parametri letti dal modulo source.&lt;br /&gt;
A run time il modulo source si occupa di leggere dalla pipe una blocco di dati e di inviarlo al modulo successivo (modulo filtro).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Misurare il numero di campioni per chiamata a varie frequenze.&lt;br /&gt;
&lt;br /&gt;
==CATENA DI FILTRI DI BCI2000==&lt;br /&gt;
&lt;br /&gt;
Attualmente la catena di filtri del modulo di BCI2000 è suddivisa nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)un filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)un filtro di Trigger che si occupa di rilevare gli inizi delle stimolazioni tramite l'analisi del segnale proveniente dal fototransistor&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa di accumulare più forme d'onda p300 relative alla stessa stimolazione e tra queste farne la media&lt;br /&gt;
&lt;br /&gt;
4)un filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
Si vuole modificare sia la sequenza di filtri che il funzionamento di alcuni di questi nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)filtro di Trigger che determina in maniera automatica, tramite una fase iniziale dettata dal modulo applicativo, il valore di soglia per distinguere gli istanti di tempo in cui il riquadro è nero oppure bianco&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro Trigger: sgarlata/P3SignalProcessingGalileo/TriggerFilterAutoThreshold&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa solamente di accumulare le forme d'onda p300 con un ring buffer che memorizza una porzione di segnale precedente, dato che noi rileviamo l'inizio di una stimolazione con un ritardo che è pari alla dimensione della finestra mobile fatta scorrere lungo il segnale di trigger&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro P300: sgarlata/P3SignalProcessingGalileo/P3CollectorFilterGALILEO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4)filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)filtro che effettua la media dei valori in uscita dal filtro di classificazione&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro Media: sgarlata/P3SignalProcessingGalileo/MeanFilter&lt;br /&gt;
&lt;br /&gt;
6)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
Filtro che rileva i trigger&lt;br /&gt;
&lt;br /&gt;
Adattamento automatico della soglia per i trigger (Analisi switch riquadro: Bianco-&amp;gt;Nero-&amp;gt;Bianco per un tempo definito dall'utente)&lt;br /&gt;
&lt;br /&gt;
Accumulare forme d'onda con parti che precedono il trigger&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Verificare l'accuratezza della rilevazione dei fronti d'onda&lt;br /&gt;
&lt;br /&gt;
==Modulo applicativo speller P300==&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo Applicativo: sgarlata/P3Speller&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il modulo applicativo deve essere adattato al sistema di trigger.&lt;br /&gt;
&lt;br /&gt;
Per quanto riguarda il modulo applicativo bisogna introdurre un riquadro posto nell'angolo superiore destro dello schermo e farlo variare (bianco/nero) ogni qual volta viene effettuata una stimolazione e, prima dell'inizio della sequenza di stimolazioni, introdurre una fase preliminare in cui si fa variare (bianco/nero) il riquadro per un tempo totale preimpostato in modo da poter far determinare in maniera automatica dal filtro di Trigger il valore di soglia che permette di distinguere se siamo in fase di stimolazione (riquadro nero) o in fase di non stimolazione (riquadro bianco).&lt;br /&gt;
Terminata la fase di taratura del valore di soglia, lo speller può effettuare la sua sequenza di stimolazioni.&lt;br /&gt;
&lt;br /&gt;
Per le modifiche da effettuare al modulo applicativo di BCI2000 quando questo deve comunicare tramite protocollo UDP con un altro applicativo che effettua le stimolazioni su una differente macchina Linux si è invitati a visionare la relativa discussione di Roberto Massimini.&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
Aggiungere quadrato di sync nell'applicazione speller&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Misurare lo sfasamento tra sync e stimolo&lt;br /&gt;
&lt;br /&gt;
Sviluppare sistema per associare la stimolazione ai trigger rilevati dall'apposito filtro&lt;br /&gt;
&lt;br /&gt;
Scrivere specifiche per comunicazione tra BCI2000 e un modulo applicativo P300 esterno che gira su una macchina Linux separata&lt;br /&gt;
&lt;br /&gt;
==Integrazione con ErrP==&lt;br /&gt;
&lt;br /&gt;
Il sistema basato su BCI2000 che usa P300 va espanso per poter usar anche i potenziali d'errore&lt;br /&gt;
&lt;br /&gt;
Ciò che si vuole sviluppare è un sistema che si basi su una procedura di verifica automatica tramite l'integrazione del controllo anche sui potenziali d'errore.&lt;br /&gt;
La verifica dell'Errp non è effettuato tramite media di più forme d'onda così come avviene con le rilevazioni della P300, ma sulla singola prova.&lt;br /&gt;
Infatti, dopo l'analisi delle forme d'onda P300 e la determinazione del target voluto dall'utente, si introduce una ulteriore fase in cui si mostra all'utente la probabile selezione voluta e si valuta la presenza del potenziale d'errore. Se non viene riscontrata questa forma d'onda si seleziona il target precedentemente identificato, altrimenti si ripete una nuova sequenza di stimolazioni per identificare nuovamente il target voluto.&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Introdurre una nova fase di controllo Errp nel modulo applicativo dello speller&lt;br /&gt;
&lt;br /&gt;
Introdurre un nuovo filtro nella catena dei filtri che si occupa del'accumulo dei potenziali d'errore&lt;br /&gt;
&lt;br /&gt;
Modificare opportunamente i filtri di: classificazione, media e normalizzazione per supportare il controllo dell'Errp&lt;br /&gt;
&lt;br /&gt;
==Varie==&lt;br /&gt;
&lt;br /&gt;
Rinominare ''tutte'' le directory dei sorgenti ''in conformità allo stile di BCI2000'' e senza usare spazi.  Allineare i nomi dei moduli e quelli delle directory che li contengono.&lt;/div&gt;</summary>
		<author><name>AndreaSgarlata</name></author>	</entry>

	<entry>
		<id>https://airwiki.deib.polimi.it/index.php?title=User:AndreaSgarlata&amp;diff=2906</id>
		<title>User:AndreaSgarlata</title>
		<link rel="alternate" type="text/html" href="https://airwiki.deib.polimi.it/index.php?title=User:AndreaSgarlata&amp;diff=2906"/>
				<updated>2008-05-13T14:14:31Z</updated>
		
		<summary type="html">&lt;p&gt;AndreaSgarlata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{User&lt;br /&gt;
|firstname=Andrea&lt;br /&gt;
|lastname=Sgarlata&lt;br /&gt;
|email=andrea (dot) sgarlata (at) mail (dot) polimi (dot) it&lt;br /&gt;
|advisor=Matteo Matteucci - Bernardo Dal Seno&lt;br /&gt;
|projectpage=Command a wheelchair using BCI2000&lt;br /&gt;
|photo=Andrea.jpg&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>AndreaSgarlata</name></author>	</entry>

	<entry>
		<id>https://airwiki.deib.polimi.it/index.php?title=User:AndreaSgarlata&amp;diff=2905</id>
		<title>User:AndreaSgarlata</title>
		<link rel="alternate" type="text/html" href="https://airwiki.deib.polimi.it/index.php?title=User:AndreaSgarlata&amp;diff=2905"/>
				<updated>2008-05-13T14:14:02Z</updated>
		
		<summary type="html">&lt;p&gt;AndreaSgarlata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{User&lt;br /&gt;
|firstname=Andrea&lt;br /&gt;
|lastname=Sgarlata&lt;br /&gt;
|email=andrea (dot) sgarlata (at) mail (dot) polimi (dot) it&lt;br /&gt;
|advisor=Matteo Matteucci - Bernardo Dal Seno&lt;br /&gt;
|projectpage=Command_a_wheelchair_using_BCI2000&lt;br /&gt;
|photo=Andrea.jpg&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>AndreaSgarlata</name></author>	</entry>

	<entry>
		<id>https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2904</id>
		<title>Talk:Online P300 and ErrP recognition with BCI2000</title>
		<link rel="alternate" type="text/html" href="https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2904"/>
				<updated>2008-05-13T13:58:33Z</updated>
		
		<summary type="html">&lt;p&gt;AndreaSgarlata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==PLUGIN==&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo Plugin: sgarlata/PluginTemporizzato&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il sistema attualmente è composto da un plugin che si occupa di inviare i dati tramite pipe ad un altro modulo che fa parte dell'intero sistema di BCI2000.&lt;br /&gt;
&lt;br /&gt;
Per ottenere una corretta temporizzazione del sistema di BCI2000 abbiamo sfruttato il fatto che il plugin è più lento nell'invio dei dati rispetto all'intero sistema BCI2000.&lt;br /&gt;
Infatti si è deciso di inviare tramite plugin una quantità di dati costante pari a 1/16 di secondo, nonostante che, i dati ricevuti dal plugin non sono un valore costante ma variabile intorno ad un certo valore medio, monitorando nel frattempo l'accumulo medio di campioni. &lt;br /&gt;
In questo modo ogni invio di dati rappresenta il trascorrere di un tempo prefissato che è in media è 1/16 di secondo.&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
Test effettuato:&lt;br /&gt;
&lt;br /&gt;
* freq. campionamento: 128Hz&lt;br /&gt;
* numero campioni per blocco dati da 1/16 di secondo: 8&lt;br /&gt;
* visualizzazione accumulo medio ogni 10 chiamate al plugin&lt;br /&gt;
* visualizzazione numero blocchi di dati inviati ogni 10 chiamate&lt;br /&gt;
&lt;br /&gt;
Risultati:&lt;br /&gt;
&lt;br /&gt;
[[Image:plugin.jpg]]&lt;br /&gt;
&lt;br /&gt;
* come mostrato in figura si può vedere che l'accumulo medio varia da 1 a 0 campioni (accumulo calcolato come il numero di campioni rimanenti in memoria dopo l'invio di un blocco dati)&lt;br /&gt;
* il numero di blocchi inviati varia da 1 a 2 blocchi con una media di blocchi inviati ogni 10 chiamate leggermente inferiore a 2 (nella schermata specifica 1.71). Nell'esempio sono stati inviati circa 14 campioni che equivalgono circa a 109 msec di dati.&lt;br /&gt;
:Non mi è chiaro; il plugin non dovrebbe ricevere e inviare in media 1 blocco di 1/16 di secondo alla volta? ([[User:BernardoDalSeno|BernardoDalSeno]] 20:07, 30 April 2008 (CEST))&lt;br /&gt;
:Il plugin invia blocchi dati di 1/16 di secondo, ma riceve dall'applicativo EBNeuro per ogni invocazione della LoadData(...) (quindi ogni chiamata del plugin) un numero di campioni variabile (1-2 campioni). Probabilmente vi sono temporizzazioni interne che dipendono da diveri parametri, ad esempio con 9 canali a 512Hz vi era un'invocazione del plugin ogni 1/16 di secondo con il passaggio di una media di 32 campioni per canale, mentre con 25 canali a 128Hz vi è un'invocazione del plugin ogni 1/64 di secondo con l'invio di circa 2 campioni per canale. Comunque non è un problema quanti campioni riceve il plugin, l'importante è che questo invia blocchi dati da 1/16 di secondo e che ogni blocco inviato rappresenta il trascorrere di 1/16 di secondo.&lt;br /&gt;
Nell'immagine seguente è mostrato una parte di una sequenza di dati che riceve il plugin (25 canali a 128Hz).&lt;br /&gt;
[[Image:pluginSamp.jpg]]&lt;br /&gt;
* il variare del numero di blocchi inviati dipende dall'accumulo verificatosi nelle chiamate precedenti e dal fatto che al plugin non arriva una quantità di dati costanti.&lt;br /&gt;
&lt;br /&gt;
Possiamo affermare comunque che sfruttando l'invio di una quantità di dati costanti, rappresentanti un certo intervallo di tempo, si riesce ad ottenere una temporizzazione dell'intero sistema BCI2000 che in media si posiziona nell'intorno della temporizzazione dettata dal plugin che è di 1/16 di secondo per ogni blocco dati processato.&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Pensare a un modo per misurare la temporizzazione online.&lt;br /&gt;
&lt;br /&gt;
Test online per verificare la temporizzazione.&lt;br /&gt;
&lt;br /&gt;
==CATENA DI FILTRI DI BCI2000==&lt;br /&gt;
&lt;br /&gt;
Attualmente la catena di filtri del modulo di BCI2000 è suddivisa nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)un filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)un filtro di Trigger che si occupa di rilevare gli inizi delle stimolazioni tramite l'analisi del segnale proveniente dal fototransistor&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa di accumulare più forme d'onda p300 relative alla stessa stimolazione e tra queste farne la media&lt;br /&gt;
&lt;br /&gt;
4)un filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
Si vuole modificare sia la sequenza di filtri che il funzionamento di alcuni di questi nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)filtro di Trigger che determina in maniera automatica, tramite una fase iniziale dettata dal modulo applicativo, il valore di soglia per distinguere gli istanti di tempo in cui il riquadro è nero oppure bianco&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro Trigger: sgarlata/P3SignalProcessingGalileo/FiltroTriggerSogliaAutomatica&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa solamente di accumulare le forme d'onda p300 con un ring buffer che memorizza una porzione di segnale precedente, dato che noi rileviamo l'inizio di una stimolazione con un ritardo che è pari alla dimensione della finestra mobile fatta scorrere lungo il segnale di trigger&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro P300: sgarlata/P3SignalProcessingGalileo/FiltroAccumulatoreP300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4)filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)filtro che effettua la media dei valori in uscita dal filtro di classificazione&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro Media: sgarlata/P3SignalProcessingGalileo/FiltroMedia&lt;br /&gt;
&lt;br /&gt;
6)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
Filtro che rileva i trigger&lt;br /&gt;
&lt;br /&gt;
Adattamento automatico della soglia per i trigger (Analisi switch riquadro: Bianco-&amp;gt;Nero-&amp;gt;Bianco per un tempo definito dall'utente)&lt;br /&gt;
&lt;br /&gt;
Accumulare forme d'onda con parti che precedono il trigger&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Modulo applicativo speller P300==&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo Applicativo: sgarlata/P3SpellerQuadratino&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il modulo applicativo deve essere adattato al sistema di trigger.&lt;br /&gt;
&lt;br /&gt;
Per quanto riguarda il modulo applicativo bisogna introdurre un riquadro posto nell'angolo superiore destro dello schermo e farlo variare (bianco/nero) ogni qual volta viene effettuata una stimolazione e, prima dell'inizio della sequenza di stimolazioni, introdurre una fase preliminare in cui si fa variare (bianco/nero) il riquadro per un tempo totale preimpostato in modo da poter far determinare in maniera automatica dal filtro di Trigger il valore di soglia che permette di distinguere se siamo in fase di stimolazione (riquadro nero) o in fase di non stimolazione (riquadro bianco).&lt;br /&gt;
Terminata la fase di taratura del valore di soglia, lo speller può effettuare la sua sequenza di stimolazioni.&lt;br /&gt;
&lt;br /&gt;
Per le modifiche da effettuare al modulo applicativo di BCI2000 quando questo deve comunicare tramite protocollo UDP con un altro applicativo che effettua le stimolazioni su una differente macchina Linux si è invitati a visionare la relativa discussione di Roberto Massimini.&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
Aggiungere quadrato di sync nell'applicazione speller&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Misurare lo sfasamento tra sync e stimolo&lt;br /&gt;
&lt;br /&gt;
Sviluppare sistema per associare la stimolazione ai trigger rilevati dall'apposito filtro&lt;br /&gt;
&lt;br /&gt;
Scrivere specifiche per comunicazione tra BCI2000 e un modulo applicativo P300 esterno che gira su una macchina Linux separata&lt;br /&gt;
&lt;br /&gt;
==Integrazione con ErrP==&lt;br /&gt;
&lt;br /&gt;
Il sistema basato su BCI2000 che usa P300 va espanso per poter usar anche i potenziali d'errore&lt;br /&gt;
&lt;br /&gt;
Ciò che si vuole sviluppare è un sistema che si basi su una procedura di verifica automatica tramite l'integrazione del controllo anche sui potenziali d'errore.&lt;br /&gt;
La verifica dell'Errp non è effettuato tramite media di più forme d'onda così come avviene con le rilevazioni della P300, ma sulla singola prova.&lt;br /&gt;
Infatti, dopo l'analisi delle forme d'onda P300 e la determinazione del target voluto dall'utente, si introduce una ulteriore fase in cui si mostra all'utente la probabile selezione voluta e si valuta la presenza del potenziale d'errore. Se non viene riscontrata questa forma d'onda si seleziona il target precedentemente identificato, altrimenti si ripete una nuova sequenza di stimolazioni per identificare nuovamente il target voluto.&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Introdurre una nova fase di controllo Errp nel modulo applicativo dello speller&lt;br /&gt;
&lt;br /&gt;
Introdurre un nuovo filtro nella catena dei filtri che si occupa del'accumulo dei potenziali d'errore, oppure modificare il filtro P300 in modo che in base ad una variabile di switch effettui l'accumulo della forma d'onda P300 oppure dei potenziali d'errore&lt;br /&gt;
&lt;br /&gt;
Modificare opportunamente i filtri di: classificazione, media e normalizzazione per supportare il controllo dell'Errp&lt;br /&gt;
&lt;br /&gt;
==Varie==&lt;br /&gt;
&lt;br /&gt;
Rinominare le directory dei sorgenti in conformità allo stile di BCI2000 e senza usare spazi.&lt;br /&gt;
&lt;br /&gt;
Aggiungere riferimenti alla posizione dei progetti (directory) su Airbat per ognuno dei moduli sviluppati descritti nelle pagina.&lt;/div&gt;</summary>
		<author><name>AndreaSgarlata</name></author>	</entry>

	<entry>
		<id>https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2903</id>
		<title>Talk:Online P300 and ErrP recognition with BCI2000</title>
		<link rel="alternate" type="text/html" href="https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2903"/>
				<updated>2008-05-13T13:56:10Z</updated>
		
		<summary type="html">&lt;p&gt;AndreaSgarlata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==PLUGIN==&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo Plugin: sgarlata/PluginTemporizzato&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il sistema attualmente è composto da un plugin che si occupa di inviare i dati tramite pipe ad un altro modulo che fa parte dell'intero sistema di BCI2000.&lt;br /&gt;
&lt;br /&gt;
Per ottenere una corretta temporizzazione del sistema di BCI2000 abbiamo sfruttato il fatto che il plugin è più lento nell'invio dei dati rispetto all'intero sistema BCI2000.&lt;br /&gt;
Infatti si è deciso di inviare tramite plugin una quantità di dati costante pari a 1/16 di secondo, nonostante che, i dati ricevuti dal plugin non sono un valore costante ma variabile intorno ad un certo valore medio, monitorando nel frattempo l'accumulo medio di campioni. &lt;br /&gt;
In questo modo ogni invio di dati rappresenta il trascorrere di un tempo prefissato che è in media è 1/16 di secondo.&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
Test effettuato:&lt;br /&gt;
&lt;br /&gt;
* freq. campionamento: 128Hz&lt;br /&gt;
* numero campioni per blocco dati da 1/16 di secondo: 8&lt;br /&gt;
* visualizzazione accumulo medio ogni 10 chiamate al plugin&lt;br /&gt;
* visualizzazione numero blocchi di dati inviati ogni 10 chiamate&lt;br /&gt;
&lt;br /&gt;
Risultati:&lt;br /&gt;
&lt;br /&gt;
[[Image:plugin.jpg]]&lt;br /&gt;
&lt;br /&gt;
* come mostrato in figura si può vedere che l'accumulo medio varia da 1 a 0 campioni (accumulo calcolato come il numero di campioni rimanenti in memoria dopo l'invio di un blocco dati)&lt;br /&gt;
* il numero di blocchi inviati varia da 1 a 2 blocchi con una media di blocchi inviati ogni 10 chiamate leggermente inferiore a 2 (nella schermata specifica 1.71). Nell'esempio sono stati inviati circa 14 campioni che equivalgono circa a 109 msec di dati.&lt;br /&gt;
:Non mi è chiaro; il plugin non dovrebbe ricevere e inviare in media 1 blocco di 1/16 di secondo alla volta? ([[User:BernardoDalSeno|BernardoDalSeno]] 20:07, 30 April 2008 (CEST))&lt;br /&gt;
:Il plugin invia blocchi dati di 1/16 di secondo, ma riceve dall'applicativo EBNeuro per ogni invocazione della LoadData(...) (quindi ogni chiamata del plugin) un numero di campioni variabile (1-2 campioni). Probabilmente vi sono temporizzazioni interne che dipendono da diveri parametri, ad esempio con 9 canali a 512Hz vi era un'invocazione del plugin ogni 1/16 di secondo con il passaggio di una media di 32 campioni per canale, mentre con 25 canali a 128Hz vi è un'invocazione del plugin ogni 1/64 di secondo con l'invio di circa 2 campioni per canale. Comunque non è un problema quanti campioni riceve il plugin, l'importante è che questo invia blocchi dati da 1/16 di secondo e che ogni blocco inviato rappresenta il trascorrere di 1/16 di secondo.&lt;br /&gt;
Nell'immagine seguente è mostrato una parte di una sequenza di dati che riceve il plugin (25 canali a 128Hz).&lt;br /&gt;
[[Image:pluginSamp.jpg]]&lt;br /&gt;
* il variare del numero di blocchi inviati dipende dall'accumulo verificatosi nelle chiamate precedenti e dal fatto che al plugin non arriva una quantità di dati costanti.&lt;br /&gt;
&lt;br /&gt;
Possiamo affermare comunque che sfruttando l'invio di una quantità di dati costanti, rappresentanti un certo intervallo di tempo, si riesce ad ottenere una temporizzazione dell'intero sistema BCI2000 che in media si posiziona nell'intorno della temporizzazione dettata dal plugin che è di 1/16 di secondo per ogni blocco dati processato.&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Pensare a un modo per misurare la temporizzazione online.&lt;br /&gt;
&lt;br /&gt;
Test online per verificare la temporizzazione.&lt;br /&gt;
&lt;br /&gt;
==CATENA DI FILTRI DI BCI2000==&lt;br /&gt;
&lt;br /&gt;
Attualmente la catena di filtri del modulo di BCI2000 è suddivisa nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)un filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)un filtro di Trigger che si occupa di rilevare gli inizi delle stimolazioni tramite l'analisi del segnale proveniente dal fototransistor&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa di accumulare più forme d'onda p300 relative alla stessa stimolazione e tra queste farne la media&lt;br /&gt;
&lt;br /&gt;
4)un filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
Si vuole modificare sia la sequenza di filtri che il funzionamento di alcuni di questi nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)filtro di Trigger che determina in maniera automatica, tramite una fase iniziale dettata dal modulo applicativo, il valore di soglia per distinguere gli istanti di tempo in cui il riquadro è nero oppure bianco&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro Trigger: sgarlata/P3SignalProcessingGalileo/FiltroTriggerSogliaAutomatica&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa solamente di accumulare le forme d'onda p300 con un ring buffer che memorizza una porzione di segnale precedente, dato che noi rileviamo l'inizio di una stimolazione con un ritardo che è pari alla dimensione della finestra mobile fatta scorrere lungo il segnale di trigger&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro P300: sgarlata/P3SignalProcessingGalileo/FiltroAccumulatoreP300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4)filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)filtro che effettua la media dei valori in uscita dal filtro di classificazione&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro Media: sgarlata/P3SignalProcessingGalileo/FiltroMedia&lt;br /&gt;
&lt;br /&gt;
6)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
Filtro che rileva i trigger&lt;br /&gt;
&lt;br /&gt;
Adattamento automatico della soglia per i trigger (Analisi switch riquadro: Bianco-&amp;gt;Nero-&amp;gt;Bianco per un tempo definito dall'utente)&lt;br /&gt;
&lt;br /&gt;
Accumulare forme d'onda con parti che precedono il trigger&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Modulo applicativo speller P300==&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo Applicativo: sgarlata/P3SpellerQuadratino&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il modulo applicativo deve essere adattato al sistema di trigger.&lt;br /&gt;
&lt;br /&gt;
Per quanto riguarda il modulo applicativo bisogna introdurre un riquadro posto nell'angolo superiore destro dello schermo e farlo variare (bianco/nero) ogni qual volta viene effettuata una stimolazione e, prima dell'inizio della sequenza di stimolazioni, introdurre una fase preliminare in cui si fa variare (bianco/nero) il riquadro per un tempo totale preimpostato in modo da poter far determinare in maniera automatica dal filtro di Trigger il valore di soglia che permette di distinguere se siamo in fase di stimolazione (riquadro nero) o in fase di non stimolazione (riquadro bianco).&lt;br /&gt;
Terminata la fase di taratura del valore di soglia, lo speller può effettuare la sua sequenza di stimolazioni.&lt;br /&gt;
&lt;br /&gt;
Per le modifiche da effettuare al modulo applicativo di BCI2000 quando questo deve comunicare tramite protocollo UDP con un altro applicativo che effettua le stimolazioni su una differente macchina Linux si è invitati a visionare la relativa discussione di Roberto Massimini.&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
Aggiungere quadrato di sync nell'applicazione speller&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Misurare lo sfasamento tra sync e stimolo&lt;br /&gt;
&lt;br /&gt;
Sviluppare sistema per associare la stimolazione ai trigger rilevati dall'apposito filtro&lt;br /&gt;
&lt;br /&gt;
Scrivere specifiche per comunicazione tra BCI2000 e un modulo applicativo P300 esterno che gira su una macchina Linux separata&lt;br /&gt;
&lt;br /&gt;
==Integrazione con ErrP==&lt;br /&gt;
&lt;br /&gt;
Il sistema basato su BCI2000 che usa P300 va espanso per poter usar anche i potenziali d'errore&lt;br /&gt;
&lt;br /&gt;
Ciò che si vuole sviluppare è un sistema che si basi su una procedura di verifica automatica tramite l'integrazione del controllo anche sui potenziali d'errore.&lt;br /&gt;
La verifica dell'Errp non è effettuato tramite media di più forme d'onda così come avviene con le rilevazioni della P300, ma sulla singola prova.&lt;br /&gt;
Infatti, dopo l'analisi delle forme d'onda P300 e la determinazione del target voluto dall'utente, si introduce una ulteriore fase in cui si mostra all'utente la probabile selezione dell'utente e si valuta la presenza del potenziale d'errore. Se non viene riscontrata questa forma d'onda si seleziona il target precedentemente identificato, altrimenti si ripete una nuova sequenza di stimolazioni per identificare nuovamente la selezione voluta dall'utente.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Introdurre una nova fase di controllo Errp nel modulo applicativo dello speller&lt;br /&gt;
&lt;br /&gt;
Introdurre un nuovo filtro nella catena dei filtri che si occupa del'accumulo dei potenziali d'errore, oppure modificare il filtro P300 in modo che in base ad una variabile di switch effettui l'accumulo della forma d'onda P300 oppure dei potenziali d'errore&lt;br /&gt;
&lt;br /&gt;
Modificare opportunamente i filtri di: classificazione, media e normalizzazione per supportare il controllo dell'Errp&lt;br /&gt;
&lt;br /&gt;
==Varie==&lt;br /&gt;
&lt;br /&gt;
Rinominare le directory dei sorgenti in conformità allo stile di BCI2000 e senza usare spazi.&lt;br /&gt;
&lt;br /&gt;
Aggiungere riferimenti alla posizione dei progetti (directory) su Airbat per ognuno dei moduli sviluppati descritti nelle pagina.&lt;/div&gt;</summary>
		<author><name>AndreaSgarlata</name></author>	</entry>

	<entry>
		<id>https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2880</id>
		<title>Talk:Online P300 and ErrP recognition with BCI2000</title>
		<link rel="alternate" type="text/html" href="https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2880"/>
				<updated>2008-05-12T09:18:09Z</updated>
		
		<summary type="html">&lt;p&gt;AndreaSgarlata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==PLUGIN==&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo Plugin: sgarlata/PluginTemporizzato&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il sistema attualmente è composto da un plugin che si occupa di inviare i dati tramite pipe ad un altro modulo che fa parte dell'intero sistema di BCI2000.&lt;br /&gt;
&lt;br /&gt;
Per ottenere una corretta temporizzazione del sistema di BCI2000 abbiamo sfruttato il fatto che il plugin è più lento nell'invio dei dati rispetto all'intero sistema BCI2000.&lt;br /&gt;
Infatti si è deciso di inviare tramite plugin una quantità di dati costante pari a 1/16 di secondo, nonostante che, i dati ricevuti dal plugin non sono un valore costante ma variabile intorno ad un certo valore medio, monitorando nel frattempo l'accumulo medio di campioni. &lt;br /&gt;
In questo modo ogni invio di dati rappresenta il trascorrere di un tempo prefissato che è in media è 1/16 di secondo.&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
Test effettuato:&lt;br /&gt;
&lt;br /&gt;
* freq. campionamento: 128Hz&lt;br /&gt;
* numero campioni per blocco dati da 1/16 di secondo: 8&lt;br /&gt;
* visualizzazione accumulo medio ogni 10 chiamate al plugin&lt;br /&gt;
* visualizzazione numero blocchi di dati inviati ogni 10 chiamate&lt;br /&gt;
&lt;br /&gt;
Risultati:&lt;br /&gt;
&lt;br /&gt;
[[Image:plugin.jpg]]&lt;br /&gt;
&lt;br /&gt;
* come mostrato in figura si può vedere che l'accumulo medio varia da 1 a 0 campioni (accumulo calcolato come il numero di campioni rimanenti in memoria dopo l'invio di un blocco dati)&lt;br /&gt;
* il numero di blocchi inviati varia da 1 a 2 blocchi con una media di blocchi inviati ogni 10 chiamate leggermente inferiore a 2 (nella schermata specifica 1.71). Nell'esempio sono stati inviati circa 14 campioni che equivalgono circa a 109 msec di dati.&lt;br /&gt;
:Non mi è chiaro; il plugin non dovrebbe ricevere e inviare in media 1 blocco di 1/16 di secondo alla volta? ([[User:BernardoDalSeno|BernardoDalSeno]] 20:07, 30 April 2008 (CEST))&lt;br /&gt;
:Il plugin invia blocchi dati di 1/16 di secondo, ma riceve dall'applicativo EBNeuro per ogni invocazione della LoadData(...) (quindi ogni chiamata del plugin) un numero di campioni variabile (1-2 campioni). Probabilmente vi sono temporizzazioni interne che dipendono da diveri parametri, ad esempio con 9 canali a 512Hz vi era un'invocazione del plugin ogni 1/16 di secondo con il passaggio di una media di 32 campioni per canale, mentre con 25 canali a 128Hz vi è un'invocazione del plugin ogni 1/64 di secondo con l'invio di circa 2 campioni per canale. Comunque non è un problema quanti campioni riceve il plugin, l'importante è che questo invia blocchi dati da 1/16 di secondo e che ogni blocco inviato rappresenta il trascorrere di 1/16 di secondo.&lt;br /&gt;
Nell'immagine seguente è mostrato una parte di una sequenza di dati che riceve il plugin (25 canali a 128Hz).&lt;br /&gt;
[[Image:pluginSamp.jpg]]&lt;br /&gt;
* il variare del numero di blocchi inviati dipende dall'accumulo verificatosi nelle chiamate precedenti e dal fatto che al plugin non arriva una quantità di dati costanti.&lt;br /&gt;
&lt;br /&gt;
Possiamo affermare comunque che sfruttando l'invio di una quantità di dati costanti, rappresentanti un certo intervallo di tempo, si riesce ad ottenere una temporizzazione dell'intero sistema BCI2000 che in media si posiziona nell'intorno della temporizzazione dettata dal plugin che è di 1/16 di secondo per ogni blocco dati processato.&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Pensare a un modo per misurare la temporizzazione online.&lt;br /&gt;
&lt;br /&gt;
Test online per verificare la temporizzazione.&lt;br /&gt;
&lt;br /&gt;
==CATENA DI FILTRI DI BCI2000==&lt;br /&gt;
&lt;br /&gt;
Attualmente la catena di filtri del modulo di BCI2000 è suddivisa nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)un filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)un filtro di Trigger che si occupa di rilevare gli inizi delle stimolazioni tramite l'analisi del segnale proveniente dal fototransistor&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa di accumulare più forme d'onda p300 relative alla stessa stimolazione e tra queste farne la media&lt;br /&gt;
&lt;br /&gt;
4)un filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
Si vuole modificare sia la sequenza di filtri che il funzionamento di alcuni di questi nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)filtro di Trigger che determina in maniera automatica, tramite una fase iniziale dettata dal modulo applicativo, il valore di soglia per distinguere gli istanti di tempo in cui il riquadro è nero oppure bianco&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro Trigger: sgarlata/P3SignalProcessingGalileo/FiltroTriggerSogliaAutomatica&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa solamente di accumulare le forme d'onda p300 con un ring buffer che memorizza una porzione di segnale precedente, dato che noi rileviamo l'inizio di una stimolazione con un ritardo che è pari alla dimensione della finestra mobile fatta scorrere lungo il segnale di trigger&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro P300: sgarlata/P3SignalProcessingGalileo/FiltroAccumulatoreP300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4)filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)filtro che effettua la media dei valori in uscita dal filtro di classificazione&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro Media: sgarlata/P3SignalProcessingGalileo/FiltroMedia&lt;br /&gt;
&lt;br /&gt;
6)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
Filtro che rileva i trigger&lt;br /&gt;
&lt;br /&gt;
Adattamento automatico della soglia per i trigger (Analisi switch riquadro: Bianco-&amp;gt;Nero-&amp;gt;Bianco per un tempo definito dall'utente)&lt;br /&gt;
&lt;br /&gt;
Accumulare forme d'onda con parti che precedono il trigger&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Modulo applicativo speller P300==&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo Applicativo: sgarlata/P3SpellerQuadratino&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il modulo applicativo deve essere adattato al sistema di trigger.&lt;br /&gt;
&lt;br /&gt;
Per quanto riguarda il modulo applicativo bisogna introdurre un riquadro posto nell'angolo superiore destro dello schermo e farlo variare (bianco/nero) ogni qual volta viene effettuata una stimolazione e, prima dell'inizio della sequenza di stimolazioni, introdurre una fase preliminare in cui si fa variare (bianco/nero) il riquadro per un tempo totale preimpostato in modo da poter far determinare in maniera automatica dal filtro di Trigger il valore di soglia che permette di distinguere se siamo in fase di stimolazione (riquadro nero) o in fase di non stimolazione (riquadro bianco).&lt;br /&gt;
Terminata la fase di taratura del valore di soglia, lo speller può effettuare la sua sequenza di stimolazioni.&lt;br /&gt;
&lt;br /&gt;
Per le modifiche da effettuare al modulo applicativo di BCI2000 quando questo deve comunicare tramite protocollo UDP con un altro applicativo che effettua le stimolazioni su una differente macchina Linux si è invitati a visionare la relativa discussione di Roberto Massimini.&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
Aggiungere quadrato di sync nell'applicazione speller&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Misurare lo sfasamento tra sync e stimolo&lt;br /&gt;
&lt;br /&gt;
Sviluppare sistema per associare la stimolazione ai trigger rilevati dall'apposito filtro&lt;br /&gt;
&lt;br /&gt;
Scrivere specifiche per comunicazione tra BCI2000 e un modulo applicativo P300 esterno che gira su una macchina Linux separata&lt;br /&gt;
&lt;br /&gt;
==Integrazione con ErrP==&lt;br /&gt;
&lt;br /&gt;
Il sistema basato su BCI2000 che usa P300 va espanso per poter usar anche i potenziali d'errore&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Tutto, anche il dettaglio delle cose da fare...&lt;br /&gt;
&lt;br /&gt;
==Varie==&lt;br /&gt;
&lt;br /&gt;
Rinominare le directory dei sorgenti in conformità allo stile di BCI2000 e senza usare spazi.&lt;br /&gt;
&lt;br /&gt;
Aggiungere riferimenti alla posizione dei progetti (directory) su Airbat per ognuno dei moduli sviluppati descritti nelle pagina.&lt;/div&gt;</summary>
		<author><name>AndreaSgarlata</name></author>	</entry>

	<entry>
		<id>https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2879</id>
		<title>Talk:Online P300 and ErrP recognition with BCI2000</title>
		<link rel="alternate" type="text/html" href="https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2879"/>
				<updated>2008-05-12T09:16:01Z</updated>
		
		<summary type="html">&lt;p&gt;AndreaSgarlata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==PLUGIN==&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo Plugin: sgarlata/PluginTemporizzato&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il sistema attualmente è composto da un plugin che si occupa di inviare i dati tramite pipe ad un altro modulo che fa parte dell'intero sistema di BCI2000.&lt;br /&gt;
&lt;br /&gt;
Per ottenere una corretta temporizzazione del sistema di BCI2000 abbiamo sfruttato il fatto che il plugin è più lento nell'invio dei dati rispetto all'intero sistema BCI2000.&lt;br /&gt;
Infatti si è deciso di inviare tramite plugin una quantità di dati costante pari a 1/16 di secondo, nonostante che, i dati ricevuti dal plugin non sono un valore costante ma variabile intorno ad un certo valore medio, monitorando nel frattempo l'accumulo medio di campioni. &lt;br /&gt;
In questo modo ogni invio di dati rappresenta il trascorrere di un tempo prefissato che è in media è 1/16 di secondo.&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
Test effettuato:&lt;br /&gt;
&lt;br /&gt;
* freq. campionamento: 128Hz&lt;br /&gt;
* numero campioni per blocco dati da 1/16 di secondo: 8&lt;br /&gt;
* visualizzazione accumulo medio ogni 10 chiamate al plugin&lt;br /&gt;
* visualizzazione numero blocchi di dati inviati ogni 10 chiamate&lt;br /&gt;
&lt;br /&gt;
Risultati:&lt;br /&gt;
&lt;br /&gt;
[[Image:plugin.jpg]]&lt;br /&gt;
&lt;br /&gt;
* come mostrato in figura si può vedere che l'accumulo medio varia da 1 a 0 campioni (accumulo calcolato come il numero di campioni rimanenti in memoria dopo l'invio di un blocco dati)&lt;br /&gt;
* il numero di blocchi inviati varia da 1 a 2 blocchi con una media di blocchi inviati ogni 10 chiamate leggermente inferiore a 2 (nella schermata specifica 1.71). Nell'esempio sono stati inviati circa 14 campioni che equivalgono circa a 109 msec di dati.&lt;br /&gt;
:Non mi è chiaro; il plugin non dovrebbe ricevere e inviare in media 1 blocco di 1/16 di secondo alla volta? ([[User:BernardoDalSeno|BernardoDalSeno]] 20:07, 30 April 2008 (CEST))&lt;br /&gt;
:Il plugin invia blocchi dati di 1/16 di secondo, ma riceve dall'applicativo EBNeuro per ogni invocazione della LoadData(...) (quindi ogni chiamata del plugin) un numero di campioni variabile (1-2 campioni). Probabilmente vi sono temporizzazioni interne che dipendono da diveri parametri, ad esempio con 9 canali a 512Hz vi era un'invocazione del plugin ogni 1/16 di secondo con il passaggio di una media di 32 campioni per canale, mentre con 25 canali a 128Hz vi è un'invocazione del plugin ogni 1/64 di secondo con l'invio di circa 2 campioni per canale. Comunque non è un problema quanti campioni riceve il plugin, l'importante è che questo invia blocchi dati da 1/16 di secondo e che ogni blocco inviato rappresenta il trascorrere di 1/16 di secondo.&lt;br /&gt;
Nell'immagine seguente è mostrato una parte di una sequenza di dati che riceve il plugin (25 canali a 128Hz).&lt;br /&gt;
[[Image:pluginSamp.jpg]]&lt;br /&gt;
* il variare del numero di blocchi inviati dipende dall'accumulo verificatosi nelle chiamate precedenti e dal fatto che al plugin non arriva una quantità di dati costanti.&lt;br /&gt;
&lt;br /&gt;
Possiamo affermare comunque che sfruttando l'invio di una quantità di dati costanti, rappresentanti un certo intervallo di tempo, si riesce ad ottenere una temporizzazione dell'intero sistema BCI2000 che in media si posiziona nell'intorno della temporizzazione dettata dal plugin che è di 1/16 di secondo per ogni blocco dati processato.&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Pensare a un modo per misurare la temporizzazione online.&lt;br /&gt;
&lt;br /&gt;
Test online per verificare la temporizzazione.&lt;br /&gt;
&lt;br /&gt;
==CATENA DI FILTRI DI BCI2000==&lt;br /&gt;
&lt;br /&gt;
Attualmente la catena di filtri del modulo di BCI2000 è suddivisa nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)un filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)un filtro di Trigger che si occupa di rilevare gli inizi delle stimolazioni tramite l'analisi del segnale proveniente dal fototransistor&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa di accumulare più forme d'onda p300 relative alla stessa stimolazione e tra queste farne la media&lt;br /&gt;
&lt;br /&gt;
4)un filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
Si vuole modificare sia la sequenza di filtri che il funzionamento di alcuni di questi nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)filtro di Trigger che determina in maniera automatica, tramite una fase iniziale dettata dal modulo applicativo, il valore di soglia per distinguere gli istanti di tempo in cui il riquadro è nero oppure bianco&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro Trigger: sgarlata/P3SignalProcessingGalileo/FiltroTriggerSogliaAutomatica&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa solamente di accumulare le forme d'onda p300 con un ring buffer che memorizza una porzione di segnale precedente, dato che noi rileviamo l'inizio di una stimolazione con un ritardo che è pari alla dimensione della finestra mobile fatta scorrere lungo il segnale di trigger&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro P300: sgarlata/P3SignalProcessingGalileo/FiltroAccumulatoreP300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4)filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)filtro che effettua la media dei valori in uscita dal filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
6)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
Filtro che rileva i trigger&lt;br /&gt;
&lt;br /&gt;
Adattamento automatico della soglia per i trigger (Analisi switch riquadro: Bianco-&amp;gt;Nero-&amp;gt;Bianco per un tempo definito dall'utente)&lt;br /&gt;
&lt;br /&gt;
Accumulare forme d'onda con parti che precedono il trigger&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Modulo applicativo speller P300==&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo Applicativo: sgarlata/P3SpellerQuadratino&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il modulo applicativo deve essere adattato al sistema di trigger.&lt;br /&gt;
&lt;br /&gt;
Per quanto riguarda il modulo applicativo bisogna introdurre un riquadro posto nell'angolo superiore destro dello schermo e farlo variare (bianco/nero) ogni qual volta viene effettuata una stimolazione e, prima dell'inizio della sequenza di stimolazioni, introdurre una fase preliminare in cui si fa variare (bianco/nero) il riquadro per un tempo totale preimpostato in modo da poter far determinare in maniera automatica dal filtro di Trigger il valore di soglia che permette di distinguere se siamo in fase di stimolazione (riquadro nero) o in fase di non stimolazione (riquadro bianco).&lt;br /&gt;
Terminata la fase di taratura del valore di soglia, lo speller può effettuare la sua sequenza di stimolazioni.&lt;br /&gt;
&lt;br /&gt;
Per le modifiche da effettuare al modulo applicativo di BCI2000 quando questo deve comunicare tramite protocollo UDP con un altro applicativo che effettua le stimolazioni su una differente macchina Linux si è invitati a visionare la relativa discussione di Roberto Massimini.&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
Aggiungere quadrato di sync nell'applicazione speller&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Misurare lo sfasamento tra sync e stimolo&lt;br /&gt;
&lt;br /&gt;
Sviluppare sistema per associare la stimolazione ai trigger rilevati dall'apposito filtro&lt;br /&gt;
&lt;br /&gt;
Scrivere specifiche per comunicazione tra BCI2000 e un modulo applicativo P300 esterno che gira su una macchina Linux separata&lt;br /&gt;
&lt;br /&gt;
==Integrazione con ErrP==&lt;br /&gt;
&lt;br /&gt;
Il sistema basato su BCI2000 che usa P300 va espanso per poter usar anche i potenziali d'errore&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Tutto, anche il dettaglio delle cose da fare...&lt;br /&gt;
&lt;br /&gt;
==Varie==&lt;br /&gt;
&lt;br /&gt;
Rinominare le directory dei sorgenti in conformità allo stile di BCI2000 e senza usare spazi.&lt;br /&gt;
&lt;br /&gt;
Aggiungere riferimenti alla posizione dei progetti (directory) su Airbat per ognuno dei moduli sviluppati descritti nelle pagina.&lt;/div&gt;</summary>
		<author><name>AndreaSgarlata</name></author>	</entry>

	<entry>
		<id>https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2797</id>
		<title>Talk:Online P300 and ErrP recognition with BCI2000</title>
		<link rel="alternate" type="text/html" href="https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2797"/>
				<updated>2008-05-05T10:11:35Z</updated>
		
		<summary type="html">&lt;p&gt;AndreaSgarlata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==PLUGIN==&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo Plugin: sgarlata/PluginTemporizzato&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il sistema attualmente è composto da un plugin che si occupa di inviare i dati tramite pipe ad un altro modulo che fa parte dell'intero sistema di BCI2000.&lt;br /&gt;
&lt;br /&gt;
Per ottenere una corretta temporizzazione del sistema di BCI2000 abbiamo sfruttato il fatto che il plugin è più lento nell'invio dei dati rispetto all'intero sistema BCI2000.&lt;br /&gt;
Infatti si è deciso di inviare tramite plugin una quantità di dati costante pari a 1/16 di secondo, nonostante che, i dati ricevuti dal plugin non sono un valore costante ma variabile intorno ad un certo valore medio, monitorando nel frattempo l'accumulo medio di campioni. &lt;br /&gt;
In questo modo ogni invio di dati rappresenta il trascorrere di un tempo prefissato che è in media è 1/16 di secondo.&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
Test effettuato:&lt;br /&gt;
&lt;br /&gt;
* freq. campionamento: 128Hz&lt;br /&gt;
* numero campioni per blocco dati da 1/16 di secondo: 8&lt;br /&gt;
* visualizzazione accumulo medio ogni 10 chiamate al plugin&lt;br /&gt;
* visualizzazione numero blocchi di dati inviati ogni 10 chiamate&lt;br /&gt;
&lt;br /&gt;
Risultati:&lt;br /&gt;
&lt;br /&gt;
[[Image:plugin.jpg]]&lt;br /&gt;
&lt;br /&gt;
* come mostrato in figura si può vedere che l'accumulo medio varia da 1 a 0 campioni (accumulo calcolato come il numero di campioni rimanenti in memoria dopo l'invio di un blocco dati)&lt;br /&gt;
* il numero di blocchi inviati varia da 1 a 2 blocchi con una media di blocchi inviati ogni 10 chiamate leggermente inferiore a 2 (nella schermata specifica 1.71). Nell'esempio sono stati inviati circa 14 campioni che equivalgono circa a 109 msec di dati.&lt;br /&gt;
:Non mi è chiaro; il plugin non dovrebbe ricevere e inviare in media 1 blocco di 1/16 di secondo alla volta? ([[User:BernardoDalSeno|BernardoDalSeno]] 20:07, 30 April 2008 (CEST))&lt;br /&gt;
:Il plugin invia blocchi dati di 1/16 di secondo, ma riceve dall'applicativo EBNeuro per ogni invocazione della LoadData(...) (quindi ogni chiamata del plugin) un numero di campioni variabile (1-2 campioni). Probabilmente vi sono temporizzazioni interne che dipendono da diveri parametri, ad esempio con 9 canali a 512Hz vi era un'invocazione del plugin ogni 1/16 di secondo con il passaggio di una media di 32 campioni per canale, mentre con 25 canali a 128Hz vi è un'invocazione del plugin ogni 1/64 di secondo con l'invio di circa 2 campioni per canale. Comunque non è un problema quanti campioni riceve il plugin, l'importante è che questo invia blocchi dati da 1/16 di secondo e che ogni blocco inviato rappresenta il trascorrere di 1/16 di secondo.&lt;br /&gt;
Nell'immagine seguente è mostrato una parte di una sequenza di dati che riceve il plugin (25 canali a 128Hz).&lt;br /&gt;
[[Image:pluginSamp.jpg]]&lt;br /&gt;
* il variare del numero di blocchi inviati dipende dall'accumulo verificatosi nelle chiamate precedenti e dal fatto che al plugin non arriva una quantità di dati costanti.&lt;br /&gt;
&lt;br /&gt;
Possiamo affermare comunque che sfruttando l'invio di una quantità di dati costanti, rappresentanti un certo intervallo di tempo, si riesce ad ottenere una temporizzazione dell'intero sistema BCI2000 che in media si posiziona nell'intorno della temporizzazione dettata dal plugin che è di 1/16 di secondo per ogni blocco dati processato.&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Pensare a un modo per misurare la temporizzazione online.&lt;br /&gt;
&lt;br /&gt;
Test online per verificare la temporizzazione.&lt;br /&gt;
&lt;br /&gt;
==CATENA DI FILTRI DI BCI2000==&lt;br /&gt;
&lt;br /&gt;
Attualmente la catena di filtri del modulo di BCI2000 è suddivisa nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)un filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)un filtro di Trigger che si occupa di rilevare gli inizi delle stimolazioni tramite l'analisi del segnale proveniente dal fototransistor&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa di accumulare più forme d'onda p300 relative alla stessa stimolazione e tra queste farne la media&lt;br /&gt;
&lt;br /&gt;
4)un filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
Si vuole modificare sia la sequenza di filtri che il funzionamento di alcuni di questi nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)filtro di Trigger che determina in maniera automatica, tramite una fase iniziale dettata dal modulo applicativo, il valore di soglia per distinguere gli istanti di tempo in cui il riquadro è nero oppure bianco&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro Trigger: sgarlata/P3SignalProcessingGalileo/FiltroTriggerSogliaAutomatica&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa solamente di accumulare le forme d'onda p300 con un ring buffer che memorizza una porzione di segnale precedente, dato che noi rileviamo l'inizio di una stimolazione con un ritardo che è pari alla dimensione della finestra mobile fatta scorrere lungo il segnale di trigger&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro P300: sgarlata/P3SignalProcessingGalileo/FiltroP300&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4)filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)filtro che effettua la media dei valori in uscita dal filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
6)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
Filtro che rileva i trigger&lt;br /&gt;
&lt;br /&gt;
Adattamento automatico della soglia per i trigger (Analisi switch riquadro: Bianco-&amp;gt;Nero-&amp;gt;Bianco per un tempo definito dall'utente)&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Accumulare forme d'onda con parti che precedono il trigger&lt;br /&gt;
&lt;br /&gt;
==Modulo applicativo speller P300==&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo Applicativo: sgarlata/P3SpellerQuadratino&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il modulo applicativo deve essere adattato al sistema di trigger.&lt;br /&gt;
&lt;br /&gt;
Per quanto riguarda il modulo applicativo bisogna introdurre un riquadro posto nell'angolo superiore destro dello schermo e farlo variare (bianco/nero) ogni qual volta viene effettuata una stimolazione e, prima dell'inizio della sequenza di stimolazioni, introdurre una fase preliminare in cui si fa variare (bianco/nero) il riquadro per un tempo totale preimpostato in modo da poter far determinare in maniera automatica dal filtro di Trigger il valore di soglia che permette di distinguere se siamo in fase di stimolazione (riquadro nero) o in fase di non stimolazione (riquadro bianco).&lt;br /&gt;
Terminata la fase di taratura del valore di soglia, lo speller può effettuare la sua sequenza di stimolazioni.&lt;br /&gt;
&lt;br /&gt;
Per le modifiche da effettuare al modulo applicativo di BCI2000 quando questo deve comunicare tramite protocollo UDP con un altro applicativo che effettua le stimolazioni su una differente macchina Linux si è invitati a visionare la relativa discussione di Roberto Massimini.&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
Aggiungere quadrato di sync nell'applicazione speller&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Misurare lo sfasamento tra sync e stimolo&lt;br /&gt;
&lt;br /&gt;
Sviluppare sistema per associare la stimolazione ai trigger rilevati dall'apposito filtro&lt;br /&gt;
&lt;br /&gt;
Scrivere specifiche per comunicazione tra BCI2000 e un modulo applicativo P300 esterno che gira su una macchina Linux separata&lt;br /&gt;
&lt;br /&gt;
==Integrazione con ErrP==&lt;br /&gt;
&lt;br /&gt;
Il sistema basato su BCI2000 che usa P300 va espanso per poter usar anche i potenziali d'errore&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Tutto, anche il dettaglio delle cose da fare...&lt;br /&gt;
&lt;br /&gt;
==Varie==&lt;br /&gt;
&lt;br /&gt;
Rinominare le directory dei sorgenti in conformità allo stile di BCI2000 e senza usare spazi.&lt;br /&gt;
&lt;br /&gt;
Aggiungere riferimenti alla posizione dei progetti (directory) su Airbat per ognuno dei moduli sviluppati descritti nelle pagina.&lt;/div&gt;</summary>
		<author><name>AndreaSgarlata</name></author>	</entry>

	<entry>
		<id>https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2796</id>
		<title>Talk:Online P300 and ErrP recognition with BCI2000</title>
		<link rel="alternate" type="text/html" href="https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2796"/>
				<updated>2008-05-05T10:09:51Z</updated>
		
		<summary type="html">&lt;p&gt;AndreaSgarlata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==PLUGIN==&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo Plugin: sgarlata/PluginTemporizzato&lt;br /&gt;
&lt;br /&gt;
Il sistema attualmente è composto da un plugin che si occupa di inviare i dati tramite pipe ad un altro modulo che fa parte dell'intero sistema di BCI2000.&lt;br /&gt;
&lt;br /&gt;
Per ottenere una corretta temporizzazione del sistema di BCI2000 abbiamo sfruttato il fatto che il plugin è più lento nell'invio dei dati rispetto all'intero sistema BCI2000.&lt;br /&gt;
Infatti si è deciso di inviare tramite plugin una quantità di dati costante pari a 1/16 di secondo, nonostante che, i dati ricevuti dal plugin non sono un valore costante ma variabile intorno ad un certo valore medio, monitorando nel frattempo l'accumulo medio di campioni. &lt;br /&gt;
In questo modo ogni invio di dati rappresenta il trascorrere di un tempo prefissato che è in media è 1/16 di secondo.&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
Test effettuato:&lt;br /&gt;
&lt;br /&gt;
* freq. campionamento: 128Hz&lt;br /&gt;
* numero campioni per blocco dati da 1/16 di secondo: 8&lt;br /&gt;
* visualizzazione accumulo medio ogni 10 chiamate al plugin&lt;br /&gt;
* visualizzazione numero blocchi di dati inviati ogni 10 chiamate&lt;br /&gt;
&lt;br /&gt;
Risultati:&lt;br /&gt;
&lt;br /&gt;
[[Image:plugin.jpg]]&lt;br /&gt;
&lt;br /&gt;
* come mostrato in figura si può vedere che l'accumulo medio varia da 1 a 0 campioni (accumulo calcolato come il numero di campioni rimanenti in memoria dopo l'invio di un blocco dati)&lt;br /&gt;
* il numero di blocchi inviati varia da 1 a 2 blocchi con una media di blocchi inviati ogni 10 chiamate leggermente inferiore a 2 (nella schermata specifica 1.71). Nell'esempio sono stati inviati circa 14 campioni che equivalgono circa a 109 msec di dati.&lt;br /&gt;
:Non mi è chiaro; il plugin non dovrebbe ricevere e inviare in media 1 blocco di 1/16 di secondo alla volta? ([[User:BernardoDalSeno|BernardoDalSeno]] 20:07, 30 April 2008 (CEST))&lt;br /&gt;
:Il plugin invia blocchi dati di 1/16 di secondo, ma riceve dall'applicativo EBNeuro per ogni invocazione della LoadData(...) (quindi ogni chiamata del plugin) un numero di campioni variabile (1-2 campioni). Probabilmente vi sono temporizzazioni interne che dipendono da diveri parametri, ad esempio con 9 canali a 512Hz vi era un'invocazione del plugin ogni 1/16 di secondo con il passaggio di una media di 32 campioni per canale, mentre con 25 canali a 128Hz vi è un'invocazione del plugin ogni 1/64 di secondo con l'invio di circa 2 campioni per canale. Comunque non è un problema quanti campioni riceve il plugin, l'importante è che questo invia blocchi dati da 1/16 di secondo e che ogni blocco inviato rappresenta il trascorrere di 1/16 di secondo.&lt;br /&gt;
Nell'immagine seguente è mostrato una parte di una sequenza di dati che riceve il plugin (25 canali a 128Hz).&lt;br /&gt;
[[Image:pluginSamp.jpg]]&lt;br /&gt;
* il variare del numero di blocchi inviati dipende dall'accumulo verificatosi nelle chiamate precedenti e dal fatto che al plugin non arriva una quantità di dati costanti.&lt;br /&gt;
&lt;br /&gt;
Possiamo affermare comunque che sfruttando l'invio di una quantità di dati costanti, rappresentanti un certo intervallo di tempo, si riesce ad ottenere una temporizzazione dell'intero sistema BCI2000 che in media si posiziona nell'intorno della temporizzazione dettata dal plugin che è di 1/16 di secondo per ogni blocco dati processato.&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Pensare a un modo per misurare la temporizzazione online.&lt;br /&gt;
&lt;br /&gt;
Test online per verificare la temporizzazione.&lt;br /&gt;
&lt;br /&gt;
==CATENA DI FILTRI DI BCI2000==&lt;br /&gt;
&lt;br /&gt;
Attualmente la catena di filtri del modulo di BCI2000 è suddivisa nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)un filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)un filtro di Trigger che si occupa di rilevare gli inizi delle stimolazioni tramite l'analisi del segnale proveniente dal fototransistor&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa di accumulare più forme d'onda p300 relative alla stessa stimolazione e tra queste farne la media&lt;br /&gt;
&lt;br /&gt;
4)un filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
Si vuole modificare sia la sequenza di filtri che il funzionamento di alcuni di questi nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)filtro di Trigger che determina in maniera automatica, tramite una fase iniziale dettata dal modulo applicativo, il valore di soglia per distinguere gli istanti di tempo in cui il riquadro è nero oppure bianco&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro Trigger: sgarlata/P3SignalProcessingGalileo/FiltroTriggerSogliaAutomatica&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa solamente di accumulare le forme d'onda p300 con un ring buffer che memorizza una porzione di segnale precedente, dato che noi rileviamo l'inizio di una stimolazione con un ritardo che è pari alla dimensione della finestra mobile fatta scorrere lungo il segnale di trigger&lt;br /&gt;
*Riferimento su Airbat del sorgente filtro P300: sgarlata/P3SignalProcessingGalileo/FiltroP300&lt;br /&gt;
&lt;br /&gt;
4)filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)filtro che effettua la media dei valori in uscita dal filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
6)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
Filtro che rileva i trigger&lt;br /&gt;
&lt;br /&gt;
Adattamento automatico della soglia per i trigger (Analisi switch riquadro: Bianco-&amp;gt;Nero-&amp;gt;Bianco per un tempo definito dall'utente)&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Accumulare forme d'onda con parti che precedono il trigger&lt;br /&gt;
&lt;br /&gt;
==Modulo applicativo speller P300==&lt;br /&gt;
*Riferimento su Airbat del sorgente modulo Applicativo: sgarlata/P3SpellerQuadratino&lt;br /&gt;
&lt;br /&gt;
Il modulo applicativo deve essere adattato al sistema di trigger.&lt;br /&gt;
&lt;br /&gt;
Per quanto riguarda il modulo applicativo bisogna introdurre un riquadro posto nell'angolo superiore destro dello schermo e farlo variare (bianco/nero) ogni qual volta viene effettuata una stimolazione e, prima dell'inizio della sequenza di stimolazioni, introdurre una fase preliminare in cui si fa variare (bianco/nero) il riquadro per un tempo totale preimpostato in modo da poter far determinare in maniera automatica dal filtro di Trigger il valore di soglia che permette di distinguere se siamo in fase di stimolazione (riquadro nero) o in fase di non stimolazione (riquadro bianco).&lt;br /&gt;
Terminata la fase di taratura del valore di soglia, lo speller può effettuare la sua sequenza di stimolazioni.&lt;br /&gt;
&lt;br /&gt;
Per le modifiche da effettuare al modulo applicativo di BCI2000 quando questo deve comunicare tramite protocollo UDP con un altro applicativo che effettua le stimolazioni su una differente macchina Linux si è invitati a visionare la relativa discussione di Roberto Massimini.&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
Aggiungere quadrato di sync nell'applicazione speller&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Misurare lo sfasamento tra sync e stimolo&lt;br /&gt;
&lt;br /&gt;
Sviluppare sistema per associare la stimolazione ai trigger rilevati dall'apposito filtro&lt;br /&gt;
&lt;br /&gt;
Scrivere specifiche per comunicazione tra BCI2000 e un modulo applicativo P300 esterno che gira su una macchina Linux separata&lt;br /&gt;
&lt;br /&gt;
==Integrazione con ErrP==&lt;br /&gt;
&lt;br /&gt;
Il sistema basato su BCI2000 che usa P300 va espanso per poter usar anche i potenziali d'errore&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Tutto, anche il dettaglio delle cose da fare...&lt;br /&gt;
&lt;br /&gt;
==Varie==&lt;br /&gt;
&lt;br /&gt;
Rinominare le directory dei sorgenti in conformità allo stile di BCI2000 e senza usare spazi.&lt;br /&gt;
&lt;br /&gt;
Aggiungere riferimenti alla posizione dei progetti (directory) su Airbat per ognuno dei moduli sviluppati descritti nelle pagina.&lt;/div&gt;</summary>
		<author><name>AndreaSgarlata</name></author>	</entry>

	<entry>
		<id>https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2795</id>
		<title>Talk:Online P300 and ErrP recognition with BCI2000</title>
		<link rel="alternate" type="text/html" href="https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2795"/>
				<updated>2008-05-05T09:59:07Z</updated>
		
		<summary type="html">&lt;p&gt;AndreaSgarlata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==PLUGIN==&lt;br /&gt;
&lt;br /&gt;
Il sistema attualmente è composto da un plugin che si occupa di inviare i dati tramite pipe ad un altro modulo che fa parte dell'intero sistema di BCI2000.&lt;br /&gt;
&lt;br /&gt;
Per ottenere una corretta temporizzazione del sistema di BCI2000 abbiamo sfruttato il fatto che il plugin è più lento nell'invio dei dati rispetto all'intero sistema BCI2000.&lt;br /&gt;
Infatti si è deciso di inviare tramite plugin una quantità di dati costante pari a 1/16 di secondo, nonostante che, i dati ricevuti dal plugin non sono un valore costante ma variabile intorno ad un certo valore medio, monitorando nel frattempo l'accumulo medio di campioni. &lt;br /&gt;
In questo modo ogni invio di dati rappresenta il trascorrere di un tempo prefissato che è in media è 1/16 di secondo.&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
Test effettuato:&lt;br /&gt;
&lt;br /&gt;
* freq. campionamento: 128Hz&lt;br /&gt;
* numero campioni per blocco dati da 1/16 di secondo: 8&lt;br /&gt;
* visualizzazione accumulo medio ogni 10 chiamate al plugin&lt;br /&gt;
* visualizzazione numero blocchi di dati inviati ogni 10 chiamate&lt;br /&gt;
&lt;br /&gt;
Risultati:&lt;br /&gt;
&lt;br /&gt;
[[Image:plugin.jpg]]&lt;br /&gt;
&lt;br /&gt;
* come mostrato in figura si può vedere che l'accumulo medio varia da 1 a 0 campioni (accumulo calcolato come il numero di campioni rimanenti in memoria dopo l'invio di un blocco dati)&lt;br /&gt;
* il numero di blocchi inviati varia da 1 a 2 blocchi con una media di blocchi inviati ogni 10 chiamate leggermente inferiore a 2 (nella schermata specifica 1.71). Nell'esempio sono stati inviati circa 14 campioni che equivalgono circa a 109 msec di dati.&lt;br /&gt;
:Non mi è chiaro; il plugin non dovrebbe ricevere e inviare in media 1 blocco di 1/16 di secondo alla volta? ([[User:BernardoDalSeno|BernardoDalSeno]] 20:07, 30 April 2008 (CEST))&lt;br /&gt;
:Il plugin invia blocchi dati di 1/16 di secondo, ma riceve dall'applicativo EBNeuro per ogni invocazione della LoadData(...) (quindi ogni chiamata del plugin) un numero di campioni variabile (1-2 campioni). Probabilmente vi sono temporizzazioni interne che dipendono da diveri parametri, ad esempio con 9 canali a 512Hz vi era un'invocazione del plugin ogni 1/16 di secondo con il passaggio di una media di 32 campioni per canale, mentre con 25 canali a 128Hz vi è un'invocazione del plugin ogni 1/64 di secondo con l'invio di circa 2 campioni per canale. Comunque non è un problema quanti campioni riceve il plugin, l'importante è che questo invia blocchi dati da 1/16 di secondo e che ogni blocco inviato rappresenta il trascorrere di 1/16 di secondo.&lt;br /&gt;
Nell'immagine seguente è mostrato una parte di una sequenza di dati che riceve il plugin (25 canali a 128Hz).&lt;br /&gt;
[[Image:pluginSamp.jpg]]&lt;br /&gt;
* il variare del numero di blocchi inviati dipende dall'accumulo verificatosi nelle chiamate precedenti e dal fatto che al plugin non arriva una quantità di dati costanti.&lt;br /&gt;
&lt;br /&gt;
Possiamo affermare comunque che sfruttando l'invio di una quantità di dati costanti, rappresentanti un certo intervallo di tempo, si riesce ad ottenere una temporizzazione dell'intero sistema BCI2000 che in media si posiziona nell'intorno della temporizzazione dettata dal plugin che è di 1/16 di secondo per ogni blocco dati processato.&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Pensare a un modo per misurare la temporizzazione online.&lt;br /&gt;
&lt;br /&gt;
Test online per verificare la temporizzazione.&lt;br /&gt;
&lt;br /&gt;
==CATENA DI FILTRI DI BCI2000==&lt;br /&gt;
&lt;br /&gt;
Attualmente la catena di filtri del modulo di BCI2000 è suddivisa nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)un filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)un filtro di Trigger che si occupa di rilevare gli inizi delle stimolazioni tramite l'analisi del segnale proveniente dal fototransistor&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa di accumulare più forme d'onda p300 relative alla stessa stimolazione e tra queste farne la media&lt;br /&gt;
&lt;br /&gt;
4)un filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
Si vuole modificare sia la sequenza di filtri che il funzionamento di alcuni di questi nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)filtro di Trigger che determina in maniera automatica, tramite una fase iniziale dettata dal modulo applicativo, il valore di soglia per distinguere gli istanti di tempo in cui il riquadro è nero oppure bianco&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa solamente di accumulare le forme d'onda p300 con un ring buffer che memorizza una porzione di segnale precedente, dato che noi rileviamo l'inizio di una stimolazione con un ritardo che è pari alla dimensione della finestra mobile fatta scorrere lungo il segnale di trigger&lt;br /&gt;
&lt;br /&gt;
4)filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)filtro che effettua la media dei valori in uscita dal filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
6)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
Filtro che rileva i trigger&lt;br /&gt;
&lt;br /&gt;
Adattamento automatico della soglia per i trigger (Analisi switch riquadro: Bianco-&amp;gt;Nero-&amp;gt;Bianco per un tempo definito dall'utente)&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Accumulare forme d'onda con parti che precedono il trigger&lt;br /&gt;
&lt;br /&gt;
==Modulo applicativo speller P300==&lt;br /&gt;
&lt;br /&gt;
Il modulo applicativo deve adattato al sistema di trigger.&lt;br /&gt;
&lt;br /&gt;
Per quanto riguarda il modulo applicativo bisogna introdurre un riquadro posto nell'angolo superiore destro dello schermo e farlo variare (bianco/nero) ogni qual volta viene effettuata una stimolazione e, prima dell'inizio della sequenza di stimolazioni, introdurre una fase preliminare in cui si fa variare (bianco/nero) il riquadro per un tempo totale preimpostato in modo da poter far determinare in maniera automatica dal filtro di Trigger il valore di soglia che permette di distinguere se siamo in fase di stimolazione (riquadro nero) o in fase di non stimolazione (riquadro bianco).&lt;br /&gt;
Terminata la fase di taratura del valore di soglia, lo speller può effettuare la sua sequenza di stimolazioni.&lt;br /&gt;
&lt;br /&gt;
Per le modifiche da effettuare al modulo applicativo di BCI2000 quando questo deve comunicare tramite protocollo UDP con un altro applicativo che effettua le stimolazioni su una differente macchina Linux si è invitati a visionare la relativa discussione di Roberto Massimini.&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
Aggiungere quadrato di sync nell'applicazione speller&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Misurare lo sfasamento tra sync e stimolo&lt;br /&gt;
&lt;br /&gt;
Sviluppare sistema per associare la stimolazione ai trigger rilevati dall'apposito filtro&lt;br /&gt;
&lt;br /&gt;
Scrivere specifiche per comunicazione tra BCI2000 e un modulo applicativo P300 esterno che gira su una macchina Linux separata&lt;br /&gt;
&lt;br /&gt;
==Integrazione con ErrP==&lt;br /&gt;
&lt;br /&gt;
Il sistema basato su BCI2000 che usa P300 va espanso per poter usar anche i potenziali d'errore&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Tutto, anche il dettaglio delle cose da fare...&lt;br /&gt;
&lt;br /&gt;
==Varie==&lt;br /&gt;
&lt;br /&gt;
Rinominare le directory dei sorgenti in conformità allo stile di BCI2000 e senza usare spazi.&lt;br /&gt;
&lt;br /&gt;
Aggiungere riferimenti alla posizione dei progetti (directory) su Airbat per ognuno dei moduli sviluppati descritti nelle pagina.&lt;/div&gt;</summary>
		<author><name>AndreaSgarlata</name></author>	</entry>

	<entry>
		<id>https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2794</id>
		<title>Talk:Online P300 and ErrP recognition with BCI2000</title>
		<link rel="alternate" type="text/html" href="https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2794"/>
				<updated>2008-05-05T09:54:38Z</updated>
		
		<summary type="html">&lt;p&gt;AndreaSgarlata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==PLUGIN==&lt;br /&gt;
&lt;br /&gt;
Il sistema attualmente è composto da un plugin che si occupa di inviare i dati tramite pipe ad un altro modulo che fa parte dell'intero sistema di BCI2000.&lt;br /&gt;
&lt;br /&gt;
Per ottenere una corretta temporizzazione del sistema di BCI2000 abbiamo sfruttato il fatto che il plugin è più lento nell'invio dei dati rispetto all'intero sistema BCI2000.&lt;br /&gt;
Infatti si è deciso di inviare tramite plugin una quantità di dati costante pari a 1/16 di secondo, nonostante che, i dati ricevuti dal plugin non sono un valore costante ma variabile intorno ad un certo valore medio, monitorando nel frattempo l'accumulo medio di campioni. &lt;br /&gt;
In questo modo ogni invio di dati rappresenta il trascorrere di un tempo prefissato che è in media è 1/16 di secondo.&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
Test effettuato:&lt;br /&gt;
&lt;br /&gt;
* freq. campionamento: 128Hz&lt;br /&gt;
* numero campioni per blocco dati da 1/16 di secondo: 8&lt;br /&gt;
* visualizzazione accumulo medio ogni 10 chiamate al plugin&lt;br /&gt;
* visualizzazione numero blocchi di dati inviati ogni 10 chiamate&lt;br /&gt;
&lt;br /&gt;
Risultati:&lt;br /&gt;
&lt;br /&gt;
[[Image:plugin.jpg]]&lt;br /&gt;
&lt;br /&gt;
* come mostrato in figura si può vedere che l'accumulo medio varia da 1 a 0 campioni (accumulo calcolato come il numero di campioni rimanenti in memoria dopo l'invio di un blocco dati)&lt;br /&gt;
* il numero di blocchi inviati varia da 1 a 2 blocchi con una media di blocchi inviati ogni 10 chiamate leggermente inferiore a 2 (nella schermata specifica 1.71). Nell'esempio sono stati inviati circa 14 campioni che equivalgono circa a 109 msec di dati.&lt;br /&gt;
:Non mi è chiaro; il plugin non dovrebbe ricevere e inviare in media 1 blocco di 1/16 di secondo alla volta? ([[User:BernardoDalSeno|BernardoDalSeno]] 20:07, 30 April 2008 (CEST))&lt;br /&gt;
:Il plugin invia blocchi dati di 1/16 di secondo, ma riceve dall'applicativo EBNeuro per ogni invocazione della LoadData(...) (quindi ogni chiamata del plugin) un numero di campioni variabile (1-2 campioni). Probabilmente vi sono temporizzazioni interne che dipendono da diveri parametri, ad esempio con 9 canali a 512Hz vi era un'invocazione del plugin ogni 1/16 di secondo con il passaggio di una media di 32 campioni per canale, mentre con 25 canali a 128Hz vi è un'invocazione del plugin ogni 1/64 di secondo con l'invio di circa 2 campioni per canale. Comunque non è un problema quanti campioni riceve il plugin, l'importante è che questo invia blocchi dati da 1/16 di secondo e che ogni blocco inviato rappresenta il trascorrere di 1/16 di secondo.&lt;br /&gt;
Nell'immagine seguente è mostrato una parte di una sequenza di dati che riceve il plugin (25 canali a 128Hz).&lt;br /&gt;
[[Image:pluginSamp.jpg]]&lt;br /&gt;
* il variare del numero di blocchi inviati dipende dall'accumulo verificatosi nelle chiamate precedenti e dal fatto che al plugin non arriva una quantità di dati costanti.&lt;br /&gt;
&lt;br /&gt;
Possiamo affermare comunque che sfruttando l'invio di una quantità di dati costanti, rappresentanti un certo intervallo di tempo, si riesce ad ottenere una temporizzazione dell'intero sistema BCI2000 che in media si posiziona nell'intorno della temporizzazione dettata dal plugin che è di 1/16 di secondo per ogni blocco dati processato.&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Pensare a un modo per misurare la temporizzazione online.&lt;br /&gt;
&lt;br /&gt;
Test online per verificare la temporizzazione.&lt;br /&gt;
&lt;br /&gt;
==CATENA DI FILTRI DI BCI2000==&lt;br /&gt;
&lt;br /&gt;
Attualmente la catena di filtri del modulo di BCI2000 è suddivisa nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)un filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)un filtro di Trigger che si occupa di rilevare gli inizi delle stimolazioni tramite l'analisi del segnale proveniente dal fototransistor&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa di accumulare più forme d'onda p300 relative alla stessa stimolazione e tra queste farne la media&lt;br /&gt;
&lt;br /&gt;
4)un filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
Si vuole modificare sia la sequenza di filtri che il funzionamento di alcuni di questi nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)filtro di Trigger che determina in maniera automatica, tramite una fase iniziale dettata dal modulo applicativo, il valore di soglia per distinguere gli istanti di tempo in cui il riquadro è nero oppure bianco&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa solamente di accumulare le forme d'onda p300 con un ring buffer che memorizza una porzione di segnale precedente, dato che noi rileviamo l'inizio di una stimolazione con un ritardo che è pari alla dimensione della finestra mobile fatta scorrere lungo il segnale di trigger&lt;br /&gt;
&lt;br /&gt;
4)filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)filtro che effettua la media dei valori in uscita dal filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
6)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
Filtro che rileva i trigger&lt;br /&gt;
&lt;br /&gt;
Adattamento automatico della soglia per i trigger&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Accumulare forme d'onda con parti che precedono il trigger&lt;br /&gt;
&lt;br /&gt;
==Modulo applicativo speller P300==&lt;br /&gt;
&lt;br /&gt;
Il modulo applicativo deve adattato al sistema di trigger.&lt;br /&gt;
&lt;br /&gt;
Per quanto riguarda il modulo applicativo bisogna introdurre un riquadro posto nell'angolo superiore destro dello schermo e farlo variare (bianco/nero) ogni qual volta viene effettuata una stimolazione e, prima dell'inizio della sequenza di stimolazioni, introdurre una fase preliminare in cui si fa variare (bianco/nero) il riquadro per un tempo totale preimpostato in modo da poter far determinare in maniera automatica dal filtro di Trigger il valore di soglia che permette di distinguere se siamo in fase di stimolazione (riquadro nero) o in fase di non stimolazione (riquadro bianco).&lt;br /&gt;
Terminata la fase di taratura del valore di soglia, lo speller può effettuare la sua sequenza di stimolazioni.&lt;br /&gt;
&lt;br /&gt;
Per le modifiche da effettuare al modulo applicativo di BCI2000 quando questo deve comunicare tramite protocollo UDP con un altro applicativo che effettua le stimolazioni su una differente macchina Linux si è invitati a visionare la relativa discussione di Roberto Massimini.&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
Aggiungere quadrato di sync nell'applicazione speller&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Misurare lo sfasamento tra sync e stimolo&lt;br /&gt;
&lt;br /&gt;
Sviluppare sistema per associare la stimolazione ai trigger rilevati dall'apposito filtro&lt;br /&gt;
&lt;br /&gt;
Scrivere specifiche per comunicazione tra BCI2000 e un modulo applicativo P300 esterno che gira su una macchina Linux separata&lt;br /&gt;
&lt;br /&gt;
==Integrazione con ErrP==&lt;br /&gt;
&lt;br /&gt;
Il sistema basato su BCI2000 che usa P300 va espanso per poter usar anche i potenziali d'errore&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Tutto, anche il dettaglio delle cose da fare...&lt;br /&gt;
&lt;br /&gt;
==Varie==&lt;br /&gt;
&lt;br /&gt;
Rinominare le directory dei sorgenti in conformità allo stile di BCI2000 e senza usare spazi.&lt;br /&gt;
&lt;br /&gt;
Aggiungere riferimenti alla posizione dei progetti (directory) su Airbat per ognuno dei moduli sviluppati descritti nelle pagina.&lt;/div&gt;</summary>
		<author><name>AndreaSgarlata</name></author>	</entry>

	<entry>
		<id>https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2789</id>
		<title>Talk:Online P300 and ErrP recognition with BCI2000</title>
		<link rel="alternate" type="text/html" href="https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2789"/>
				<updated>2008-05-02T09:12:24Z</updated>
		
		<summary type="html">&lt;p&gt;AndreaSgarlata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==PLUGIN==&lt;br /&gt;
&lt;br /&gt;
Il sistema attualmente è composto da un plugin che si occupa di inviare i dati tramite pipe ad un altro modulo che fa parte dell'intero sistema di BCI2000.&lt;br /&gt;
&lt;br /&gt;
Per ottenere una corretta temporizzazione del sistema di BCI2000 abbiamo sfruttato il fatto che il plugin è più lento nell'invio dei dati rispetto all'intero sistema BCI2000.&lt;br /&gt;
Infatti si è deciso di inviare tramite plugin una quantità di dati costante pari a 1/16 di secondo, nonostante che, i dati ricevuti dal plugin non sono un valore costante ma variabile intorno ad un certo valore medio, monitorando nel frattempo l'accumulo medio di campioni. &lt;br /&gt;
In questo modo ogni invio di dati rappresenta il trascorrere di un tempo prefissato che è in media è 1/16 di secondo.&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
Test effettuato:&lt;br /&gt;
&lt;br /&gt;
* freq. campionamento: 128Hz&lt;br /&gt;
* numero campioni per blocco dati da 1/16 di secondo: 8&lt;br /&gt;
* visualizzazione accumulo medio ogni 10 chiamate al plugin&lt;br /&gt;
* visualizzazione numero blocchi di dati inviati ogni 10 chiamate&lt;br /&gt;
&lt;br /&gt;
Risultati:&lt;br /&gt;
&lt;br /&gt;
[[Image:plugin.jpg]]&lt;br /&gt;
&lt;br /&gt;
* come mostrato in figura si può vedere che l'accumulo medio varia da 1 a 0 campioni (accumulo calcolato come il numero di campioni rimanenti in memoria dopo l'invio di un blocco dati)&lt;br /&gt;
* il numero di blocchi inviati varia da 1 a 2 blocchi con una media di blocchi inviati ogni 10 chiamate leggermente inferiore a 2 (nella schermata specifica 1.71). Nell'esempio sono stati inviati circa 14 campioni che equivalgono circa a 109 msec di dati.&lt;br /&gt;
:Non mi è chiaro; il plugin non dovrebbe ricevere e inviare in media 1 blocco di 1/16 di secondo alla volta? ([[User:BernardoDalSeno|BernardoDalSeno]] 20:07, 30 April 2008 (CEST))&lt;br /&gt;
:Il plugin invia blocchi dati di 1/16 di secondo, ma riceve dall'applicativo EBNeuro per ogni invocazione della LoadData(...) (quindi ogni chiamata del plugin) un numero di campioni variabile (1-2 campioni). Probabilmente vi sono temporizzazioni interne che dipendono da diveri parametri, ad esempio con 9 canali a 512Hz vi era un'invocazione del plugin ogni 1/16 di secondo con il passaggio di una media di 32 campioni per canale, mentre con 25 canali a 128Hz vi è un'invocazione del plugin ogni 1/64 di secondo con l'invio di circa 2 campioni per canale. Comunque non è un problema quanti campioni riceve il plugin, l'importante è che questo invia blocchi dati da 1/16 di secondo e che ogni blocco inviato rappresenta il trascorrere di 1/16 di secondo.&lt;br /&gt;
Nell'immagine seguente è mostrato una parte di una sequenza di dati che riceve il plugin (25 canali a 128Hz).&lt;br /&gt;
[[Image:pluginSamp.jpg]]&lt;br /&gt;
* il variare del numero di blocchi inviati dipende dall'accumulo verificatosi nelle chiamate precedenti e dal fatto che al plugin non arriva una quantità di dati costanti.&lt;br /&gt;
&lt;br /&gt;
Possiamo affermare comunque che sfruttando l'invio di una quantità di dati costanti, rappresentanti un certo intervallo di tempo, si riesce ad ottenere una temporizzazione dell'intero sistema BCI2000 che in media si posiziona nell'intorno della temporizzazione dettata dal plugin che è di 1/16 di secondo per ogni blocco dati processato.&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Pensare a un modo per misurare la temporizzazione online.&lt;br /&gt;
&lt;br /&gt;
Test online per verificare la temporizzazione.&lt;br /&gt;
&lt;br /&gt;
==CATENA DI FILTRI DI BCI2000==&lt;br /&gt;
&lt;br /&gt;
Attualmente la catena di filtri del modulo di BCI2000 è suddivisa nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)un filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)un filtro di Trigger che si occupa di rilevare gli inizi delle stimolazioni tramite l'analisi del segnale proveniente dal fototransistor&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa di accumulare più forme d'onda p300 relative alla stessa stimolazione e tra queste farne la media&lt;br /&gt;
&lt;br /&gt;
4)un filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
Si vuole modificare sia la sequenza di filtri che il funzionamento di alcuni di questi nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)filtro di Trigger che determina in maniera automatica, tramite una fase iniziale dettata dal modulo applicativo, il valore di soglia per distinguere gli istanti di tempo in cui il riquadro è nero oppure bianco&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa solamente di accumulare le forme d'onda p300 con un ring buffer che memorizza una porzione di segnale precedente, dato che noi rileviamo l'inizio di una stimolazione con un ritardo che è pari alla dimensione della finestra mobile fatta scorrere lungo il segnale di trigger&lt;br /&gt;
&lt;br /&gt;
4)filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)filtro che effettua la media dei valori in uscita dal filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
6)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
Filtro che rileva i trigger&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Adattamento automatico della soglia per i trigger&lt;br /&gt;
&lt;br /&gt;
Accumulare forme d'onda con parti che precedono il trigger&lt;br /&gt;
&lt;br /&gt;
==Modulo applicativo speller P300==&lt;br /&gt;
&lt;br /&gt;
Il modulo applicativo deve adattato al sistema di trigger.&lt;br /&gt;
&lt;br /&gt;
Per quanto riguarda il modulo applicativo bisogna introdurre un riquadro posto nell'angolo superiore destro dello schermo e farlo variare (bianco/nero) ogni qual volta viene effettuata una stimolazione e, prima dell'inizio della sequenza di stimolazioni, introdurre una fase preliminare in cui si fa variare (bianco/nero) il riquadro per un tempo totale preimpostato in modo da poter far determinare in maniera automatica dal filtro di Trigger il valore di soglia che permette di distinguere se siamo in fase di stimolazione (riquadro nero) o in fase di non stimolazione (riquadro bianco).&lt;br /&gt;
Terminata la fase di taratura del valore di soglia, lo speller può effettuare la sua sequenza di stimolazioni.&lt;br /&gt;
&lt;br /&gt;
Per le modifiche da effettuare al modulo applicativo di BCI2000 quando questo deve comunicare tramite protocollo UDP con un altro applicativo che effettua le stimolazioni su una differente macchina Linux si è invitati a visionare la relativa discussione di Roberto Massimini.&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Aggiungere quadrato di sync nell'applicazione speller&lt;br /&gt;
&lt;br /&gt;
Misurare lo sfasamento tra sync e stimolo&lt;br /&gt;
&lt;br /&gt;
Sviluppare sistema per associare la stimolazione ai trigger rilevati dall'apposito filtro&lt;br /&gt;
&lt;br /&gt;
Scrivere specifiche per comunicazione tra BCI2000 e un modulo applicativo P300 esterno che gira su una macchina Linux separata&lt;br /&gt;
&lt;br /&gt;
==Integrazione con ErrP==&lt;br /&gt;
&lt;br /&gt;
Il sistema basato su BCI2000 che usa P300 va espanso per poter usar anche i potenziali d'errore&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Tutto, anche il dettaglio delle cose da fare...&lt;br /&gt;
&lt;br /&gt;
==Varie==&lt;br /&gt;
&lt;br /&gt;
Rinominare le directory dei sorgenti in conformità allo stile di BCI2000 e senza usare spazi&lt;/div&gt;</summary>
		<author><name>AndreaSgarlata</name></author>	</entry>

	<entry>
		<id>https://airwiki.deib.polimi.it/index.php?title=File:PluginSamp.jpg&amp;diff=2788</id>
		<title>File:PluginSamp.jpg</title>
		<link rel="alternate" type="text/html" href="https://airwiki.deib.polimi.it/index.php?title=File:PluginSamp.jpg&amp;diff=2788"/>
				<updated>2008-05-02T09:08:11Z</updated>
		
		<summary type="html">&lt;p&gt;AndreaSgarlata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>AndreaSgarlata</name></author>	</entry>

	<entry>
		<id>https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2787</id>
		<title>Talk:Online P300 and ErrP recognition with BCI2000</title>
		<link rel="alternate" type="text/html" href="https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2787"/>
				<updated>2008-05-02T09:07:55Z</updated>
		
		<summary type="html">&lt;p&gt;AndreaSgarlata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==PLUGIN==&lt;br /&gt;
&lt;br /&gt;
Il sistema attualmente è composto da un plugin che si occupa di inviare i dati tramite pipe ad un altro modulo che fa parte dell'intero sistema di BCI2000.&lt;br /&gt;
&lt;br /&gt;
Per ottenere una corretta temporizzazione del sistema di BCI2000 abbiamo sfruttato il fatto che il plugin è più lento nell'invio dei dati rispetto all'intero sistema BCI2000.&lt;br /&gt;
Infatti si è deciso di inviare tramite plugin una quantità di dati costante pari a 1/16 di secondo, nonostante che, i dati ricevuti dal plugin non sono un valore costante ma variabile intorno ad un certo valore medio, monitorando nel frattempo l'accumulo medio di campioni. &lt;br /&gt;
In questo modo ogni invio di dati rappresenta il trascorrere di un tempo prefissato che è in media è 1/16 di secondo.&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
Test effettuato:&lt;br /&gt;
&lt;br /&gt;
* freq. campionamento: 128Hz&lt;br /&gt;
* numero campioni per blocco dati da 1/16 di secondo: 8&lt;br /&gt;
* visualizzazione accumulo medio ogni 10 chiamate al plugin&lt;br /&gt;
* visualizzazione numero blocchi di dati inviati ogni 10 chiamate&lt;br /&gt;
&lt;br /&gt;
Risultati:&lt;br /&gt;
&lt;br /&gt;
[[Image:plugin.jpg]]&lt;br /&gt;
&lt;br /&gt;
* come mostrato in figura si può vedere che l'accumulo medio varia da 1 a 0 campioni (accumulo calcolato come il numero di campioni rimanenti in memoria dopo l'invio di un blocco dati)&lt;br /&gt;
* il numero di blocchi inviati varia da 1 a 2 blocchi con una media di blocchi inviati ogni 10 chiamate leggermente inferiore a 2 (nella schermata specifica 1.71). Nell'esempio sono stati inviati circa 14 campioni che equivalgono circa a 109 msec di dati.&lt;br /&gt;
:Non mi è chiaro; il plugin non dovrebbe ricevere e inviare in media 1 blocco di 1/16 di secondo alla volta? ([[User:BernardoDalSeno|BernardoDalSeno]] 20:07, 30 April 2008 (CEST))&lt;br /&gt;
:Il plugin invia blocchi dati di 1/16 di secondo, ma riceve dall'applicativo EBNeuro per ogni invocazione della LoadData(...) (quindi ogni chiamata del plugin) un numero di campioni variabile (1-2 campioni). Probabilmente vi sono temporizzazioni interne che dipendono da diveri parametri, ad esempio con 9 canali a 512Hz vi era un'invocazione del plugin ogni 1/16 di secondo con il passaggio di una media di 32 campioni per canale, mentre con 25 canali a 128Hz vi è un'invocazione del plugin ogni 1/64 di secondo con l'invio di circa 2 campioni per canale. Nell'immagine seguente è mostrato una parte di una sequenza di dati che riceve il plugin.&lt;br /&gt;
[[Image:pluginSamp.jpg]]&lt;br /&gt;
* il variare del numero di blocchi inviati dipende dall'accumulo verificatosi nelle chiamate precedenti e dal fatto che al plugin non arriva una quantità di dati costanti.&lt;br /&gt;
&lt;br /&gt;
Possiamo affermare comunque che sfruttando l'invio di una quantità di dati costanti, rappresentanti un certo intervallo di tempo, si riesce ad ottenere una temporizzazione dell'intero sistema BCI2000 che in media si posiziona nell'intorno della temporizzazione dettata dal plugin che è di 1/16 di secondo per ogni blocco dati processato.&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Pensare a un modo per misurare la temporizzazione online.&lt;br /&gt;
&lt;br /&gt;
Test online per verificare la temporizzazione.&lt;br /&gt;
&lt;br /&gt;
==CATENA DI FILTRI DI BCI2000==&lt;br /&gt;
&lt;br /&gt;
Attualmente la catena di filtri del modulo di BCI2000 è suddivisa nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)un filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)un filtro di Trigger che si occupa di rilevare gli inizi delle stimolazioni tramite l'analisi del segnale proveniente dal fototransistor&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa di accumulare più forme d'onda p300 relative alla stessa stimolazione e tra queste farne la media&lt;br /&gt;
&lt;br /&gt;
4)un filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
Si vuole modificare sia la sequenza di filtri che il funzionamento di alcuni di questi nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)filtro di Trigger che determina in maniera automatica, tramite una fase iniziale dettata dal modulo applicativo, il valore di soglia per distinguere gli istanti di tempo in cui il riquadro è nero oppure bianco&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa solamente di accumulare le forme d'onda p300 con un ring buffer che memorizza una porzione di segnale precedente, dato che noi rileviamo l'inizio di una stimolazione con un ritardo che è pari alla dimensione della finestra mobile fatta scorrere lungo il segnale di trigger&lt;br /&gt;
&lt;br /&gt;
4)filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)filtro che effettua la media dei valori in uscita dal filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
6)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
Filtro che rileva i trigger&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Adattamento automatico della soglia per i trigger&lt;br /&gt;
&lt;br /&gt;
Accumulare forme d'onda con parti che precedono il trigger&lt;br /&gt;
&lt;br /&gt;
==Modulo applicativo speller P300==&lt;br /&gt;
&lt;br /&gt;
Il modulo applicativo deve adattato al sistema di trigger.&lt;br /&gt;
&lt;br /&gt;
Per quanto riguarda il modulo applicativo bisogna introdurre un riquadro posto nell'angolo superiore destro dello schermo e farlo variare (bianco/nero) ogni qual volta viene effettuata una stimolazione e, prima dell'inizio della sequenza di stimolazioni, introdurre una fase preliminare in cui si fa variare (bianco/nero) il riquadro per un tempo totale preimpostato in modo da poter far determinare in maniera automatica dal filtro di Trigger il valore di soglia che permette di distinguere se siamo in fase di stimolazione (riquadro nero) o in fase di non stimolazione (riquadro bianco).&lt;br /&gt;
Terminata la fase di taratura del valore di soglia, lo speller può effettuare la sua sequenza di stimolazioni.&lt;br /&gt;
&lt;br /&gt;
Per le modifiche da effettuare al modulo applicativo di BCI2000 quando questo deve comunicare tramite protocollo UDP con un altro applicativo che effettua le stimolazioni su una differente macchina Linux si è invitati a visionare la relativa discussione di Roberto Massimini.&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Aggiungere quadrato di sync nell'applicazione speller&lt;br /&gt;
&lt;br /&gt;
Misurare lo sfasamento tra sync e stimolo&lt;br /&gt;
&lt;br /&gt;
Sviluppare sistema per associare la stimolazione ai trigger rilevati dall'apposito filtro&lt;br /&gt;
&lt;br /&gt;
Scrivere specifiche per comunicazione tra BCI2000 e un modulo applicativo P300 esterno che gira su una macchina Linux separata&lt;br /&gt;
&lt;br /&gt;
==Integrazione con ErrP==&lt;br /&gt;
&lt;br /&gt;
Il sistema basato su BCI2000 che usa P300 va espanso per poter usar anche i potenziali d'errore&lt;br /&gt;
&lt;br /&gt;
===Fatto===&lt;br /&gt;
&lt;br /&gt;
===Da fare===&lt;br /&gt;
&lt;br /&gt;
Tutto, anche il dettaglio delle cose da fare...&lt;br /&gt;
&lt;br /&gt;
==Varie==&lt;br /&gt;
&lt;br /&gt;
Rinominare le directory dei sorgenti in conformità allo stile di BCI2000 e senza usare spazi&lt;/div&gt;</summary>
		<author><name>AndreaSgarlata</name></author>	</entry>

	<entry>
		<id>https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2761</id>
		<title>Talk:Online P300 and ErrP recognition with BCI2000</title>
		<link rel="alternate" type="text/html" href="https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2761"/>
				<updated>2008-04-30T13:42:04Z</updated>
		
		<summary type="html">&lt;p&gt;AndreaSgarlata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''MODIFICHE DA EFFETTUARE AL PLUGIN'''&lt;br /&gt;
&lt;br /&gt;
Il sistema attualmente è composto da un plugin che si occupa di inviare i dati tramite pipe ad un altro modulo che fa parte dell'intero sistema di BCI2000.&lt;br /&gt;
&lt;br /&gt;
Per ottenere una corretta temporizzazione del sistema di BCI2000 abbiamo sfruttato il fatto che il plugin è più lento nell'invio dei dati rispetto all'intero sistema BCI2000.&lt;br /&gt;
Infatti si è deciso di inviare tramite plugin una quantità di dati costante pari a 1/16 di secondo, nonostante che, i dati ricevuti dal plugin non sono un valore costante ma variabile intorno ad un certo valore medio, monitorando nel frattempo l'accumulo medio di campioni. &lt;br /&gt;
In questo modo ogni invio di dati rappresenta il trascorrere di un tempo prefissato che è in media è 1/16 di secondo.&lt;br /&gt;
&lt;br /&gt;
Test effettuato:&lt;br /&gt;
&lt;br /&gt;
- freq. campionamento: 128Hz&lt;br /&gt;
&lt;br /&gt;
- numero campioni per blocco dati da 1/16 di secondo: 8&lt;br /&gt;
&lt;br /&gt;
- visualizzazione accumulo medio ogni 10 chiamate al plugin&lt;br /&gt;
&lt;br /&gt;
- visualizzazione numero blocchi di dati inviati ogni 10 chiamate&lt;br /&gt;
&lt;br /&gt;
Risultati:&lt;br /&gt;
&lt;br /&gt;
[[Image:plugin.jpg]]&lt;br /&gt;
&lt;br /&gt;
- come mostrato in figura si può vedere che l'accumulo medio varia da 1 a 0 campioni (accumulo calcolato come il numero di campioni rimanenti in memoria dopo l'invio di un blocco dati)&lt;br /&gt;
- il numero di blocchi inviati varia da 1 a 2 blocchi con una media di blocchi inviati ogni 10 chiamate leggermente inferiore a 2 (nella schermata specifica 1.71). Nell'esempio sono stati inviati circa 14 campioni che equivalgono circa a 109 msec di dati.&lt;br /&gt;
&lt;br /&gt;
- il variare del numero di blocchi inviati dipende dall'accumulo verificatosi nelle chiamate precedenti e dal fatto che al plugin non arriva una quantità di dati costanti.&lt;br /&gt;
&lt;br /&gt;
Possiamo affermare comunque che sfruttando l'invio di una quantità di dati costanti, rappresentanti un certo intervallo di tempo, si riesce ad ottenere una temporizzazione dell'intero sistema BCI2000 che in media si posiziona nell'intorno della temporizzazione dettata dal plugin che è di 1/16 di secondo per ogni blocco dati processato.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MODIFICHE DA EFFETTUARE ALLA CATENA DI FILTRI DI BCI2000'''&lt;br /&gt;
&lt;br /&gt;
Attualmente la catena di filtri del modulo di BCI2000 è suddivisa nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)un filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)un filtro di Trigger che si occupa di rilevare gli inizi delle stimolazioni tramite l'analisi del segnale proveniente dal fototransistor&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa di accumulare più forme d'onda p300 relative alla stessa stimolazione e tra queste farne la media&lt;br /&gt;
&lt;br /&gt;
4)un filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si vuole modificare sia la sequenza di filtri che il funzionamento di alcuni di questi nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)filtro di Trigger che determina in maniera automatica, tramite una fase iniziale dettata dal modulo applicativo, il valore di soglia per distinguere gli istanti di tempo in cui il riquadro è nero oppure bianco&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa solamente di accumulare le forme d'onda p300 con un ring buffer che memorizza una porzione di segnale precedente, dato che noi rileviamo l'inizio di una stimolazione con un ritardo che è pari alla dimensione della finestra mobile fatta scorrere lungo il segnale di trigger&lt;br /&gt;
&lt;br /&gt;
4)filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)filtro che effettua la media dei valori in uscita dal filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
6)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MODIFICHE DA EFFETTUARE AD UNO SPELLER P300 IN MODO DA RENDERLO CONPATIBILE CON LE CARATTERISTICHE DEL MODULO FILTRO'''&lt;br /&gt;
&lt;br /&gt;
Per quanto riguarda il modulo applicativo bisogna introdurre un riquadro posto nell'angolo superiore destro dello schermo e farlo variare (bianco/nero) ogni qual volta viene effettuata una stimolazione e, prima dell'inizio della sequenza di stimolazioni, introdurre una fase preliminare in cui si fa variare (bianco/nero) il riquadro per un tempo totale preimpostato in modo da poter far determinare in maniera automatica dal filtro di Trigger il valore di soglia che permette di distinguere se siamo in fase di stimolazione (riquadro nero) o in fase di non stimolazione (riquadro bianco).&lt;br /&gt;
Terminata la fase di taratura del valore di soglia, lo speller può effettuare la sua sequenza di stimolazioni.&lt;br /&gt;
&lt;br /&gt;
Per le modifiche da effettuare al modulo applicativo di BCI2000 quando questo deve comunicare tramite protocollo UDP con un altro applicativo che effettua le stimolazioni su una differente macchina Linux si è invitati a visionare la relativa discussione di Roberto Massimini.&lt;/div&gt;</summary>
		<author><name>AndreaSgarlata</name></author>	</entry>

	<entry>
		<id>https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2760</id>
		<title>Talk:Online P300 and ErrP recognition with BCI2000</title>
		<link rel="alternate" type="text/html" href="https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2760"/>
				<updated>2008-04-30T13:14:40Z</updated>
		
		<summary type="html">&lt;p&gt;AndreaSgarlata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''MODIFICHE DA EFFETTUARE AL PLUGIN'''&lt;br /&gt;
&lt;br /&gt;
Il sistema attualmente è composto da un plugin che si occupa di inviare i dati tramite pipe ad un altro modulo che fa parte dell'intero sistema di BCI2000.&lt;br /&gt;
&lt;br /&gt;
Per ottenere una corretta temporizzazione del sistema di BCI2000 abbiamo sfruttato il fatto che il plugin è più lento nell'invio dei dati rispetto all'intero sistema BCI2000.&lt;br /&gt;
Infatti si è deciso di inviare tramite plugin una quantità di dati costante pari a 1/16 di secondo, nonostante che, i dati ricevuti dal plugin non sono un valore costante ma variabile intorno ad un certo valore medio, monitorando nel frattempo l'accumulo medio di campioni. &lt;br /&gt;
In questo modo ogni invio di dati rappresenta il trascorrere di un tempo prefissato che è in media è 1/16 di secondo.&lt;br /&gt;
&lt;br /&gt;
Test effettuato:&lt;br /&gt;
&lt;br /&gt;
- freq. campionamento: 128Hz&lt;br /&gt;
&lt;br /&gt;
- numero campioni per blocco dati da 1/16 di secondo: 8&lt;br /&gt;
&lt;br /&gt;
- visualizzazione accumulo medio ogni 10 chiamate al plugin&lt;br /&gt;
&lt;br /&gt;
- visualizzazione numero blocchi di dati inviati ogni 10 chiamate&lt;br /&gt;
&lt;br /&gt;
Risultati:&lt;br /&gt;
&lt;br /&gt;
[[Image:plugin.jpg]]&lt;br /&gt;
&lt;br /&gt;
- come mostrato in figura si può vedere che l'accumulo medio varia da 1 a 0 campioni (accumulo calcolato come il numero di campioni rimanenti in memoria dopo l'invio di un blocco dati)&lt;br /&gt;
- il numero di blocchi inviati varia da 1 a 2 blocchi con una media di blocchi inviati ogni 10 chiamate leggermente inferiore a 2 (nella schermata specifica 1.71). Nell'esempio sono stati inviati circa 14 campioni che equivalgono circa a 109 msec di dati.&lt;br /&gt;
&lt;br /&gt;
- il variare del numero di blocchi inviati dipende dall'accumulo verificatosi nelle chiamate precedenti e dal fatto che al plugin non arriva una quantità di dati costanti.&lt;br /&gt;
&lt;br /&gt;
Possiamo affermare comunque che sfruttando l'invio di una quantità di dati costanti, rappresentanti un certo intervallo di tempo, si riesce ad ottenere una temporizzazione dell'intero sistema BCI2000 che in media si posiziona nell'intorno della temporizzazione dettata dal plugin che è di 1/16 di secondo per ogni blocco dati processato.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MODIFICHE DA EFFETTUARE ALLA CATENA DI FILTRI DI BCI2000'''&lt;br /&gt;
&lt;br /&gt;
Attualmente la catena di filtri del modulo di BCI2000 è suddivisa nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)un filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)un filtro di Trigger che si occupa di rilevare gli inizi delle stimolazioni tramite l'analisi del segnale proveniente dal fototransistor&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa di accumulare più forme d'onda p300 relative alla stessa stimolazione e tra queste farne la media&lt;br /&gt;
&lt;br /&gt;
4)un filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si vuole modificare sia la sequenza di filtri che il funzionamento di alcuni di questi nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)filtro di Trigger che determina in maniera automatica, tramite una fase iniziale dettata dal modulo applicativo, il valore di soglia per distinguere gli istanti di tempo in cui il riquadro è nero oppure bianco&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa solamente di accumulare le forme d'onda p300&lt;br /&gt;
&lt;br /&gt;
4)filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)filtro che effettua la media dei valori in uscita dal filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
6)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MODIFICHE DA EFFETTUARE AD UNO SPELLER P300 IN MODO DA RENDERLO CONPATIBILE CON LE CARATTERISTICHE DEL MODULO FILTRO'''&lt;br /&gt;
&lt;br /&gt;
Per quanto riguarda il modulo applicativo bisogna introdurre un riquadro posto nell'angolo superiore destro dello schermo e farlo variare (bianco/nero) ogni qual volta viene effettuata una stimolazione e, prima dell'inizio della sequenza di stimolazioni, introdurre una fase preliminare in cui si fa variare (bianco/nero) il riquadro per un tempo totale preimpostato in modo da poter far determinare in maniera automatica dal filtro di Trigger il valore di soglia che permette di distinguere se siamo in fase di stimolazione (riquadro nero) o in fase di non stimolazione (riquadro bianco).&lt;br /&gt;
Terminata la fase di taratura del valore di soglia, lo speller può effettuare la sua sequenza di stimolazioni.&lt;br /&gt;
&lt;br /&gt;
Per le modifiche da effettuare al modulo applicativo di BCI2000 quando questo deve comunicare tramite protocollo UDP con un altro applicativo che effettua le stimolazioni su una differente macchina Linux si è invitati a visionare la relativa discussione di Roberto Massimini.&lt;/div&gt;</summary>
		<author><name>AndreaSgarlata</name></author>	</entry>

	<entry>
		<id>https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2727</id>
		<title>Talk:Online P300 and ErrP recognition with BCI2000</title>
		<link rel="alternate" type="text/html" href="https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2727"/>
				<updated>2008-04-30T08:43:10Z</updated>
		
		<summary type="html">&lt;p&gt;AndreaSgarlata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''MODIFICHE DA EFFETTUARE AL PLUGIN'''&lt;br /&gt;
&lt;br /&gt;
Il sistema attualmente è composto da un plugin che si occupa di inviare i dati tramite pipe ad un altro modulo che fa parte dell'intero sistema di BCI2000.&lt;br /&gt;
&lt;br /&gt;
Per ottenere una corretta temporizzazione del sistema di BCI2000 abbiamo sfruttato il fatto che il plugin è più lento nell'invio dei dati rispetto all'intero sistema BCI2000.&lt;br /&gt;
Infatti si è deciso di inviare tramite plugin una quantità di dati costante pari a 1/16 di secondo, nonostante che, i dati ricevuti dal plugin non sono un valore costante ma variabile intorno ad un certo valore medio, monitorando nel frattempo l'accumulo medio di campioni. &lt;br /&gt;
In questo modo ogni invio di dati rappresenta il trascorrere di un tempo prefissato che è in media è 1/16 di secondo.&lt;br /&gt;
&lt;br /&gt;
Test effettuato:&lt;br /&gt;
&lt;br /&gt;
- freq. campionamento: 128Hz&lt;br /&gt;
&lt;br /&gt;
- numero campioni per blocco dati da 1/16 di secondo: 8&lt;br /&gt;
&lt;br /&gt;
- visualizzazione accumulo medio ogni 10 chiamate al plugin&lt;br /&gt;
&lt;br /&gt;
- visualizzazione numero blocchi di dati inviati ogni 10 chiamate&lt;br /&gt;
&lt;br /&gt;
Risultati:&lt;br /&gt;
&lt;br /&gt;
[[Image:plugin.jpg]]&lt;br /&gt;
&lt;br /&gt;
- come mostrato in figura si può vedere che l'accumulo medio varia da 1 a 0 campioni (accumulo calcolato come il numero di campioni rimanenti in memoria dopo l'invio di un blocco dati)&lt;br /&gt;
- il numero di blocchi inviati varia da 1 a 2 blocchi con una media di blocchi ogni 10 chiamate leggermente inferiore a 2 (nella schermata specifica 1.71). Nell'esempio sono stati inviati circa 14 campioni che equivalgono circa a 109 msec di dati.&lt;br /&gt;
&lt;br /&gt;
- il variare del numero di blocchi inviati dipende dall'accumulo verificatosi nelle chiamate precedenti e dal fatto che al plugin non arriva una quantità di dati costanti.&lt;br /&gt;
&lt;br /&gt;
Possiamo affermare comunque che sfruttando l'invio di una quantità di dati costanti, rappresentanti un certo intervallo di tempo, si riesce ad ottenere una temporizzazione dell'intero sistema BCI2000 che in media si posiziona nell'intorno della temporizzazione dettata dal plugin che è di 1/16 di secondo per ogni blocco dati processato.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MODIFICHE DA EFFETTUARE ALLA CATENA DI FILTRI DI BCI2000'''&lt;br /&gt;
&lt;br /&gt;
Attualmente la catena di filtri del modulo di BCI2000 è suddivisa nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)un filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)un filtro di Trigger che si occupa di rilevare gli inizi delle stimolazioni tramite l'analisi del segnale proveniente dal fototransistor&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa di accumulare più forme d'onda p300 relative alla stessa stimolazione e tra queste farne la media&lt;br /&gt;
&lt;br /&gt;
4)un filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si vuole modificare sia la sequenza di filtri che il funzionamento di alcuni di questi nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)filtro di Trigger che determina in maniera automatica, tramite una fase iniziale dettata dal modulo applicativo, il valore di soglia per distinguere gli istanti di tempo in cui il riquadro è nero oppure bianco&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa solamente di accumulare le forme d'onda p300&lt;br /&gt;
&lt;br /&gt;
4)filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)filtro che effettua la media dei valori in uscita dal filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
6)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MODIFICHE DA EFFETTUARE AD UNO SPELLER P300 IN MODO DA RENDERLO CONPATIBILE CON LE CARATTERISTICHE DEL MODULO FILTRO'''&lt;br /&gt;
&lt;br /&gt;
Per quanto riguarda il modulo applicativo bisogna introdurre un riquadro posto nell'angolo superiore destro dello schermo e farlo variare (bianco/nero) ogni qual volta viene effettuata una stimolazione e, prima dell'inizio della sequenza di stimolazioni, introdurre una fase preliminare in cui si fa variare (bianco/nero) il riquadro per un tempo totale preimpostato in modo da poter far determinare in maniera automatica dal filtro di Trigger il valore di soglia che permette di distinguere se siamo in fase di stimolazione (riquadro nero) o in fase di non stimolazione (riquadro bianco).&lt;br /&gt;
Terminata la fase di taratura del valore di soglia, lo speller può effettuare la sua sequenza di stimolazioni.&lt;br /&gt;
&lt;br /&gt;
Per le modifiche da effettuare al modulo applicativo di BCI2000 quando questo deve comunicare tramite protocollo UDP con un altro applicativo che effettua le stimolazioni su una differente macchina Linux si è invitati a visionare la relativa discussione di Roberto Massimini.&lt;/div&gt;</summary>
		<author><name>AndreaSgarlata</name></author>	</entry>

	<entry>
		<id>https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2726</id>
		<title>Talk:Online P300 and ErrP recognition with BCI2000</title>
		<link rel="alternate" type="text/html" href="https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2726"/>
				<updated>2008-04-30T08:42:52Z</updated>
		
		<summary type="html">&lt;p&gt;AndreaSgarlata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''MODIFICHE DA EFFETTUARE AL PLUGIN'''&lt;br /&gt;
&lt;br /&gt;
Il sistema attualmente è composto da un plugin che si occupa di inviare i dati tramite pipe ad un altro modulo che fa parte dell'intero sistema di BCI2000.&lt;br /&gt;
&lt;br /&gt;
Per ottenere una corretta temporizzazione del sistema di BCI2000 abbiamo sfruttato il fatto che il plugin è più lento nell'invio dei dati rispetto all'intero sistema BCI2000.&lt;br /&gt;
Infatti si è deciso di inviare tramite plugin una quantità di dati costante pari a 1/16 di secondo, nonostante che, i dati ricevuti dal plugin non sono un valore costante ma variabile intorno ad un certo valore medio, monitorando nel frattempo l'accumulo medio di campioni. &lt;br /&gt;
In questo modo ogni invio di dati rappresenta il trascorrere di un tempo prefissato che è in media è 1/16 di secondo.&lt;br /&gt;
&lt;br /&gt;
Test effettuato:&lt;br /&gt;
&lt;br /&gt;
- freq. campionamento: 128Hz&lt;br /&gt;
&lt;br /&gt;
- numero campioni per blocco dati da 1/16 di secondo: 8&lt;br /&gt;
&lt;br /&gt;
- visualizzazione accumulo medio ogni 10 chiamate al plugin&lt;br /&gt;
&lt;br /&gt;
- visualizzazione numero blocchi di dati inviati ogni 10 chiamate&lt;br /&gt;
&lt;br /&gt;
Risultati:&lt;br /&gt;
&lt;br /&gt;
[[Image:plugin.jpg]]&lt;br /&gt;
&lt;br /&gt;
- come mostrato in figura si può vedere che l'accumulo medio varia da 1 a 0 campioni (accumulo calcolato come il numero di campioni rimanenti in memoria dopo l'invio di un blocco dati)&lt;br /&gt;
- il numero di blocchi inviati varia da 1 a 2 blocchi con una media di blocchi ogni 10 chiamate leggermente inferiore a 2 (nella schermata specifica 1.71). Nell'esempio sono stati inviati circa 14 campioni che equivalgono circa a 109 msec di dati.&lt;br /&gt;
&lt;br /&gt;
- il variare del numero di blocchi inviati dipende dall'accumulo verificatosi nelle chiamate precedenti e dal fatto che al plugin non arriva una quantità di dati costanti.&lt;br /&gt;
&lt;br /&gt;
Possiamo affermare comunque che sfruttando l'invio di una quantità di dati costanti, rappresentanti un certo intervallo di tempo, si riesce ad ottenere una temporizzazione dell'intero sistema BCI2000 che in media si posiziona nell'intorno della temporizzazione dettata dal plugin che è di 1/16 di secondo per ogni blocco dati processato.&lt;br /&gt;
&lt;br /&gt;
'''MODIFICHE DA EFFETTUARE ALLA CATENA DI FILTRI DI BCI2000'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Attualmente la catena di filtri del modulo di BCI2000 è suddivisa nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)un filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)un filtro di Trigger che si occupa di rilevare gli inizi delle stimolazioni tramite l'analisi del segnale proveniente dal fototransistor&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa di accumulare più forme d'onda p300 relative alla stessa stimolazione e tra queste farne la media&lt;br /&gt;
&lt;br /&gt;
4)un filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si vuole modificare sia la sequenza di filtri che il funzionamento di alcuni di questi nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)filtro di Trigger che determina in maniera automatica, tramite una fase iniziale dettata dal modulo applicativo, il valore di soglia per distinguere gli istanti di tempo in cui il riquadro è nero oppure bianco&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa solamente di accumulare le forme d'onda p300&lt;br /&gt;
&lt;br /&gt;
4)filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)filtro che effettua la media dei valori in uscita dal filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
6)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MODIFICHE DA EFFETTUARE AD UNO SPELLER P300 IN MODO DA RENDERLO CONPATIBILE CON LE CARATTERISTICHE DEL MODULO FILTRO'''&lt;br /&gt;
&lt;br /&gt;
Per quanto riguarda il modulo applicativo bisogna introdurre un riquadro posto nell'angolo superiore destro dello schermo e farlo variare (bianco/nero) ogni qual volta viene effettuata una stimolazione e, prima dell'inizio della sequenza di stimolazioni, introdurre una fase preliminare in cui si fa variare (bianco/nero) il riquadro per un tempo totale preimpostato in modo da poter far determinare in maniera automatica dal filtro di Trigger il valore di soglia che permette di distinguere se siamo in fase di stimolazione (riquadro nero) o in fase di non stimolazione (riquadro bianco).&lt;br /&gt;
Terminata la fase di taratura del valore di soglia, lo speller può effettuare la sua sequenza di stimolazioni.&lt;br /&gt;
&lt;br /&gt;
Per le modifiche da effettuare al modulo applicativo di BCI2000 quando questo deve comunicare tramite protocollo UDP con un altro applicativo che effettua le stimolazioni su una differente macchina Linux si è invitati a visionare la relativa discussione di Roberto Massimini.&lt;/div&gt;</summary>
		<author><name>AndreaSgarlata</name></author>	</entry>

	<entry>
		<id>https://airwiki.deib.polimi.it/index.php?title=Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2725</id>
		<title>Online P300 and ErrP recognition with BCI2000</title>
		<link rel="alternate" type="text/html" href="https://airwiki.deib.polimi.it/index.php?title=Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2725"/>
				<updated>2008-04-30T08:42:34Z</updated>
		
		<summary type="html">&lt;p&gt;AndreaSgarlata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Part 1: project profile''' ==&lt;br /&gt;
&lt;br /&gt;
=== Project name ===&lt;br /&gt;
''Comandare una sedia a rotelle usando BCI2000''&lt;br /&gt;
&lt;br /&gt;
=== Project short description ===&lt;br /&gt;
''Il progetto si pone l'obiettivo di sviluppare un software in grado di garantire la navigazione all'interno di menù con l'attivazione delle relative funzioni che consentono la navigazione di una sedia a rotelle all'interno degli ambienti domestici. L'iterazione tra uomo e computer è effettuata tramite interfaccia BCI''&lt;br /&gt;
&lt;br /&gt;
=== Dates ===&lt;br /&gt;
Start date: 2008/01/01&lt;br /&gt;
&lt;br /&gt;
End date: 2008/07/01&lt;br /&gt;
&lt;br /&gt;
=== Internet site(s) ===&lt;br /&gt;
''''&lt;br /&gt;
&lt;br /&gt;
=== People involved ===&lt;br /&gt;
''''&lt;br /&gt;
&lt;br /&gt;
Andrea Sgarlata&lt;br /&gt;
&lt;br /&gt;
==== Project head(s) ====&lt;br /&gt;
''''&lt;br /&gt;
Matteo Matteucci&lt;br /&gt;
Bernardo Dalseno&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Other Politecnico di Milano people ====&lt;br /&gt;
''if any, other people participating to the project: ''&lt;br /&gt;
&lt;br /&gt;
==== Students ====&lt;br /&gt;
&lt;br /&gt;
'''Students currently working on the project'''&lt;br /&gt;
&lt;br /&gt;
Andrea Sgarlata&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Students working on the project in the past'''&lt;br /&gt;
&lt;br /&gt;
==== External personnel: ====&lt;br /&gt;
''''&lt;br /&gt;
&lt;br /&gt;
=== Laboratory work and risk analysis ===&lt;br /&gt;
''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== '''Part 2: project description''' ==&lt;br /&gt;
&lt;br /&gt;
Il software per la rileviazione della P300 e la relativa navigazione nei menù è sviluppato a partire dal tool open source 'BCI2000' che mette a disposizione una struttura ed una serie di funzioni flessibili ed adattabili alle nostre esisgenze.&lt;br /&gt;
Per la rilevazione delle onde celebrali è utilizzato un amplificatore con il relativo software 'EBneuro'.&lt;br /&gt;
Il sistema sottopone l'utente a delle stimolazioni visive, nel frattempo rileva la sua attività celebrale e tramite l'analisi di questa cerca di determinare quale stimolazione visiva l'utente ha selezionato. Identificata la stimolazione, si attiva la funzione associata a quella stimolazione che può essere l'attivavione di un nuovo sottomenù, lo spostamento della sedia a rotelle in un altra stanza oppure l'accensione di una lampadina o radio ecc...&lt;/div&gt;</summary>
		<author><name>AndreaSgarlata</name></author>	</entry>

	<entry>
		<id>https://airwiki.deib.polimi.it/index.php?title=User:AndreaSgarlata&amp;diff=2724</id>
		<title>User:AndreaSgarlata</title>
		<link rel="alternate" type="text/html" href="https://airwiki.deib.polimi.it/index.php?title=User:AndreaSgarlata&amp;diff=2724"/>
				<updated>2008-04-30T08:41:35Z</updated>
		
		<summary type="html">&lt;p&gt;AndreaSgarlata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{User&lt;br /&gt;
|firstname=Andrea&lt;br /&gt;
|lastname=Sgarlata&lt;br /&gt;
|email=andrea (dot) sgarlata (at) mail (dot) polimi (dot) it&lt;br /&gt;
|advisor=Matteo Matteucci - Bernardo Dal Seno&lt;br /&gt;
|projectpage=Command a wheelchair using BCI2000&lt;br /&gt;
|photo=Andrea.jpg&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>AndreaSgarlata</name></author>	</entry>

	<entry>
		<id>https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2723</id>
		<title>Talk:Online P300 and ErrP recognition with BCI2000</title>
		<link rel="alternate" type="text/html" href="https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2723"/>
				<updated>2008-04-30T08:36:22Z</updated>
		
		<summary type="html">&lt;p&gt;AndreaSgarlata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''MODIFICHE DA EFFETTUARE AL PLUGIN'''&lt;br /&gt;
&lt;br /&gt;
Il sistema attualmente è composto da un plugin che si occupa di inviare i dati tramite pipe ad un altro modulo che fa parte dell'intero sistema di BCI2000.&lt;br /&gt;
&lt;br /&gt;
Per ottenere una corretta temporizzazione del sistema di BCI2000 abbiamo sfruttato il fatto che il plugin è più lento nell'invio dei dati rispetto all'intero sistema BCI2000.&lt;br /&gt;
Infatti si è deciso di inviare tramite plugin una quantità di dati costante pari a 1/16 di secondo, nonostante che, i dati ricevuti dal plugin non sono un valore costante ma variabile intorno ad un certo valore medio, monitorando nel frattempo l'accumulo medio di campioni. &lt;br /&gt;
In questo modo ogni invio di dati rappresenta il trascorrere di un tempo prefissato che è in media è 1/16 di secondo.&lt;br /&gt;
&lt;br /&gt;
Test effettuato:&lt;br /&gt;
&lt;br /&gt;
- freq. campionamento: 128Hz&lt;br /&gt;
&lt;br /&gt;
- numero campioni per blocco dati da 1/16 di secondo: 8&lt;br /&gt;
&lt;br /&gt;
- visualizzazione accumulo medio ogni 10 chiamate al plugin&lt;br /&gt;
&lt;br /&gt;
- visualizzazione numero blocchi di dati inviati ogni 10 chiamate&lt;br /&gt;
&lt;br /&gt;
Risultati:&lt;br /&gt;
&lt;br /&gt;
[[Image:plugin.jpg]]&lt;br /&gt;
&lt;br /&gt;
- come mostrato in figura si può vedere che l'accumulo medio varia da 1 a 0 campioni (accumulo calcolato come il numero di campioni rimanenti in memoria dopo l'invio di un blocco dati)&lt;br /&gt;
- il numero di blocchi inviati varia da 1 a 2 blocchi con una media di blocchi ogni 10 chiamate leggermente inferiore a 2 (nella schermata specifica 1.71). Nell'esempio sono stati inviati circa 14 campioni che equivalgono circa a 109 msec di dati.&lt;br /&gt;
&lt;br /&gt;
- il variare del numero di blocchi inviati dipende dall'accumulo verificatosi nelle chiamate precedenti e dal fatto che al plugin non arriva una quantità di dati costanti.&lt;br /&gt;
&lt;br /&gt;
Possiamo affermare comunque che sfruttando l'invio di una quantità di dati costanti, rappresentanti un certo intervallo di tempo, si riesce ad ottenere una temporizzazione dell'intero sistema BCI2000 che in media si posiziona nell'intorno della temporizzazione dettata dal plugin che è di 1/16 di secondo per ogni blocco dati processato.&lt;br /&gt;
&lt;br /&gt;
'''MODIFICHE DA EFFETTUARE ALLA CATENA DI FILTRI DI BCI2000'''&lt;br /&gt;
&lt;br /&gt;
Attualmente la catena di filtri del modulo di BCI2000 è suddivisa nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)un filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)un filtro di Trigger che si occupa di rilevare gli inizi delle stimolazioni tramite l'analisi del segnale proveniente dal fototransistor&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa di accumulare più forme d'onda p300 relative alla stessa stimolazione e tra queste farne la media&lt;br /&gt;
&lt;br /&gt;
4)un filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si vuole modificare sia la sequenza di filtri che il funzionamento di alcuni di questi nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)filtro di Trigger che determina in maniera automatica, tramite una fase iniziale dettata dal modulo applicativo, il valore di soglia per distinguere gli istanti di tempo in cui il riquadro è nero oppure bianco&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa solamente di accumulare le forme d'onda p300&lt;br /&gt;
&lt;br /&gt;
4)filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)filtro che effettua la media dei valori in uscita dal filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
6)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MODIFICHE DA EFFETTUARE AD UNO SPELLER P300 IN MODO DA RENDERLO CONPATIBILE CON LE CARATTERISTICHE DEL MODULO FILTRO'''&lt;br /&gt;
&lt;br /&gt;
Per quanto riguarda il modulo applicativo bisogna introdurre un riquadro posto nell'angolo superiore destro dello schermo e farlo variare (bianco/nero) ogni qual volta viene effettuata una stimolazione e, prima dell'inizio della sequenza di stimolazioni, introdurre una fase preliminare in cui si fa variare (bianco/nero) il riquadro per un tempo totale preimpostato in modo da poter far determinare in maniera automatica dal filtro di Trigger il valore di soglia che permette di distinguere se siamo in fase di stimolazione (riquadro nero) o in fase di non stimolazione (riquadro bianco).&lt;br /&gt;
Terminata la fase di taratura del valore di soglia, lo speller può effettuare la sua sequenza di stimolazioni.&lt;br /&gt;
&lt;br /&gt;
Per le modifiche da effettuare al modulo applicativo di BCI2000 quando questo deve comunicare tramite protocollo UDP con un altro applicativo che effettua le stimolazioni su una differente macchina Linux si è invitati a visionare la relativa discussione di Roberto Massimini.&lt;/div&gt;</summary>
		<author><name>AndreaSgarlata</name></author>	</entry>

	<entry>
		<id>https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2722</id>
		<title>Talk:Online P300 and ErrP recognition with BCI2000</title>
		<link rel="alternate" type="text/html" href="https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2722"/>
				<updated>2008-04-30T08:11:53Z</updated>
		
		<summary type="html">&lt;p&gt;AndreaSgarlata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''MODIFICHE DA EFFETTUARE AL PLUGIN'''&lt;br /&gt;
&lt;br /&gt;
Il sistema attualmente è composto da un plugin che si occupa di inviare i dati tramite pipe ad un altro modulo che fa parte dell'intero sistema di BCI2000.&lt;br /&gt;
&lt;br /&gt;
Per ottenere una corretta temporizzazione del sistema di BCI2000 abbiamo sfruttato il fatto che il plugin è più lento nell'invio dei dati rispetto all'intero sistema BCI2000.&lt;br /&gt;
Infatti si è deciso di inviare tramite plugin una quantità di dati costante pari a 1/16 di secondo, nonostante che, i dati ricevuti dal plugin non sono un valore costante ma variabile intorno ad un certo valore medio, monitorando nel frattempo l'accumulo medio di campioni. &lt;br /&gt;
In questo modo ogni invio di dati rappresenta il trascorrere di un tempo prefissato che è in media è 1/16 di secondo.&lt;br /&gt;
&lt;br /&gt;
Test effettuato:&lt;br /&gt;
&lt;br /&gt;
- freq. campionamento: 128Hz&lt;br /&gt;
&lt;br /&gt;
- numero campioni per blocco dati da 1/16 di secondo: 8&lt;br /&gt;
&lt;br /&gt;
- visualizzazione accumulo medio ogni 10 chiamate al plugin&lt;br /&gt;
&lt;br /&gt;
- visualizzazione numero blocchi di dati inviati ogni 10 chiamate&lt;br /&gt;
&lt;br /&gt;
Risultati:&lt;br /&gt;
&lt;br /&gt;
[[Image:plugin.jpg]]&lt;br /&gt;
&lt;br /&gt;
- come mostrato in figura si può vedere che l'accumulo medio varia da 1 a 0 campioni (accumulo calcolato come il numero di campioni rimanenti in memoria dopo l'invio di un blocco dati)&lt;br /&gt;
- il numero di blocchi inviati varia da 1 a 2 blocchi con una media di blocchi ogni 10 chiamate leggermente inferiore a 2 (nella schermata specifica 1.71). Nell'esempio sono stati inviati circa 14 campioni che equivalgono circa a 109 msec di dati.&lt;br /&gt;
&lt;br /&gt;
- il variare del numero di blocchi inviati dipende dall'accumulo verificatosi nelle chiamate precedenti e dal fatto che al plugin non arriva una quantità di dati costanti.&lt;br /&gt;
&lt;br /&gt;
Possiamo affermare comunque che sfruttando l'invio di una quantità di dati costanti, rappresentanti un certo intervallo di tempo, si riesce ad ottenere una temporizzazione dell'intero sistema BCI2000 che in media si posiziona nell'intorno della temporizzazione dettata dal plugin che è di 1/16 di secondo per ogni blocco dati processato.&lt;br /&gt;
&lt;br /&gt;
'''MODIFICHE DA EFFETTUARE ALLA CATENA DI FILTRI DI BCI2000'''&lt;br /&gt;
&lt;br /&gt;
Attualmente la catena di filtri del modulo di BCI2000 è suddivisa nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)un filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)un filtro di Trigger che si occupa di rilevare gli inizi delle stimolazioni tramite l'analisi del segnale proveniente dal fototransistor&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa di accumulare più forme d'onda p300 relative alla stessa stimolazione e tra queste farne la media&lt;br /&gt;
&lt;br /&gt;
4)un filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Si vuole modificare sia la sequenza di filtri che il funzionamento di alcuni di questi nel seguente modo:&lt;br /&gt;
&lt;br /&gt;
1)filtro spaziale&lt;br /&gt;
&lt;br /&gt;
2)filtro di Trigger che determina in maniera automatica, tramite una fase iniziale dettata dal modulo applicativo, il valore di soglia per distinguere gli istanti di tempo in cui il riquadro è nero oppure bianco&lt;br /&gt;
&lt;br /&gt;
3)un filtro che si occupa solamente di accumulare le forme d'onda p300&lt;br /&gt;
&lt;br /&gt;
4)filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
5)filtro che effettua la media dei valori in uscita dal filtro di classificazione&lt;br /&gt;
&lt;br /&gt;
6)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''MODIFICHE DA EFFETTUARE AD UNO SPELLER P300 IN MODO DA RENDERLO CONPATIBILE CON LE CARATTERISTICHE DEL MODULO FILTRO'''&lt;/div&gt;</summary>
		<author><name>AndreaSgarlata</name></author>	</entry>

	<entry>
		<id>https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2721</id>
		<title>Talk:Online P300 and ErrP recognition with BCI2000</title>
		<link rel="alternate" type="text/html" href="https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2721"/>
				<updated>2008-04-30T08:11:02Z</updated>
		
		<summary type="html">&lt;p&gt;AndreaSgarlata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''MODIFICHE DA EFFETTUARE AL PLUGIN'''&lt;br /&gt;
&lt;br /&gt;
Il sistema attualmente è composto da un plugin che si occupa di inviare i dati tramite pipe ad un altro modulo che fa parte dell'intero sistema di BCI2000.&lt;br /&gt;
&lt;br /&gt;
Per ottenere una corretta temporizzazione del sistema di BCI2000 abbiamo sfruttato il fatto che il plugin è più lento nell'invio dei dati rispetto all'intero sistema BCI2000.&lt;br /&gt;
Infatti si è deciso di inviare tramite plugin una quantità di dati costante pari a 1/16 di secondo, nonostante che, i dati ricevuti dal plugin non sono un valore costante ma variabile intorno ad un certo valore medio, monitorando nel frattempo l'accumulo medio di campioni. &lt;br /&gt;
In questo modo ogni invio di dati rappresenta il trascorrere di un tempo prefissato che è in media è 1/16 di secondo.&lt;br /&gt;
&lt;br /&gt;
Test effettuato:&lt;br /&gt;
&lt;br /&gt;
- freq. campionamento: 128Hz&lt;br /&gt;
&lt;br /&gt;
- numero campioni per blocco dati da 1/16 di secondo: 8&lt;br /&gt;
&lt;br /&gt;
- visualizzazione accumulo medio ogni 10 chiamate al plugin&lt;br /&gt;
&lt;br /&gt;
- visualizzazione numero blocchi di dati inviati ogni 10 chiamate&lt;br /&gt;
&lt;br /&gt;
Risultati:&lt;br /&gt;
&lt;br /&gt;
[[Image:plugin.jpg]]&lt;br /&gt;
&lt;br /&gt;
- come mostrato in figura si può vedere che l'accumulo medio varia da 1 a 0 campioni (accumulo calcolato come il numero di campioni rimanenti in memoria dopo l'invio di un blocco dati)&lt;br /&gt;
- il numero di blocchi inviati varia da 1 a 2 blocchi con una media di blocchi ogni 10 chiamate leggermente inferiore a 2 (nella schermata specifica 1.71). Nell'esempio sono stati inviati circa 14 campioni che equivalgono circa a 109 msec di dati.&lt;br /&gt;
&lt;br /&gt;
- il variare del numero di blocchi inviati dipende dall'accumulo verificatosi nelle chiamate precedenti e dal fatto che al plugin non arriva una quantità di dati costanti.&lt;br /&gt;
&lt;br /&gt;
Possiamo affermare comunque che sfruttando l'invio di una quantità di dati costanti, rappresentanti un certo intervallo di tempo, si riesce ad ottenere una temporizzazione dell'intero sistema BCI2000 che in media si posiziona nell'intorno della temporizzazione dettata dal plugin che è di 1/16 di secondo per ogni blocco dati processato.&lt;br /&gt;
&lt;br /&gt;
'''MODIFICHE DA EFFETTUARE ALLA CATENA DI FILTRI DI BCI2000'''&lt;br /&gt;
&lt;br /&gt;
Attualmente la catena di filtri del modulo di BCI2000 è suddivisa nel seguente modo:&lt;br /&gt;
1)un filtro spaziale&lt;br /&gt;
2)un filtro di Trigger che si occupa di rilevare gli inizi delle stimolazioni tramite l'analisi del segnale proveniente dal fototransistor&lt;br /&gt;
3)un filtro che si occupa di accumulare più forme d'onda p300 relative alla stessa stimolazione e tra queste farne la media&lt;br /&gt;
4)un filtro di classificazione&lt;br /&gt;
5)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
Si vuole modificare sia la sequenza di filtri che il funzionamento di alcuni di questi nel seguente modo:&lt;br /&gt;
1)filtro spaziale&lt;br /&gt;
2)filtro di Trigger che determina in maniera automatica, tramite una fase iniziale dettata dal modulo applicativo, il valore di soglia per distinguere gli istanti di tempo in cui il riquadro è nero oppure bianco.&lt;br /&gt;
3)un filtro che si occupa solamente di accumulare le forme d'onda p300&lt;br /&gt;
4)filtro di classificazione&lt;br /&gt;
5)filtro che effettua la media dei valori in uscita dal filtro di classificazione&lt;br /&gt;
6)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
'''MODIFICHE DA EFFETTUARE AD UNO SPELLER P300 IN MODO DA RENDERLO CONPATIBILE CON LE CARATTERISTICHE DEL MODULO FILTRO'''&lt;/div&gt;</summary>
		<author><name>AndreaSgarlata</name></author>	</entry>

	<entry>
		<id>https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2720</id>
		<title>Talk:Online P300 and ErrP recognition with BCI2000</title>
		<link rel="alternate" type="text/html" href="https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2720"/>
				<updated>2008-04-30T08:05:14Z</updated>
		
		<summary type="html">&lt;p&gt;AndreaSgarlata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''MODIFICHE DA EFFETTUARE AL PLUGIN'''&lt;br /&gt;
&lt;br /&gt;
Il sistema attualmente è composto da un plugin che si occupa di inviare i dati tramite pipe ad un altro modulo che fa parte dell'intero sistema di BCI2000.&lt;br /&gt;
&lt;br /&gt;
Per ottenere una corretta temporizzazione del sistema di BCI2000 abbiamo sfruttato il fatto che il plugin è più lento nell'invio dei dati rispetto all'intero sistema BCI2000.&lt;br /&gt;
Infatti si è deciso di inviare tramite plugin una quantità di dati costante pari a 1/16 di secondo, nonostante che, i dati ricevuti dal plugin non sono un valore costante ma variabile intorno ad un certo valore medio, monitorando nel frattempo l'accumulo medio di campioni. &lt;br /&gt;
In questo modo ogni invio di dati rappresenta il trascorrere di un tempo prefissato che è in media è 1/16 di secondo.&lt;br /&gt;
&lt;br /&gt;
Test effettuato:&lt;br /&gt;
&lt;br /&gt;
- freq. campionamento: 128Hz&lt;br /&gt;
&lt;br /&gt;
- numero campioni per blocco dati da 1/16 di secondo: 8&lt;br /&gt;
&lt;br /&gt;
- visualizzazione accumulo medio ogni 10 chiamate al plugin&lt;br /&gt;
&lt;br /&gt;
- visualizzazione numero blocchi di dati inviati ogni 10 chiamate&lt;br /&gt;
&lt;br /&gt;
Risultati:&lt;br /&gt;
&lt;br /&gt;
[[Image:plugin.jpg]]&lt;br /&gt;
&lt;br /&gt;
- come mostrato in figura si può vedere che l'accumulo medio varia da 1 a 0 campioni (accumulo calcolato come il numero di campioni rimanenti in memoria dopo l'invio di un blocco dati)&lt;br /&gt;
- il numero di blocchi inviati varia da 1 a 2 blocchi con una media di blocchi ogni 10 chiamate leggermente inferiore a 2 (nella schermata specifica 1.71). Nell'esempio sono stati inviati circa 14 campioni che equivalgono circa a 109 msec di dati.&lt;br /&gt;
&lt;br /&gt;
- il variare del numero di blocchi inviati dipende dall'accumulo verificatosi nelle chiamate precedenti e dal fatto che al plugin non arriva una quantità di dati costanti.&lt;br /&gt;
&lt;br /&gt;
Possiamo affermare comunque che sfruttando l'invio di una quantità di dati costanti, rappresentanti un certo intervallo di tempo, si riesce ad ottenere una temporizzazione dell'intero sistema BCI2000 che in media si posiziona nell'intorno della temporizzazione dettata dal plugin che è di 1/16 di secondo per ogni blocco dati processato.&lt;br /&gt;
&lt;br /&gt;
'''MODIFICHE DA EFFETTUARE ALLA CATENA DI FILTRI DI BCI2000'''&lt;br /&gt;
&lt;br /&gt;
Attualmente la catena di filtri del modulo di BCI2000 è suddivisa nel seguente modo:&lt;br /&gt;
1)un filtro spaziale&lt;br /&gt;
2)un filtro di Trigger che si occupa di rilevare gli inizi delle stimolazioni tramite l'analisi del segnale proveniente dal fototransistor&lt;br /&gt;
3)un filtro che si occupa di accumulare più forme d'onda p300 relative alla stessa stimolazione e tra queste farne la media&lt;br /&gt;
4)un filtro di classificazione&lt;br /&gt;
5)un filtro di normalizzazione&lt;br /&gt;
&lt;br /&gt;
Si vuole modificare la sequenza di filtri nel&lt;/div&gt;</summary>
		<author><name>AndreaSgarlata</name></author>	</entry>

	<entry>
		<id>https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2719</id>
		<title>Talk:Online P300 and ErrP recognition with BCI2000</title>
		<link rel="alternate" type="text/html" href="https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2719"/>
				<updated>2008-04-30T07:53:49Z</updated>
		
		<summary type="html">&lt;p&gt;AndreaSgarlata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''MODIFICHE DA EFFETTUARE AL PLUGIN'''&lt;br /&gt;
&lt;br /&gt;
Il sistema attualmente è composto da un plugin che si occupa di inviare i dati tramite pipe ad un altro modulo che fa parte dell'intero sistema di BCI2000.&lt;br /&gt;
&lt;br /&gt;
Per ottenere una corretta temporizzazione del sistema di BCI2000 abbiamo sfruttato il fatto che il plugin è più lento nell'invio dei dati rispetto all'intero sistema BCI2000.&lt;br /&gt;
Infatti si è deciso di inviare tramite plugin una quantità di dati costante pari a 1/16 di secondo, nonostante che, i dati ricevuti dal plugin non sono un valore costante ma variabile intorno ad un certo valore medio, monitorando nel frattempo l'accumulo medio di campioni. &lt;br /&gt;
In questo modo ogni invio di dati rappresenta il trascorrere di un tempo prefissato che è in media è 1/16 di secondo.&lt;br /&gt;
&lt;br /&gt;
Test effettuato:&lt;br /&gt;
&lt;br /&gt;
- freq. campionamento: 128Hz&lt;br /&gt;
&lt;br /&gt;
- numero campioni per blocco dati da 1/16 di secondo: 8&lt;br /&gt;
&lt;br /&gt;
- visualizzazione accumulo medio ogni 10 chiamate al plugin&lt;br /&gt;
&lt;br /&gt;
- visualizzazione numero blocchi di dati inviati ogni 10 chiamate&lt;br /&gt;
&lt;br /&gt;
Risultati:&lt;br /&gt;
&lt;br /&gt;
[[Image:plugin.jpg]]&lt;br /&gt;
&lt;br /&gt;
- come mostrato in figura si può vedere che l'accumulo medio varia da 1 a 0 campioni (accumulo calcolato come il numero di campioni rimanenti in memoria dopo l'invio di un blocco dati)&lt;br /&gt;
- il numero di blocchi inviati varia da 1 a 2 blocchi con una media di blocchi ogni 10 chiamate leggermente inferiore a 2 (nella schermata specifica 1.71). Nell'esempio sono stati inviati circa 14 campioni che equivalgono circa a 109 msec di dati.&lt;br /&gt;
&lt;br /&gt;
- il variare del numero di blocchi inviati dipende dall'accumulo verificatosi nelle chiamate precedenti e dal fatto che al plugin non arriva una quantità di dati costanti.&lt;br /&gt;
&lt;br /&gt;
Possiamo affermare comunque che sfruttando l'invio di una quantità di dati costanti, rappresentanti un certo intervallo di tempo, si riesce ad ottenere una temporizzazione dell'intero sistema BCI2000 che in media si posiziona nell'intorno della temporizzazione dettata dal plugin che è di 1/16 di secondo per ogni blocco dati processato.&lt;/div&gt;</summary>
		<author><name>AndreaSgarlata</name></author>	</entry>

	<entry>
		<id>https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2709</id>
		<title>Talk:Online P300 and ErrP recognition with BCI2000</title>
		<link rel="alternate" type="text/html" href="https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2709"/>
				<updated>2008-04-29T13:03:25Z</updated>
		
		<summary type="html">&lt;p&gt;AndreaSgarlata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Il sistema attualmente è composto da un plugin che si occupa di inviare i dati tramite pipe ad un altro modulo che fa parte dell'intero sistema di BCI2000.&lt;br /&gt;
&lt;br /&gt;
Per ottenere una corretta temporizzazione del sistema di BCI2000 abbiamo sfruttato il fatto che il plugin è più lento nell'invio dei dati rispetto all'intero sistema BCI2000.&lt;br /&gt;
Infatti si è deciso di inviare tramite plugin una quantità di dati costante pari a 1/16 di secondo, nonostante che, i dati ricevuti dal plugin non sono un valore costante ma variabile intorno ad un certo valore medio, monitorando nel frattempo l'accumulo medio di campioni. &lt;br /&gt;
In questo modo ogni invio di dati rappresenta il trascorrere di un tempo prefissato che è in media è 1/16 di secondo.&lt;br /&gt;
&lt;br /&gt;
Test effettuato:&lt;br /&gt;
&lt;br /&gt;
- freq. campionamento: 128Hz&lt;br /&gt;
&lt;br /&gt;
- numero campioni per blocco dati da 1/16 di secondo: 8&lt;br /&gt;
&lt;br /&gt;
- visualizzazione accumulo medio ogni 10 chiamate al plugin&lt;br /&gt;
&lt;br /&gt;
- visualizzazione numero blocchi di dati inviati ogni 10 chiamate&lt;br /&gt;
&lt;br /&gt;
Risultati:&lt;br /&gt;
&lt;br /&gt;
[[Image:plugin.jpg]]&lt;br /&gt;
&lt;br /&gt;
- come mostrato in figura si può vedere che l'accumulo medio varia da 1 a 0 campioni (accumulo calcolato come il numero di campioni rimanenti in memoria dopo l'invio di un blocco dati)&lt;br /&gt;
- il numero di blocchi inviati varia da 1 a 2 blocchi con una media di blocchi ogni 10 chiamate leggermente inferiore a 2 (nella schermata specifica 1.71). Nell'esempio sono stati inviati circa 14 campioni che equivalgono circa a 109 msec di dati.&lt;br /&gt;
&lt;br /&gt;
- il variare del numero di blocchi inviati dipende dall'accumulo verificatosi nelle chiamate precedenti e dal fatto che al plugin non arriva una quantità di dati costanti.&lt;br /&gt;
&lt;br /&gt;
Possiamo affermare comunque che sfruttando l'invio di una quantità di dati costanti, rappresentanti un certo intervallo di tempo, si riesce ad ottenere una temporizzazione dell'intero sistema BCI2000 che in media si posiziona nell'intorno della temporizzazione dettata dal plugin che è di 1/16 di secondo per ogni blocco dati processato.&lt;/div&gt;</summary>
		<author><name>AndreaSgarlata</name></author>	</entry>

	<entry>
		<id>https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2708</id>
		<title>Talk:Online P300 and ErrP recognition with BCI2000</title>
		<link rel="alternate" type="text/html" href="https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2708"/>
				<updated>2008-04-29T13:03:10Z</updated>
		
		<summary type="html">&lt;p&gt;AndreaSgarlata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Il sistema attualmente è composto da un plugin che si occupa di inviare i dati tramite pipe ad un altro modulo che fa parte dell'intero sistema di BCI2000.&lt;br /&gt;
&lt;br /&gt;
Per ottenere una corretta temporizzazione del sistema di BCI2000 abbiamo sfruttato il fatto che il plugin è più lento nell'invio dei dati rispetto all'intero sistema BCI2000.&lt;br /&gt;
Infatti si è deciso di inviare tramite plugin una quantità di dati costante pari a 1/16 di secondo, nonostante che, i dati ricevuti dal plugin non sono un valore costante ma variabile intorno ad un certo valore medio, monitorando nel frattempo l'accumulo medio di campioni. &lt;br /&gt;
In questo modo ogni invio di dati rappresenta il trascorrere di un tempo prefissato che è in media è 1/16 di secondo.&lt;br /&gt;
&lt;br /&gt;
Test effettuato:&lt;br /&gt;
- freq. campionamento: 128Hz&lt;br /&gt;
&lt;br /&gt;
- numero campioni per blocco dati da 1/16 di secondo: 8&lt;br /&gt;
&lt;br /&gt;
- visualizzazione accumulo medio ogni 10 chiamate al plugin&lt;br /&gt;
&lt;br /&gt;
- visualizzazione numero blocchi di dati inviati ogni 10 chiamate&lt;br /&gt;
&lt;br /&gt;
Risultati:&lt;br /&gt;
&lt;br /&gt;
[[Image:plugin.jpg]]&lt;br /&gt;
&lt;br /&gt;
- come mostrato in figura si può vedere che l'accumulo medio varia da 1 a 0 campioni (accumulo calcolato come il numero di campioni rimanenti in memoria dopo l'invio di un blocco dati)&lt;br /&gt;
- il numero di blocchi inviati varia da 1 a 2 blocchi con una media di blocchi ogni 10 chiamate leggermente inferiore a 2 (nella schermata specifica 1.71). Nell'esempio sono stati inviati circa 14 campioni che equivalgono circa a 109 msec di dati.&lt;br /&gt;
&lt;br /&gt;
- il variare del numero di blocchi inviati dipende dall'accumulo verificatosi nelle chiamate precedenti e dal fatto che al plugin non arriva una quantità di dati costanti.&lt;br /&gt;
&lt;br /&gt;
Possiamo affermare comunque che sfruttando l'invio di una quantità di dati costanti, rappresentanti un certo intervallo di tempo, si riesce ad ottenere una temporizzazione dell'intero sistema BCI2000 che in media si posiziona nell'intorno della temporizzazione dettata dal plugin che è di 1/16 di secondo per ogni blocco dati processato.&lt;/div&gt;</summary>
		<author><name>AndreaSgarlata</name></author>	</entry>

	<entry>
		<id>https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2707</id>
		<title>Talk:Online P300 and ErrP recognition with BCI2000</title>
		<link rel="alternate" type="text/html" href="https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2707"/>
				<updated>2008-04-29T12:50:43Z</updated>
		
		<summary type="html">&lt;p&gt;AndreaSgarlata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Il sistema attualmente è composto da un plugin che si occupa di inviare i dati tramite pipe ad un altro modulo che fa parte dell'intero sistema di BCI2000.&lt;br /&gt;
&lt;br /&gt;
Per ottenere una corretta temporizzazione del sistema di BCI2000 abbiamo sfruttato il fatto che il plugin è più lento nell'invio dei dati rispetto all'intero sistema BCI2000.&lt;br /&gt;
Infatti si è deciso di inviare tramite plugin una quantità di dati costante pari a 1/16 di secondo, nonostante che, i dati ricevuti dal plugin non sono un valore costante ma variabile intorno ad un certo valore medio, monitorando nel frattempo l'accumulo medio di campioni. &lt;br /&gt;
In questo modo ogni invio di dati rappresenta il trascorrere di un tempo prefissato che è in media è 1/16 di secondo.&lt;br /&gt;
&lt;br /&gt;
Test effettuato:&lt;br /&gt;
- freq. campionamento: 128Hz&lt;br /&gt;
- numero campioni per blocco dati da 1/16 di secondo: 8&lt;br /&gt;
- visualizzazione accumulo medio ogni 10 chiamate al plugin&lt;br /&gt;
- visualizzazione numero blocchi di dati inviati ogni 10 chiamate&lt;br /&gt;
&lt;br /&gt;
Risultati:&lt;br /&gt;
&lt;br /&gt;
[[Image:plugin.jpg]]&lt;br /&gt;
&lt;br /&gt;
- come mostrato in figura si può vedere che l'accumulo medio varia da 1 a 0 campioni (accumulo calcolato come il numero di campioni rimanenti in memoria dopo l'invio di un blocco dati)&lt;br /&gt;
- il numero di blocchi inviati varia da 1 a 2 blocchi con una media di blocchi ogni 10 chiamate leggermente inferiore a 2 (nella schermata specifica 1.71). Nell'esempio sono stati inviati circa 14 campioni che equivalgono circa a 109 msec di dati.&lt;br /&gt;
&lt;br /&gt;
- il variare del numero di blocchi inviati dipende dall'accumulo verificatosi nelle chiamate precedenti e dal fatto che al plugin non arriva una quantità di dati costanti.&lt;br /&gt;
&lt;br /&gt;
Possiamo affermare comunque che sfruttando l'invio di una quantità di dati costanti, rappresentanti un certo intervallo di tempo, si riesce ad ottenere una temporizzazione dell'intero sistema BCI2000 che in media si posiziona nell'intorno della temporizzazione dettata dal plugin che è di 1/16 di secondo per ogni blocco dati processato.&lt;/div&gt;</summary>
		<author><name>AndreaSgarlata</name></author>	</entry>

	<entry>
		<id>https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2706</id>
		<title>Talk:Online P300 and ErrP recognition with BCI2000</title>
		<link rel="alternate" type="text/html" href="https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2706"/>
				<updated>2008-04-29T12:47:17Z</updated>
		
		<summary type="html">&lt;p&gt;AndreaSgarlata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Il sistema attualmente è composto da un plugin che si occupa di inviare i dati tramite pipe ad un altro modulo che fa parte dell'intero sistema di BCI2000.&lt;br /&gt;
&lt;br /&gt;
Per ottenere una corretta temporizzazione del sistema di BCI2000 abbiamo sfruttato il fatto che il plugin è più lento nell'invio dei dati rispetto all'intero sistema BCI2000.&lt;br /&gt;
Infatti si è deciso di inviare tramite plugin una quantità di dati costante pari a 1/16 di secondo, nonostante che, i dati ricevuti dal plugin non sono un valore costante ma variabile intorno ad un certo valore medio, monitorando nel frattempo l'accumulo medio di campioni. &lt;br /&gt;
In questo modo ogni invio di dati rappresenta il trascorrere di un tempo prefissato che è in media è 1/16 di secondo.&lt;br /&gt;
&lt;br /&gt;
Test effettuato:&lt;br /&gt;
- freq. campionamento: 128Hz&lt;br /&gt;
- numero campioni per blocco dati da 1/16 di secondo: 8&lt;br /&gt;
- visualizzazione accumulo medio ogni 10 chiamate al plugin&lt;br /&gt;
- visualizzazione numero blocchi di dati inviati ogni 10 chiamate&lt;br /&gt;
&lt;br /&gt;
Risultati:&lt;br /&gt;
&lt;br /&gt;
[[Image:plugin.jpg]]&lt;br /&gt;
&lt;br /&gt;
- come mostrato in figura si può vedere che l'accumulo medio varia da 1 a 0 campioni (accumulo calcolato come il numero di campioni rimanenti in memoria dopo l'invio di un blocco dati)&lt;br /&gt;
- il numero di blocchi inviati varia da 1 a 2 blocchi con una media di blocchi ogni 10 chiamate leggermente inferiore a 2 (nella schermata specifica 1.71), quindi sono stati inviati circa 14 campioni che equivalgono circa a 109 msec di dati.&lt;br /&gt;
- il variare del numero di blocchi inviati dipende dall'accumulo verificatosi nelle chiamate precedenti e dal fatto che al plugin non arriva una quantità di dati costanti.&lt;br /&gt;
&lt;br /&gt;
Possiamo affermare comunque che sfruttando l'invio di una quantità di dati costanti, rappresentanti un certo intervallo di tempo, si riesce ad ottenere una temporizzazione dell'intero sistema BCI2000 che in media si posiziona nell'intorno della temporizzazione dettata dal plugin che è di 1/16 di secondo per ogni blocco dati processato.&lt;/div&gt;</summary>
		<author><name>AndreaSgarlata</name></author>	</entry>

	<entry>
		<id>https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2705</id>
		<title>Talk:Online P300 and ErrP recognition with BCI2000</title>
		<link rel="alternate" type="text/html" href="https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2705"/>
				<updated>2008-04-29T12:47:07Z</updated>
		
		<summary type="html">&lt;p&gt;AndreaSgarlata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Il sistema attualmente è composto da un plugin che si occupa di inviare i dati tramite pipe ad un altro modulo che fa parte dell'intero sistema di BCI2000.&lt;br /&gt;
&lt;br /&gt;
Per ottenere una corretta temporizzazione del sistema di BCI2000 abbiamo sfruttato il fatto che il plugin è più lento nell'invio dei dati rispetto all'intero sistema BCI2000.&lt;br /&gt;
Infatti si è deciso di inviare tramite plugin una quantità di dati costante pari a 1/16 di secondo, nonostante che, i dati ricevuti dal plugin non sono un valore costante ma variabile intorno ad un certo valore medio, monitorando nel frattempo l'accumulo medio di campioni. &lt;br /&gt;
In questo modo ogni invio di dati rappresenta il trascorrere di un tempo prefissato che è in media è 1/16 di secondo.&lt;br /&gt;
&lt;br /&gt;
Test effettuato:&lt;br /&gt;
- freq. campionamento: 128Hz&lt;br /&gt;
- numero campioni per blocco dati da 1/16 di secondo: 8&lt;br /&gt;
- visualizzazione accumulo medio ogni 10 chiamate al plugin&lt;br /&gt;
- visualizzazione numero blocchi di dati inviati ogni 10 chiamate&lt;br /&gt;
&lt;br /&gt;
Risultati:&lt;br /&gt;
[[Image:plugin.jpg]]&lt;br /&gt;
- come mostrato in figura si può vedere che l'accumulo medio varia da 1 a 0 campioni (accumulo calcolato come il numero di campioni rimanenti in memoria dopo l'invio di un blocco dati)&lt;br /&gt;
- il numero di blocchi inviati varia da 1 a 2 blocchi con una media di blocchi ogni 10 chiamate leggermente inferiore a 2 (nella schermata specifica 1.71), quindi sono stati inviati circa 14 campioni che equivalgono circa a 109 msec di dati.&lt;br /&gt;
- il variare del numero di blocchi inviati dipende dall'accumulo verificatosi nelle chiamate precedenti e dal fatto che al plugin non arriva una quantità di dati costanti.&lt;br /&gt;
&lt;br /&gt;
Possiamo affermare comunque che sfruttando l'invio di una quantità di dati costanti, rappresentanti un certo intervallo di tempo, si riesce ad ottenere una temporizzazione dell'intero sistema BCI2000 che in media si posiziona nell'intorno della temporizzazione dettata dal plugin che è di 1/16 di secondo per ogni blocco dati processato.&lt;/div&gt;</summary>
		<author><name>AndreaSgarlata</name></author>	</entry>

	<entry>
		<id>https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2704</id>
		<title>Talk:Online P300 and ErrP recognition with BCI2000</title>
		<link rel="alternate" type="text/html" href="https://airwiki.deib.polimi.it/index.php?title=Talk:Online_P300_and_ErrP_recognition_with_BCI2000&amp;diff=2704"/>
				<updated>2008-04-29T12:46:19Z</updated>
		
		<summary type="html">&lt;p&gt;AndreaSgarlata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Il sistema attualmente è composto da un plugin che si occupa di inviare i dati tramite pipe ad un altro modulo che fa parte dell'intero sistema di BCI2000.&lt;br /&gt;
&lt;br /&gt;
Per ottenere una corretta temporizzazione del sistema di BCI2000 abbiamo sfruttato il fatto che il plugin è più lento nell'invio dei dati rispetto all'intero sistema BCI2000.&lt;br /&gt;
Infatti si è deciso di inviare tramite plugin una quantità di dati costante pari a 1/16 di secondo, nonostante che, i dati ricevuti dal plugin non sono un valore costante ma variabile intorno ad un certo valore medio, monitorando nel frattempo l'accumulo medio di campioni. &lt;br /&gt;
In questo modo ogni invio di dati rappresenta il trascorrere di un tempo prefissato che è in media è 1/16 di secondo.&lt;br /&gt;
&lt;br /&gt;
Test effettuato:&lt;br /&gt;
- freq. campionamento: 128Hz&lt;br /&gt;
- numero campioni per blocco dati da 1/16 di secondo: 8&lt;br /&gt;
- visualizzazione accumulo medio ogni 10 chiamate al plugin&lt;br /&gt;
- visualizzazione numero blocchi di dati inviati ogni 10 chiamate&lt;br /&gt;
&lt;br /&gt;
Risultati:&lt;br /&gt;
&lt;br /&gt;
[[Image:plugin.jpg]]&lt;br /&gt;
&lt;br /&gt;
- come mostrato in figura si può vedere che l'accumulo medio varia da 1 a 0 campioni (accumulo calcolato come il numero di campioni rimanenti in memoria dopo l'invio di un blocco dati)&lt;br /&gt;
- il numero di blocchi inviati varia da 1 a 2 blocchi con una media di blocchi ogni 10 chiamate leggermente inferiore a 2 (nella schermata specifica 1.71), quindi sono stati inviati circa 14 campioni che equivalgono circa a 109 msec di dati.&lt;br /&gt;
- il variare del numero di blocchi inviati dipende dall'accumulo verificatosi nelle chiamate precedenti e dal fatto che al plugin non arriva una quantità di dati costanti.&lt;br /&gt;
&lt;br /&gt;
Possiamo affermare comunque che sfruttando l'invio di una quantità di dati costanti, rappresentanti un certo intervallo di tempo, si riesce ad ottenere una temporizzazione dell'intero sistema BCI2000 che in media si posiziona nell'intorno della temporizzazione dettata dal plugin che è di 1/16 di secondo per ogni blocco dati processato.&lt;/div&gt;</summary>
		<author><name>AndreaSgarlata</name></author>	</entry>

	<entry>
		<id>https://airwiki.deib.polimi.it/index.php?title=File:Plugin.jpg&amp;diff=2703</id>
		<title>File:Plugin.jpg</title>
		<link rel="alternate" type="text/html" href="https://airwiki.deib.polimi.it/index.php?title=File:Plugin.jpg&amp;diff=2703"/>
				<updated>2008-04-29T12:44:24Z</updated>
		
		<summary type="html">&lt;p&gt;AndreaSgarlata: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>AndreaSgarlata</name></author>	</entry>

	</feed>