Minimal EEG Acquisition Example#

This is the full MATLAB example file for the low-level real-device acquisition flow.

Download the source: example_minimal_eeg_acquisition.m

example_minimal_eeg_acquisition.m#
function result = example_minimal_eeg_acquisition(device_name, channel_ids, sample_rate_hz, duration_seconds)
%EXAMPLE_MINIMAL_EEG_ACQUISITION Minimal real-device acquisition example.
%
% Usage:
%   example_minimal_eeg_acquisition()
%   example_minimal_eeg_acquisition('BA MINI 001')
%   result = example_minimal_eeg_acquisition('BA MINI 001', [], 250, 5.0)

project_root = fileparts(fileparts(mfilename('fullpath')));
addpath(fullfile(project_root, 'matlab'));

if nargin < 1
    device_name = '';
end
if nargin < 2
    channel_ids = [];
end
if nargin < 3 || isempty(sample_rate_hz)
    sample_rate_hz = 250;
end
if nargin < 4 || isempty(duration_seconds)
    duration_seconds = 5.0;
end

ba_setup();
init_info = ba_init();
cleanup_obj = onCleanup(@() safe_shutdown());
devices = ba_scan();
device_name = resolve_device_name(device_name, devices);

fprintf('Backend ready: %s, Core %s\n', ...
    init_info.backend_variant, init_info.core_version.text);
fprintf('Connecting to %s\n', device_name);

connect_result = ba_connect(device_name);
if ~connect_result.connected
    error('brainaccess:api', 'Connection failed: %s (%s)', ...
        connect_result.message, connect_result.status_name);
end

device_info = ba_get_device_info();
device_features = ba_get_device_features();
channel_ids = resolve_channel_ids(channel_ids, device_features);
fprintf('Connected: %s, serial %.0f, fw %s, hw %s\n', ...
    device_info.device_model.name, ...
    device_info.serial_number, ...
    device_info.firmware_version.text, ...
    device_info.hardware_version.text);
fprintf('Using %d EEG channels.\n', numel(channel_ids));

ba_configure_eeg(channel_ids, sample_rate_hz, 8, []);
ba_start_stream();
pause(2.0);

[data, meta] = ba_collect_seconds(duration_seconds, 250, true);

ba_stop_stream();
ba_disconnect();
ba_close();
clear cleanup_obj

plot_eeg(data, sample_rate_hz, device_name);

result = struct( ...
    'data', data, ...
    'device_features', device_features, ...
    'device_info', device_info, ...
    'device_name', device_name, ...
    'devices', devices, ...
    'init_info', init_info, ...
    'meta', meta);
end

function channel_ids = resolve_channel_ids(channel_ids, device_features)
if ~isempty(channel_ids)
    return;
end

electrode_count = double(device_features.electrode_count);
channel_ids = 0:(electrode_count - 1);
end

function device_name = resolve_device_name(device_name, devices)
if ~isempty(device_name)
    return;
end

device_name = getenv('BA_DEVICE_NAME');
if ~isempty(device_name)
    return;
end

if isempty(devices)
    error('brainaccess:api', ...
        'No devices found. Set BA_DEVICE_NAME or pass a device name explicitly.');
end

device_name = devices(1).name;
end

function plot_eeg(data, sample_rate_hz, device_name)
if isempty(data)
    error('brainaccess:api', 'No samples were collected.');
end

channel_count = size(data, 1);
sample_count = size(data, 2);
time_axis = (0:(sample_count - 1)) / sample_rate_hz;
centered = data - mean(data, 2);
spacing = max(std(centered, 0, 2));
if isempty(spacing) || spacing <= 0
    spacing = 1;
end
offsets = ((channel_count - 1):-1:0)' * spacing * 4;

figure('Name', 'BrainAccess Minimal Acquisition');
plot(time_axis, (centered + offsets)');
xlabel('Time (s)');
ylabel('Amplitude + offset');
title(sprintf('BrainAccess minimal acquisition: %s', device_name));
grid on;
end

function safe_shutdown()
status = ba_status();
if status.streaming
    ba_stop_stream();
end
if status.connected
    ba_disconnect();
end
if status.core_initialized || status.manager_present
    ba_close();
end
end