
Lab Streaming Layer (LSL) para Sincronização de Múltiplos Fluxos de Dados
Dra. Roshini Randeniya e Lucas Kleine
Atualizado em
17 de mai. de 2024

Lab Streaming Layer (LSL) para Sincronização de Múltiplos Fluxos de Dados
Dra. Roshini Randeniya e Lucas Kleine
Atualizado em
17 de mai. de 2024

Lab Streaming Layer (LSL) para Sincronização de Múltiplos Fluxos de Dados
Dra. Roshini Randeniya e Lucas Kleine
Atualizado em
17 de mai. de 2024
Bem-vindo! Neste tutorial, aprenderemos a usar o Lab Streaming Layer (LSL) no Python para coletar e sincronizar dados de EEG da Emotiv a partir de múltiplos dispositivos. Será necessário um conhecimento básico de programação na linguagem Python.
O que você aprenderá
O que é o Lab Streaming Layer (LSL) e por que os pesquisadores o utilizam
Como coletar dados sincronizados de múltiplos dispositivos de EEG da Emotiv
Como importar e inspecionar os dados coletados
1.1 O que é o LSL e para que ele serve?
O Lab Streaming Layer (LSL) é uma caixa de ferramentas de código aberto que pode ser usada para enviar, receber e sincronizar fluxos de dados neurais, fisiológicos e comportamentais de diversos hardwares de sensores. Dispositivos de detecção corporal e cerebral cada vez mais capazes, precisos e móveis (como os sistemas de EEG da Emotiv) estão levando a neurociência para fora do laboratório e para o mundo dos dados em tempo real. Onde as medições cerebrais, como EEG e MEG, antes estavam confinadas a laboratórios de pesquisa, os dispositivos móveis nos permitem coletar diversos dados em ambientes mais naturalistas e de várias pessoas ao mesmo tempo.
Um pesquisador pode estar interessado na sincronia fisiológica entre duas pessoas que ouvem a mesma música. O LSL pode nos ajudar a coletar dados de dois headsets de EEG separadamente que também estejam sincronizados com a apresentação do som.
Alguns exemplos de outras aplicações do LSL:
Adicionar marcadores de eventos de um experimento a um dado de EEG em andamento
Alinhar temporalmente dados de múltiplas fontes para um único participante (ex.: frequência cardíaca, EMG, EEG)
Alinhar temporalmente dados de múltiplos participantes (ex.: Estudos de Hiperscaneamento por EEG)
1.2 Como o LSL funciona?
O Lab Streaming Layer é um protocolo para troca em tempo real de dados de séries temporais entre múltiplos dispositivos. O LSL pode ser implementado usando bibliotecas de código aberto para linguagens de programação como Python, MATLAB, C++, Java e outras.

A funcionalidade principal gira em torno dos fluxos de dados LSL:
1. Um software ou dispositivo de aquisição coleta os dados e cria um fluxo de dados - Os dados fisiológicos podem ser transmitidos para o LSL a partir de dispositivos de gravação de EEG, rastreadores oculares, sistemas de captura de movimento, monitores de frequência cardíaca, etc., incluindo metadados (taxa de amostragem, tipo de dados, informações do canal, etc.) - Marcadores de eventos de experimentos (ex.: usando o PsychoPy) também podem ser enviados como um fluxo de dados usando o LSL
2. O fluxo de dados é publicado na rede - É assim que os dados são enviados usando o LSL; o fluxo de dados é "transmitido" para a rede - Os fluxos publicados ficam disponíveis na rede e podem ser descobertos por outros dispositivos compatíveis com LSL na mesma rede - O LSL atribui a cada bloco de dados ou amostra um carimbo de data/hora (timestamp) baseado em um relógio comum (seguindo o Network Time Protocol) - O fluxo é enviado amostra por amostra (ou bloco por bloco) através de uma "saída" (outlet)
3. Os dispositivos de coleta "assinam" os fluxos de dados - É assim que os dados são recebidos usando o LSL - Os dispositivos de coleta na mesma rede recebem os fluxos de dados publicados por meio de "entradas" (inlets) - Cada entrada recebe as amostras de fluxo e metadados de apenas uma saída
4. Salvar dados - Ao assinar um fluxo de dados, você pode salvá-lo em uma variável na sua linguagem de programação preferida ou usar o software fornecido pelo LSL, o LabRecorder, para salvá-lo em um formato padrão como .xdf.
2.0 Visão geral do tutorial
Neste tutorial, usaremos um exemplo de configuração experimental e guiaremos você através dos passos e do código necessários para implementá-la usando o LSL em Python. Usaremos um script em Python para reproduzir um som enquanto coletamos dados de EEG de duas pessoas que usam headsets da Emotiv. Usaremos dois computadores, cada um executando o EmotivPRO para coletar os dados de EEG e transmitir cada fluxo por meio de uma saída LSL separada. Usaremos uma biblioteca Python para reproduzir um arquivo de áudio e, ao mesmo tempo, enviar um gatilho (trigger) cada vez que o arquivo for iniciado.
PASSOS:
1. Use o EmotivPRO para transmitir dados por meio de saídas LSL que incluam dados de EEG (e/ou movimento, qualidade do contato, qualidade do sinal, etc.) 2. Reproduza uma faixa de áudio usando um script em Python e simultaneamente envie um gatilho por meio de outra LSL. Use o LabRecorder para capturar e salvar todos os três fluxos de dados por meio de uma entrada LSL.

2.1 PASSO 1 - Configuração e instalação
Você precisará de dispositivos de aquisição de dados compatíveis para coletar dados
• Todos os dispositivos de brainware da Emotiv conectam-se ao LSL através do software EmotivPROInstale o EmotivPRO no(s) seu(s) dispositivo(s). Você precisará de uma licença do EmotivPRO válida para usar o LSL.
Instale a biblioteca Python LSL com o seguinte comando:
pip install pylslBaixe o software LabRecorder. Este é um aplicativo simples e gratuito que pode ser executado a partir
da linha de comando ou usando um download autônomoPara o nosso experimento: Instale os pacotes necessários para reproduzir áudio usando Python
pip install sounddevice soundfile
2.2 PASSO 3 - Envie os dados do EmotivPRO através de um fluxo LSL
Localize os "..." no canto superior direito do aplicativo, navegue até Configurações (Settings)
Encontre a seção 'Lab Streaming Layer' e a subseção 'Outlet'
Selecione todos os tipos de dados que você gostaria de transmitir
Selecione o formato dos dados (float de 32 bits ou double de 64-bit)
Selecione se deseja enviar os dados amostra por amostra ou em blocos de amostras
Clique em 'Start' para transmitir um fluxo de dados LSL
2.3 PASSO 4 - Use um script Python para reproduzir áudio e enviar gatilhos
Copie e cole o bloco de código a seguir em um arquivo do Python e salve-o em seu computador.
Localize um arquivo de áudio (idealmente um arquivo .wav) que gostaria de reproduzir e instancie o script alterando a
variávelaudio_filepathpara o caminho do arquivo de áudio no seu computadorAbra um prompt de comando para interagir com a linha de comando e navegue até a pasta onde
seu arquivo Python está armazenadoDigite:
python3 nome_do_arquivo.py
• Dependendo da sua instalação do Python, você pode usarpythonem vez depython3
Nota: Substitua/path/to/audio.wavpelo local do arquivo de áudio que você gostaria de reproduzir durante o seu experimento.
""" LSL Example: Play audio and send a trigger marker <p>Este script cria um fluxo de marcadores LSL, aguarda pelo usuário pressionar<br>ENTER, depois reproduz um arquivo de áudio e envia um marcador que<br>pode ser sincronizado com os dados de EEG coletados através do LabRecorder.<br>"""</p> <p>import sounddevice as sd<br>import soundfile as sf<br>from pylsl import StreamInfo, StreamOutlet</p> <p>def wait_for_keypress():<br>print("Pressione ENTER para iniciar a reprodução de áudio e enviar um marcador LSL.")<br>while True:<br>if input() == "":<br>break</p> <p>def play_audio_and_send_marker(audio_file, outlet):<br>data, fs = sf.read(audio_file)</p> <pre><code>print("Reproduzindo áudio e enviando o marcador LSL...") marker_val = [1] outlet.push_sample(marker_val) sd.play(data, fs) sd.wait() print("A reprodução do áudio terminou.") </code></pre> <p>if <strong>name</strong> == "<strong>main</strong>":</p> <pre><code>info = StreamInfo( name="AudioMarkers", type="Markers", channel_count=1, nominal_srate=0, channel_format="int32", source_id="uniqueMarkerID12345" ) outlet = StreamOutlet(info) while True: wait_for_keypress() audio_filepath = "/path/to/audio.wav" play_audio_and_send_marker( audio_filepath, outlet )</code></pre><h2 dir="auto">2.4 PASSO 5 - Use o LabRecorder para visualizar e salvar todos os fluxos LSL</h2><ol dir="auto"><li data-preset-tag="p"><p>Abra o LabRecorder</p></li><li data-preset-tag="p"><p>Pressione <code>Update</code>. Os fluxos LSL disponíveis devem estar visíveis na lista de fluxos<br>• Você deverá conseguir ver os fluxos de ambos EmotivPROs (normalmente chamados de “Emotiv-<br>DataStream”) e o fluxo de marcadores (chamado “AudioMarkers”)</p></li><li data-preset-tag="p"><p>Clique em <code>Browse</code> para selecionar um local para salvar os dados (e definir outros parâmetros)</p></li><li data-preset-tag="p"><p>Selecione todos os fluxos e pressione <code>Record</code> para iniciar a gravação</p></li></ol><h2 dir="auto">3.0 Trabalhando com os dados</h2><p dir="auto">O LabRecorder gera um arquivo XDF (Extensible Data Format) que contém dados de todos os fluxos. Os arquivos XDF são estruturados em fluxos, cada um com um cabeçalho diferente que descreve o que ele contém (nome do dispositivo, tipo de dados, taxa de amostragem, canais e muito mais). Você pode usar o bloco de código abaixo para abrir seu arquivo XDF e exibir algumas informações básicas.</p><p dir="auto"><strong>Nota: Substitua </strong><code><strong>/caminho/para/o/seu/arquivo.xdf</strong></code><strong> pelo caminho do seu arquivo de saída XDF do LabRecorder.</strong></p><pre data-language="JSX"><code>import pyxdf </code></pre> <p>import mne<br>import matplotlib.pyplot as plt<br>import numpy as np</p> <h1>Insira o caminho para o seu arquivo de saída LSL aqui.</h1> <p>data_path = "/path/to/your/file.xdf"</p> <h1>Carregue o arquivo XDF.</h1> <p>streams, fileheader = pyxdf.load_xdf(data_path)</p> <p>print("Cabeçalho do Arquivo XDF:", fileheader)<br>print("Número de fluxos encontrados:", len(streams))</p> <p>for i, stream in enumerate(streams):<br>print("\nFluxo", i + 1)<br>print("Nome do Fluxo:", stream["info"]["name"][0])<br>print("Tipo de Fluxo:", stream["info"]["type"][0])<br>print("Número de Canais:", stream["info"]["channel_count"][0])</p> <pre><code>sfreq = float(stream["info"]["nominal_srate"][0]) print("Taxa de Amostragem:", sfreq) print("Número de Amostras:", len(stream["time_series"])) print("Primeiros 5 pontos de dados:", stream["time_series"][:5]) channel_names = [ chan["label"][0] for chan in stream["info"]["desc"][0]["channels"][0]["channel"] ] print("Nomes dos Canais:", channel_names) channel_types = "eeg"</code></pre><h3 dir="auto"><br></h3><h2 dir="auto">4.0 Recursos Adicionais</h2><h4 dir="auto">Documentação Oficial</h4><ol dir="auto"><li data-preset-tag="p"><p>Confira a <a href="1. Check out the online documentation, including the official README file on GitHub 2. Additional resources: • Code to run LSL using Emotiv’s devices, with example scripts • Useful LSL demo on YouTube • SCCN LSL GitHub repository for all associated libraries • LSL GitHub repository for a collection a submodules and apps 3. HyPyP analysis pipeline for Hyperscanning studies" target="_blank">documentação online</a>, incluindo o <a href="https://github.com/sccn/labstreaminglayer/" target="_blank">arquivo README oficial no GitHub</a></p></li><li data-preset-tag="p"><p>Recursos adicionais:<br>• <a href="https://github.com/Emotiv/labstreaminglayer" target="_blank">Código</a> para executar LSL usando os dispositivos da Emotiv, com scripts de exemplo<br>• Demonstração útil do <a href="https://www.youtube.com/watch?v=Y1at7yrcFW0&list=PLVnr33MP5RMRhGwY36zHHDOmAaYTB138D" target="_blank">LSL no YouTube</a><br>• <a href="https://github.com/sccn/labstreaminglayer" target="_blank">Repositório do SCCN LSL no GitHub</a> para todas as bibliotecas associadas<br>• <a href="https://github.com/labstreaminglayer" target="_blank">Repositório do LSL no GitHub</a> para uma coleção de submódulos e aplicativos</p></li><li data-preset-tag="p"><p><a href="https://academic.oup.com/scan/article/16/1-2/72/5919711?login=false" target="_blank">Pipeline de análise HyPyP</a> para estudos de Hiperscaneamento</p></li></ol> </code></pre
""" LSL Example: Play audio and send a trigger marker <p>Este script cria um fluxo de marcadores LSL, aguarda pelo usuário pressionar<br>ENTER, depois reproduz um arquivo de áudio e envia um marcador que<br>pode ser sincronizado com os dados de EEG coletados através do LabRecorder.<br>"""</p> <p>import sounddevice as sd<br>import soundfile as sf<br>from pylsl import StreamInfo, StreamOutlet</p> <p>def wait_for_keypress():<br>print("Pressione ENTER para iniciar a reprodução de áudio e enviar um marcador LSL.")<br>while True:<br>if input() == "":<br>break</p> <p>def play_audio_and_send_marker(audio_file, outlet):<br>data, fs = sf.read(audio_file)</p> <pre><code>print("Reproduzindo áudio e enviando o marcador LSL...") marker_val = [1] outlet.push_sample(marker_val) sd.play(data, fs) sd.wait() print("A reprodução do áudio terminou.") </code></pre> <p>if <strong>name</strong> == "<strong>main</strong>":</p> <pre><code>info = StreamInfo( name="AudioMarkers", type="Markers", channel_count=1, nominal_srate=0, channel_format="int32", source_id="uniqueMarkerID12345" ) outlet = StreamOutlet(info) while True: wait_for_keypress() audio_filepath = "/path/to/audio.wav" play_audio_and_send_marker( audio_filepath, outlet )</code></pre><h2 dir="auto">2.4 PASSO 5 - Use o LabRecorder para visualizar e salvar todos os fluxos LSL</h2><ol dir="auto"><li data-preset-tag="p"><p>Abra o LabRecorder</p></li><li data-preset-tag="p"><p>Pressione <code>Update</code>. Os fluxos LSL disponíveis devem estar visíveis na lista de fluxos<br>• Você deverá conseguir ver os fluxos de ambos EmotivPROs (normalmente chamados de “Emotiv-<br>DataStream”) e o fluxo de marcadores (chamado “AudioMarkers”)</p></li><li data-preset-tag="p"><p>Clique em <code>Browse</code> para selecionar um local para salvar os dados (e definir outros parâmetros)</p></li><li data-preset-tag="p"><p>Selecione todos os fluxos e pressione <code>Record</code> para iniciar a gravação</p></li></ol><h2 dir="auto">3.0 Trabalhando com os dados</h2><p dir="auto">O LabRecorder gera um arquivo XDF (Extensible Data Format) que contém dados de todos os fluxos. Os arquivos XDF são estruturados em fluxos, cada um com um cabeçalho diferente que descreve o que ele contém (nome do dispositivo, tipo de dados, taxa de amostragem, canais e muito mais). Você pode usar o bloco de código abaixo para abrir seu arquivo XDF e exibir algumas informações básicas.</p><p dir="auto"><strong>Nota: Substitua </strong><code><strong>/caminho/para/o/seu/arquivo.xdf</strong></code><strong> pelo caminho do seu arquivo de saída XDF do LabRecorder.</strong></p><pre data-language="JSX"><code>import pyxdf </code></pre> <p>import mne<br>import matplotlib.pyplot as plt<br>import numpy as np</p> <h1>Insira o caminho para o seu arquivo de saída LSL aqui.</h1> <p>data_path = "/path/to/your/file.xdf"</p> <h1>Carregue o arquivo XDF.</h1> <p>streams, fileheader = pyxdf.load_xdf(data_path)</p> <p>print("Cabeçalho do Arquivo XDF:", fileheader)<br>print("Número de fluxos encontrados:", len(streams))</p> <p>for i, stream in enumerate(streams):<br>print("\nFluxo", i + 1)<br>print("Nome do Fluxo:", stream["info"]["name"][0])<br>print("Tipo de Fluxo:", stream["info"]["type"][0])<br>print("Número de Canais:", stream["info"]["channel_count"][0])</p> <pre><code>sfreq = float(stream["info"]["nominal_srate"][0]) print("Taxa de Amostragem:", sfreq) print("Número de Amostras:", len(stream["time_series"])) print("Primeiros 5 pontos de dados:", stream["time_series"][:5]) channel_names = [ chan["label"][0] for chan in stream["info"]["desc"][0]["channels"][0]["channel"] ] print("Nomes dos Canais:", channel_names) channel_types = "eeg"</code></pre><h3 dir="auto"><br></h3><h2 dir="auto">4.0 Recursos Adicionais</h2><h4 dir="auto">Documentação Oficial</h4><ol dir="auto"><li data-preset-tag="p"><p>Confira a <a href="1. Check out the online documentation, including the official README file on GitHub 2. Additional resources: • Code to run LSL using Emotiv’s devices, with example scripts • Useful LSL demo on YouTube • SCCN LSL GitHub repository for all associated libraries • LSL GitHub repository for a collection a submodules and apps 3. HyPyP analysis pipeline for Hyperscanning studies" target="_blank">documentação online</a>, incluindo o <a href="https://github.com/sccn/labstreaminglayer/" target="_blank">arquivo README oficial no GitHub</a></p></li><li data-preset-tag="p"><p>Recursos adicionais:<br>• <a href="https://github.com/Emotiv/labstreaminglayer" target="_blank">Código</a> para executar LSL usando os dispositivos da Emotiv, com scripts de exemplo<br>• Demonstração útil do <a href="https://www.youtube.com/watch?v=Y1at7yrcFW0&list=PLVnr33MP5RMRhGwY36zHHDOmAaYTB138D" target="_blank">LSL no YouTube</a><br>• <a href="https://github.com/sccn/labstreaminglayer" target="_blank">Repositório do SCCN LSL no GitHub</a> para todas as bibliotecas associadas<br>• <a href="https://github.com/labstreaminglayer" target="_blank">Repositório do LSL no GitHub</a> para uma coleção de submódulos e aplicativos</p></li><li data-preset-tag="p"><p><a href="https://academic.oup.com/scan/article/16/1-2/72/5919711?login=false" target="_blank">Pipeline de análise HyPyP</a> para estudos de Hiperscaneamento</p></li></ol> </code></pre
""" LSL Example: Play audio and send a trigger marker <p>Este script cria um fluxo de marcadores LSL, aguarda pelo usuário pressionar<br>ENTER, depois reproduz um arquivo de áudio e envia um marcador que<br>pode ser sincronizado com os dados de EEG coletados através do LabRecorder.<br>"""</p> <p>import sounddevice as sd<br>import soundfile as sf<br>from pylsl import StreamInfo, StreamOutlet</p> <p>def wait_for_keypress():<br>print("Pressione ENTER para iniciar a reprodução de áudio e enviar um marcador LSL.")<br>while True:<br>if input() == "":<br>break</p> <p>def play_audio_and_send_marker(audio_file, outlet):<br>data, fs = sf.read(audio_file)</p> <pre><code>print("Reproduzindo áudio e enviando o marcador LSL...") marker_val = [1] outlet.push_sample(marker_val) sd.play(data, fs) sd.wait() print("A reprodução do áudio terminou.") </code></pre> <p>if <strong>name</strong> == "<strong>main</strong>":</p> <pre><code>info = StreamInfo( name="AudioMarkers", type="Markers", channel_count=1, nominal_srate=0, channel_format="int32", source_id="uniqueMarkerID12345" ) outlet = StreamOutlet(info) while True: wait_for_keypress() audio_filepath = "/path/to/audio.wav" play_audio_and_send_marker( audio_filepath, outlet )</code></pre><h2 dir="auto">2.4 PASSO 5 - Use o LabRecorder para visualizar e salvar todos os fluxos LSL</h2><ol dir="auto"><li data-preset-tag="p"><p>Abra o LabRecorder</p></li><li data-preset-tag="p"><p>Pressione <code>Update</code>. Os fluxos LSL disponíveis devem estar visíveis na lista de fluxos<br>• Você deverá conseguir ver os fluxos de ambos EmotivPROs (normalmente chamados de “Emotiv-<br>DataStream”) e o fluxo de marcadores (chamado “AudioMarkers”)</p></li><li data-preset-tag="p"><p>Clique em <code>Browse</code> para selecionar um local para salvar os dados (e definir outros parâmetros)</p></li><li data-preset-tag="p"><p>Selecione todos os fluxos e pressione <code>Record</code> para iniciar a gravação</p></li></ol><h2 dir="auto">3.0 Trabalhando com os dados</h2><p dir="auto">O LabRecorder gera um arquivo XDF (Extensible Data Format) que contém dados de todos os fluxos. Os arquivos XDF são estruturados em fluxos, cada um com um cabeçalho diferente que descreve o que ele contém (nome do dispositivo, tipo de dados, taxa de amostragem, canais e muito mais). Você pode usar o bloco de código abaixo para abrir seu arquivo XDF e exibir algumas informações básicas.</p><p dir="auto"><strong>Nota: Substitua </strong><code><strong>/caminho/para/o/seu/arquivo.xdf</strong></code><strong> pelo caminho do seu arquivo de saída XDF do LabRecorder.</strong></p><pre data-language="JSX"><code>import pyxdf </code></pre> <p>import mne<br>import matplotlib.pyplot as plt<br>import numpy as np</p> <h1>Insira o caminho para o seu arquivo de saída LSL aqui.</h1> <p>data_path = "/path/to/your/file.xdf"</p> <h1>Carregue o arquivo XDF.</h1> <p>streams, fileheader = pyxdf.load_xdf(data_path)</p> <p>print("Cabeçalho do Arquivo XDF:", fileheader)<br>print("Número de fluxos encontrados:", len(streams))</p> <p>for i, stream in enumerate(streams):<br>print("\nFluxo", i + 1)<br>print("Nome do Fluxo:", stream["info"]["name"][0])<br>print("Tipo de Fluxo:", stream["info"]["type"][0])<br>print("Número de Canais:", stream["info"]["channel_count"][0])</p> <pre><code>sfreq = float(stream["info"]["nominal_srate"][0]) print("Taxa de Amostragem:", sfreq) print("Número de Amostras:", len(stream["time_series"])) print("Primeiros 5 pontos de dados:", stream["time_series"][:5]) channel_names = [ chan["label"][0] for chan in stream["info"]["desc"][0]["channels"][0]["channel"] ] print("Nomes dos Canais:", channel_names) channel_types = "eeg"</code></pre><h3 dir="auto"><br></h3><h2 dir="auto">4.0 Recursos Adicionais</h2><h4 dir="auto">Documentação Oficial</h4><ol dir="auto"><li data-preset-tag="p"><p>Confira a <a href="1. Check out the online documentation, including the official README file on GitHub 2. Additional resources: • Code to run LSL using Emotiv’s devices, with example scripts • Useful LSL demo on YouTube • SCCN LSL GitHub repository for all associated libraries • LSL GitHub repository for a collection a submodules and apps 3. HyPyP analysis pipeline for Hyperscanning studies" target="_blank">documentação online</a>, incluindo o <a href="https://github.com/sccn/labstreaminglayer/" target="_blank">arquivo README oficial no GitHub</a></p></li><li data-preset-tag="p"><p>Recursos adicionais:<br>• <a href="https://github.com/Emotiv/labstreaminglayer" target="_blank">Código</a> para executar LSL usando os dispositivos da Emotiv, com scripts de exemplo<br>• Demonstração útil do <a href="https://www.youtube.com/watch?v=Y1at7yrcFW0&list=PLVnr33MP5RMRhGwY36zHHDOmAaYTB138D" target="_blank">LSL no YouTube</a><br>• <a href="https://github.com/sccn/labstreaminglayer" target="_blank">Repositório do SCCN LSL no GitHub</a> para todas as bibliotecas associadas<br>• <a href="https://github.com/labstreaminglayer" target="_blank">Repositório do LSL no GitHub</a> para uma coleção de submódulos e aplicativos</p></li><li data-preset-tag="p"><p><a href="https://academic.oup.com/scan/article/16/1-2/72/5919711?login=false" target="_blank">Pipeline de análise HyPyP</a> para estudos de Hiperscaneamento</p></li></ol> </code></pre
Bem-vindo! Neste tutorial, aprenderemos a usar o Lab Streaming Layer (LSL) no Python para coletar e sincronizar dados de EEG da Emotiv a partir de múltiplos dispositivos. Será necessário um conhecimento básico de programação na linguagem Python.
O que você aprenderá
O que é o Lab Streaming Layer (LSL) e por que os pesquisadores o utilizam
Como coletar dados sincronizados de múltiplos dispositivos de EEG da Emotiv
Como importar e inspecionar os dados coletados
1.1 O que é o LSL e para que ele serve?
O Lab Streaming Layer (LSL) é uma caixa de ferramentas de código aberto que pode ser usada para enviar, receber e sincronizar fluxos de dados neurais, fisiológicos e comportamentais de diversos hardwares de sensores. Dispositivos de detecção corporal e cerebral cada vez mais capazes, precisos e móveis (como os sistemas de EEG da Emotiv) estão levando a neurociência para fora do laboratório e para o mundo dos dados em tempo real. Onde as medições cerebrais, como EEG e MEG, antes estavam confinadas a laboratórios de pesquisa, os dispositivos móveis nos permitem coletar diversos dados em ambientes mais naturalistas e de várias pessoas ao mesmo tempo.
Um pesquisador pode estar interessado na sincronia fisiológica entre duas pessoas que ouvem a mesma música. O LSL pode nos ajudar a coletar dados de dois headsets de EEG separadamente que também estejam sincronizados com a apresentação do som.
Alguns exemplos de outras aplicações do LSL:
Adicionar marcadores de eventos de um experimento a um dado de EEG em andamento
Alinhar temporalmente dados de múltiplas fontes para um único participante (ex.: frequência cardíaca, EMG, EEG)
Alinhar temporalmente dados de múltiplos participantes (ex.: Estudos de Hiperscaneamento por EEG)
1.2 Como o LSL funciona?
O Lab Streaming Layer é um protocolo para troca em tempo real de dados de séries temporais entre múltiplos dispositivos. O LSL pode ser implementado usando bibliotecas de código aberto para linguagens de programação como Python, MATLAB, C++, Java e outras.

A funcionalidade principal gira em torno dos fluxos de dados LSL:
1. Um software ou dispositivo de aquisição coleta os dados e cria um fluxo de dados - Os dados fisiológicos podem ser transmitidos para o LSL a partir de dispositivos de gravação de EEG, rastreadores oculares, sistemas de captura de movimento, monitores de frequência cardíaca, etc., incluindo metadados (taxa de amostragem, tipo de dados, informações do canal, etc.) - Marcadores de eventos de experimentos (ex.: usando o PsychoPy) também podem ser enviados como um fluxo de dados usando o LSL
2. O fluxo de dados é publicado na rede - É assim que os dados são enviados usando o LSL; o fluxo de dados é "transmitido" para a rede - Os fluxos publicados ficam disponíveis na rede e podem ser descobertos por outros dispositivos compatíveis com LSL na mesma rede - O LSL atribui a cada bloco de dados ou amostra um carimbo de data/hora (timestamp) baseado em um relógio comum (seguindo o Network Time Protocol) - O fluxo é enviado amostra por amostra (ou bloco por bloco) através de uma "saída" (outlet)
3. Os dispositivos de coleta "assinam" os fluxos de dados - É assim que os dados são recebidos usando o LSL - Os dispositivos de coleta na mesma rede recebem os fluxos de dados publicados por meio de "entradas" (inlets) - Cada entrada recebe as amostras de fluxo e metadados de apenas uma saída
4. Salvar dados - Ao assinar um fluxo de dados, você pode salvá-lo em uma variável na sua linguagem de programação preferida ou usar o software fornecido pelo LSL, o LabRecorder, para salvá-lo em um formato padrão como .xdf.
2.0 Visão geral do tutorial
Neste tutorial, usaremos um exemplo de configuração experimental e guiaremos você através dos passos e do código necessários para implementá-la usando o LSL em Python. Usaremos um script em Python para reproduzir um som enquanto coletamos dados de EEG de duas pessoas que usam headsets da Emotiv. Usaremos dois computadores, cada um executando o EmotivPRO para coletar os dados de EEG e transmitir cada fluxo por meio de uma saída LSL separada. Usaremos uma biblioteca Python para reproduzir um arquivo de áudio e, ao mesmo tempo, enviar um gatilho (trigger) cada vez que o arquivo for iniciado.
PASSOS:
1. Use o EmotivPRO para transmitir dados por meio de saídas LSL que incluam dados de EEG (e/ou movimento, qualidade do contato, qualidade do sinal, etc.) 2. Reproduza uma faixa de áudio usando um script em Python e simultaneamente envie um gatilho por meio de outra LSL. Use o LabRecorder para capturar e salvar todos os três fluxos de dados por meio de uma entrada LSL.

2.1 PASSO 1 - Configuração e instalação
Você precisará de dispositivos de aquisição de dados compatíveis para coletar dados
• Todos os dispositivos de brainware da Emotiv conectam-se ao LSL através do software EmotivPROInstale o EmotivPRO no(s) seu(s) dispositivo(s). Você precisará de uma licença do EmotivPRO válida para usar o LSL.
Instale a biblioteca Python LSL com o seguinte comando:
pip install pylslBaixe o software LabRecorder. Este é um aplicativo simples e gratuito que pode ser executado a partir
da linha de comando ou usando um download autônomoPara o nosso experimento: Instale os pacotes necessários para reproduzir áudio usando Python
pip install sounddevice soundfile
2.2 PASSO 3 - Envie os dados do EmotivPRO através de um fluxo LSL
Localize os "..." no canto superior direito do aplicativo, navegue até Configurações (Settings)
Encontre a seção 'Lab Streaming Layer' e a subseção 'Outlet'
Selecione todos os tipos de dados que você gostaria de transmitir
Selecione o formato dos dados (float de 32 bits ou double de 64-bit)
Selecione se deseja enviar os dados amostra por amostra ou em blocos de amostras
Clique em 'Start' para transmitir um fluxo de dados LSL
2.3 PASSO 4 - Use um script Python para reproduzir áudio e enviar gatilhos
Copie e cole o bloco de código a seguir em um arquivo do Python e salve-o em seu computador.
Localize um arquivo de áudio (idealmente um arquivo .wav) que gostaria de reproduzir e instancie o script alterando a
variávelaudio_filepathpara o caminho do arquivo de áudio no seu computadorAbra um prompt de comando para interagir com a linha de comando e navegue até a pasta onde
seu arquivo Python está armazenadoDigite:
python3 nome_do_arquivo.py
• Dependendo da sua instalação do Python, você pode usarpythonem vez depython3
Nota: Substitua/path/to/audio.wavpelo local do arquivo de áudio que você gostaria de reproduzir durante o seu experimento.
""" LSL Example: Play audio and send a trigger marker <p>Este script cria um fluxo de marcadores LSL, aguarda pelo usuário pressionar<br>ENTER, depois reproduz um arquivo de áudio e envia um marcador que<br>pode ser sincronizado com os dados de EEG coletados através do LabRecorder.<br>"""</p> <p>import sounddevice as sd<br>import soundfile as sf<br>from pylsl import StreamInfo, StreamOutlet</p> <p>def wait_for_keypress():<br>print("Pressione ENTER para iniciar a reprodução de áudio e enviar um marcador LSL.")<br>while True:<br>if input() == "":<br>break</p> <p>def play_audio_and_send_marker(audio_file, outlet):<br>data, fs = sf.read(audio_file)</p> <pre><code>print("Reproduzindo áudio e enviando o marcador LSL...") marker_val = [1] outlet.push_sample(marker_val) sd.play(data, fs) sd.wait() print("A reprodução do áudio terminou.") </code></pre> <p>if <strong>name</strong> == "<strong>main</strong>":</p> <pre><code>info = StreamInfo( name="AudioMarkers", type="Markers", channel_count=1, nominal_srate=0, channel_format="int32", source_id="uniqueMarkerID12345" ) outlet = StreamOutlet(info) while True: wait_for_keypress() audio_filepath = "/path/to/audio.wav" play_audio_and_send_marker( audio_filepath, outlet )</code></pre><h2 dir="auto">2.4 PASSO 5 - Use o LabRecorder para visualizar e salvar todos os fluxos LSL</h2><ol dir="auto"><li data-preset-tag="p"><p>Abra o LabRecorder</p></li><li data-preset-tag="p"><p>Pressione <code>Update</code>. Os fluxos LSL disponíveis devem estar visíveis na lista de fluxos<br>• Você deverá conseguir ver os fluxos de ambos EmotivPROs (normalmente chamados de “Emotiv-<br>DataStream”) e o fluxo de marcadores (chamado “AudioMarkers”)</p></li><li data-preset-tag="p"><p>Clique em <code>Browse</code> para selecionar um local para salvar os dados (e definir outros parâmetros)</p></li><li data-preset-tag="p"><p>Selecione todos os fluxos e pressione <code>Record</code> para iniciar a gravação</p></li></ol><h2 dir="auto">3.0 Trabalhando com os dados</h2><p dir="auto">O LabRecorder gera um arquivo XDF (Extensible Data Format) que contém dados de todos os fluxos. Os arquivos XDF são estruturados em fluxos, cada um com um cabeçalho diferente que descreve o que ele contém (nome do dispositivo, tipo de dados, taxa de amostragem, canais e muito mais). Você pode usar o bloco de código abaixo para abrir seu arquivo XDF e exibir algumas informações básicas.</p><p dir="auto"><strong>Nota: Substitua </strong><code><strong>/caminho/para/o/seu/arquivo.xdf</strong></code><strong> pelo caminho do seu arquivo de saída XDF do LabRecorder.</strong></p><pre data-language="JSX"><code>import pyxdf </code></pre> <p>import mne<br>import matplotlib.pyplot as plt<br>import numpy as np</p> <h1>Insira o caminho para o seu arquivo de saída LSL aqui.</h1> <p>data_path = "/path/to/your/file.xdf"</p> <h1>Carregue o arquivo XDF.</h1> <p>streams, fileheader = pyxdf.load_xdf(data_path)</p> <p>print("Cabeçalho do Arquivo XDF:", fileheader)<br>print("Número de fluxos encontrados:", len(streams))</p> <p>for i, stream in enumerate(streams):<br>print("\nFluxo", i + 1)<br>print("Nome do Fluxo:", stream["info"]["name"][0])<br>print("Tipo de Fluxo:", stream["info"]["type"][0])<br>print("Número de Canais:", stream["info"]["channel_count"][0])</p> <pre><code>sfreq = float(stream["info"]["nominal_srate"][0]) print("Taxa de Amostragem:", sfreq) print("Número de Amostras:", len(stream["time_series"])) print("Primeiros 5 pontos de dados:", stream["time_series"][:5]) channel_names = [ chan["label"][0] for chan in stream["info"]["desc"][0]["channels"][0]["channel"] ] print("Nomes dos Canais:", channel_names) channel_types = "eeg"</code></pre><h3 dir="auto"><br></h3><h2 dir="auto">4.0 Recursos Adicionais</h2><h4 dir="auto">Documentação Oficial</h4><ol dir="auto"><li data-preset-tag="p"><p>Confira a <a href="1. Check out the online documentation, including the official README file on GitHub 2. Additional resources: • Code to run LSL using Emotiv’s devices, with example scripts • Useful LSL demo on YouTube • SCCN LSL GitHub repository for all associated libraries • LSL GitHub repository for a collection a submodules and apps 3. HyPyP analysis pipeline for Hyperscanning studies" target="_blank">documentação online</a>, incluindo o <a href="https://github.com/sccn/labstreaminglayer/" target="_blank">arquivo README oficial no GitHub</a></p></li><li data-preset-tag="p"><p>Recursos adicionais:<br>• <a href="https://github.com/Emotiv/labstreaminglayer" target="_blank">Código</a> para executar LSL usando os dispositivos da Emotiv, com scripts de exemplo<br>• Demonstração útil do <a href="https://www.youtube.com/watch?v=Y1at7yrcFW0&list=PLVnr33MP5RMRhGwY36zHHDOmAaYTB138D" target="_blank">LSL no YouTube</a><br>• <a href="https://github.com/sccn/labstreaminglayer" target="_blank">Repositório do SCCN LSL no GitHub</a> para todas as bibliotecas associadas<br>• <a href="https://github.com/labstreaminglayer" target="_blank">Repositório do LSL no GitHub</a> para uma coleção de submódulos e aplicativos</p></li><li data-preset-tag="p"><p><a href="https://academic.oup.com/scan/article/16/1-2/72/5919711?login=false" target="_blank">Pipeline de análise HyPyP</a> para estudos de Hiperscaneamento</p></li></ol> </code></pre
Bem-vindo! Neste tutorial, aprenderemos a usar o Lab Streaming Layer (LSL) no Python para coletar e sincronizar dados de EEG da Emotiv a partir de múltiplos dispositivos. Será necessário um conhecimento básico de programação na linguagem Python.
O que você aprenderá
O que é o Lab Streaming Layer (LSL) e por que os pesquisadores o utilizam
Como coletar dados sincronizados de múltiplos dispositivos de EEG da Emotiv
Como importar e inspecionar os dados coletados
1.1 O que é o LSL e para que ele serve?
O Lab Streaming Layer (LSL) é uma caixa de ferramentas de código aberto que pode ser usada para enviar, receber e sincronizar fluxos de dados neurais, fisiológicos e comportamentais de diversos hardwares de sensores. Dispositivos de detecção corporal e cerebral cada vez mais capazes, precisos e móveis (como os sistemas de EEG da Emotiv) estão levando a neurociência para fora do laboratório e para o mundo dos dados em tempo real. Onde as medições cerebrais, como EEG e MEG, antes estavam confinadas a laboratórios de pesquisa, os dispositivos móveis nos permitem coletar diversos dados em ambientes mais naturalistas e de várias pessoas ao mesmo tempo.
Um pesquisador pode estar interessado na sincronia fisiológica entre duas pessoas que ouvem a mesma música. O LSL pode nos ajudar a coletar dados de dois headsets de EEG separadamente que também estejam sincronizados com a apresentação do som.
Alguns exemplos de outras aplicações do LSL:
Adicionar marcadores de eventos de um experimento a um dado de EEG em andamento
Alinhar temporalmente dados de múltiplas fontes para um único participante (ex.: frequência cardíaca, EMG, EEG)
Alinhar temporalmente dados de múltiplos participantes (ex.: Estudos de Hiperscaneamento por EEG)
1.2 Como o LSL funciona?
O Lab Streaming Layer é um protocolo para troca em tempo real de dados de séries temporais entre múltiplos dispositivos. O LSL pode ser implementado usando bibliotecas de código aberto para linguagens de programação como Python, MATLAB, C++, Java e outras.

A funcionalidade principal gira em torno dos fluxos de dados LSL:
1. Um software ou dispositivo de aquisição coleta os dados e cria um fluxo de dados - Os dados fisiológicos podem ser transmitidos para o LSL a partir de dispositivos de gravação de EEG, rastreadores oculares, sistemas de captura de movimento, monitores de frequência cardíaca, etc., incluindo metadados (taxa de amostragem, tipo de dados, informações do canal, etc.) - Marcadores de eventos de experimentos (ex.: usando o PsychoPy) também podem ser enviados como um fluxo de dados usando o LSL
2. O fluxo de dados é publicado na rede - É assim que os dados são enviados usando o LSL; o fluxo de dados é "transmitido" para a rede - Os fluxos publicados ficam disponíveis na rede e podem ser descobertos por outros dispositivos compatíveis com LSL na mesma rede - O LSL atribui a cada bloco de dados ou amostra um carimbo de data/hora (timestamp) baseado em um relógio comum (seguindo o Network Time Protocol) - O fluxo é enviado amostra por amostra (ou bloco por bloco) através de uma "saída" (outlet)
3. Os dispositivos de coleta "assinam" os fluxos de dados - É assim que os dados são recebidos usando o LSL - Os dispositivos de coleta na mesma rede recebem os fluxos de dados publicados por meio de "entradas" (inlets) - Cada entrada recebe as amostras de fluxo e metadados de apenas uma saída
4. Salvar dados - Ao assinar um fluxo de dados, você pode salvá-lo em uma variável na sua linguagem de programação preferida ou usar o software fornecido pelo LSL, o LabRecorder, para salvá-lo em um formato padrão como .xdf.
2.0 Visão geral do tutorial
Neste tutorial, usaremos um exemplo de configuração experimental e guiaremos você através dos passos e do código necessários para implementá-la usando o LSL em Python. Usaremos um script em Python para reproduzir um som enquanto coletamos dados de EEG de duas pessoas que usam headsets da Emotiv. Usaremos dois computadores, cada um executando o EmotivPRO para coletar os dados de EEG e transmitir cada fluxo por meio de uma saída LSL separada. Usaremos uma biblioteca Python para reproduzir um arquivo de áudio e, ao mesmo tempo, enviar um gatilho (trigger) cada vez que o arquivo for iniciado.
PASSOS:
1. Use o EmotivPRO para transmitir dados por meio de saídas LSL que incluam dados de EEG (e/ou movimento, qualidade do contato, qualidade do sinal, etc.) 2. Reproduza uma faixa de áudio usando um script em Python e simultaneamente envie um gatilho por meio de outra LSL. Use o LabRecorder para capturar e salvar todos os três fluxos de dados por meio de uma entrada LSL.

2.1 PASSO 1 - Configuração e instalação
Você precisará de dispositivos de aquisição de dados compatíveis para coletar dados
• Todos os dispositivos de brainware da Emotiv conectam-se ao LSL através do software EmotivPROInstale o EmotivPRO no(s) seu(s) dispositivo(s). Você precisará de uma licença do EmotivPRO válida para usar o LSL.
Instale a biblioteca Python LSL com o seguinte comando:
pip install pylslBaixe o software LabRecorder. Este é um aplicativo simples e gratuito que pode ser executado a partir
da linha de comando ou usando um download autônomoPara o nosso experimento: Instale os pacotes necessários para reproduzir áudio usando Python
pip install sounddevice soundfile
2.2 PASSO 3 - Envie os dados do EmotivPRO através de um fluxo LSL
Localize os "..." no canto superior direito do aplicativo, navegue até Configurações (Settings)
Encontre a seção 'Lab Streaming Layer' e a subseção 'Outlet'
Selecione todos os tipos de dados que você gostaria de transmitir
Selecione o formato dos dados (float de 32 bits ou double de 64-bit)
Selecione se deseja enviar os dados amostra por amostra ou em blocos de amostras
Clique em 'Start' para transmitir um fluxo de dados LSL
2.3 PASSO 4 - Use um script Python para reproduzir áudio e enviar gatilhos
Copie e cole o bloco de código a seguir em um arquivo do Python e salve-o em seu computador.
Localize um arquivo de áudio (idealmente um arquivo .wav) que gostaria de reproduzir e instancie o script alterando a
variávelaudio_filepathpara o caminho do arquivo de áudio no seu computadorAbra um prompt de comando para interagir com a linha de comando e navegue até a pasta onde
seu arquivo Python está armazenadoDigite:
python3 nome_do_arquivo.py
• Dependendo da sua instalação do Python, você pode usarpythonem vez depython3
Nota: Substitua/path/to/audio.wavpelo local do arquivo de áudio que você gostaria de reproduzir durante o seu experimento.
""" LSL Example: Play audio and send a trigger marker <p>Este script cria um fluxo de marcadores LSL, aguarda pelo usuário pressionar<br>ENTER, depois reproduz um arquivo de áudio e envia um marcador que<br>pode ser sincronizado com os dados de EEG coletados através do LabRecorder.<br>"""</p> <p>import sounddevice as sd<br>import soundfile as sf<br>from pylsl import StreamInfo, StreamOutlet</p> <p>def wait_for_keypress():<br>print("Pressione ENTER para iniciar a reprodução de áudio e enviar um marcador LSL.")<br>while True:<br>if input() == "":<br>break</p> <p>def play_audio_and_send_marker(audio_file, outlet):<br>data, fs = sf.read(audio_file)</p> <pre><code>print("Reproduzindo áudio e enviando o marcador LSL...") marker_val = [1] outlet.push_sample(marker_val) sd.play(data, fs) sd.wait() print("A reprodução do áudio terminou.") </code></pre> <p>if <strong>name</strong> == "<strong>main</strong>":</p> <pre><code>info = StreamInfo( name="AudioMarkers", type="Markers", channel_count=1, nominal_srate=0, channel_format="int32", source_id="uniqueMarkerID12345" ) outlet = StreamOutlet(info) while True: wait_for_keypress() audio_filepath = "/path/to/audio.wav" play_audio_and_send_marker( audio_filepath, outlet )</code></pre><h2 dir="auto">2.4 PASSO 5 - Use o LabRecorder para visualizar e salvar todos os fluxos LSL</h2><ol dir="auto"><li data-preset-tag="p"><p>Abra o LabRecorder</p></li><li data-preset-tag="p"><p>Pressione <code>Update</code>. Os fluxos LSL disponíveis devem estar visíveis na lista de fluxos<br>• Você deverá conseguir ver os fluxos de ambos EmotivPROs (normalmente chamados de “Emotiv-<br>DataStream”) e o fluxo de marcadores (chamado “AudioMarkers”)</p></li><li data-preset-tag="p"><p>Clique em <code>Browse</code> para selecionar um local para salvar os dados (e definir outros parâmetros)</p></li><li data-preset-tag="p"><p>Selecione todos os fluxos e pressione <code>Record</code> para iniciar a gravação</p></li></ol><h2 dir="auto">3.0 Trabalhando com os dados</h2><p dir="auto">O LabRecorder gera um arquivo XDF (Extensible Data Format) que contém dados de todos os fluxos. Os arquivos XDF são estruturados em fluxos, cada um com um cabeçalho diferente que descreve o que ele contém (nome do dispositivo, tipo de dados, taxa de amostragem, canais e muito mais). Você pode usar o bloco de código abaixo para abrir seu arquivo XDF e exibir algumas informações básicas.</p><p dir="auto"><strong>Nota: Substitua </strong><code><strong>/caminho/para/o/seu/arquivo.xdf</strong></code><strong> pelo caminho do seu arquivo de saída XDF do LabRecorder.</strong></p><pre data-language="JSX"><code>import pyxdf </code></pre> <p>import mne<br>import matplotlib.pyplot as plt<br>import numpy as np</p> <h1>Insira o caminho para o seu arquivo de saída LSL aqui.</h1> <p>data_path = "/path/to/your/file.xdf"</p> <h1>Carregue o arquivo XDF.</h1> <p>streams, fileheader = pyxdf.load_xdf(data_path)</p> <p>print("Cabeçalho do Arquivo XDF:", fileheader)<br>print("Número de fluxos encontrados:", len(streams))</p> <p>for i, stream in enumerate(streams):<br>print("\nFluxo", i + 1)<br>print("Nome do Fluxo:", stream["info"]["name"][0])<br>print("Tipo de Fluxo:", stream["info"]["type"][0])<br>print("Número de Canais:", stream["info"]["channel_count"][0])</p> <pre><code>sfreq = float(stream["info"]["nominal_srate"][0]) print("Taxa de Amostragem:", sfreq) print("Número de Amostras:", len(stream["time_series"])) print("Primeiros 5 pontos de dados:", stream["time_series"][:5]) channel_names = [ chan["label"][0] for chan in stream["info"]["desc"][0]["channels"][0]["channel"] ] print("Nomes dos Canais:", channel_names) channel_types = "eeg"</code></pre><h3 dir="auto"><br></h3><h2 dir="auto">4.0 Recursos Adicionais</h2><h4 dir="auto">Documentação Oficial</h4><ol dir="auto"><li data-preset-tag="p"><p>Confira a <a href="1. Check out the online documentation, including the official README file on GitHub 2. Additional resources: • Code to run LSL using Emotiv’s devices, with example scripts • Useful LSL demo on YouTube • SCCN LSL GitHub repository for all associated libraries • LSL GitHub repository for a collection a submodules and apps 3. HyPyP analysis pipeline for Hyperscanning studies" target="_blank">documentação online</a>, incluindo o <a href="https://github.com/sccn/labstreaminglayer/" target="_blank">arquivo README oficial no GitHub</a></p></li><li data-preset-tag="p"><p>Recursos adicionais:<br>• <a href="https://github.com/Emotiv/labstreaminglayer" target="_blank">Código</a> para executar LSL usando os dispositivos da Emotiv, com scripts de exemplo<br>• Demonstração útil do <a href="https://www.youtube.com/watch?v=Y1at7yrcFW0&list=PLVnr33MP5RMRhGwY36zHHDOmAaYTB138D" target="_blank">LSL no YouTube</a><br>• <a href="https://github.com/sccn/labstreaminglayer" target="_blank">Repositório do SCCN LSL no GitHub</a> para todas as bibliotecas associadas<br>• <a href="https://github.com/labstreaminglayer" target="_blank">Repositório do LSL no GitHub</a> para uma coleção de submódulos e aplicativos</p></li><li data-preset-tag="p"><p><a href="https://academic.oup.com/scan/article/16/1-2/72/5919711?login=false" target="_blank">Pipeline de análise HyPyP</a> para estudos de Hiperscaneamento</p></li></ol> </code></pre

Continue lendo