Audio triggers for EEG system
24 views (last 30 days)
Show older comments
I have 3 scripts that generate 3 different audio files. Each 3 seconds long, with 1 containing white noise in the background and a pulse stimulus, 1 containing white noise in the background and a short pause/gap in the noise, and then the 3rd contains both the gap and the pulse.
I then have a 4th script that combines these 3 audio files and randomly repeats them as a continuous 8 minute sound file.
I want to add triggers to this so that if I play this audio file while connected to an EEG system triggers will appear to identify the timepoints that each of these individual files occur within the full 8 minute file. The triggers will be sent via a parallel port.
Does anyone know the best way to do this?
Can matlab distinguish the changes in db? I was going to time-lock a trigger to each file but there is a jitter in the 8-minute file so I don’t think this would work.
2 Comments
Taylor
on 17 May 2024
MATLAB can most likely distinguish changes in the audio signal (depending on how large of a spike in amplitude the pulse is). Does your amplifier have and analog or audio in? It might just be easier to split your audio signal into this channel so it is time-synced with the EEG data by your recording system. Then you can process it in post to determine the exact timestamps of the pulses/gaps.
Answers (1)
Ayush
on 3 Sep 2024
Hi Nathan,
I understand that you can successfully transmit trigger signals to the EEG system but are encountering challenges with synchronizing these signals with the audio player.
A potential solution is the "two-pointer" algorithm. In this method, one pointer tracks the audio timestamps while the other tracks the stimulus timestamps. This can help ensure that both processes are aligned effectively. This can be achieved by using “tic-toc” functions.
For further clarification, please refer to the code provided below.
% you can replace it with actual data
data = [time_points, stimulus_labels];
[audioData, fs] = audioread('your_audio_file.wav');
audioPlayer = audioplayer(audioData, fs);
play(audioPlayer);
% store the start time of the audio
startTime = tic;
% you can replace it with your actual trigger sending function
sendtrigger = @(trg, port) fprintf('Sending trigger %d to port %d\n', trg, port);
port = BioSemiSerialPort();
ioObj=[]
% if no hardware device is present, alternatively, you can define the port
% and ioObj in a similar way as you did in your code
port = hex2dec('3FB8'); % windows 10
ioObj = io64; %64 bit OS
% Iterate through the time points and stimuli
for i = 1:size(data, 1)
% Get the time point and stimulus
timePoint = data(i, 1);
stimulus = data(i, 2);
% Calculate the delay
delay = timePoint - toc(startTime); % Time to wait until the trigger should be sent
% Wait until it's time to send the trigger
pause(max(0, delay));
% Send the trigger
sendtrigger(stimulus, port);
end
% Ensure that the audio playback is completed
while isplaying(audioPlayer)
% can do additional checks or operations concurrently using similar
% approach as used above
end
stop(audioPlayer);
For further information, you can refer to the following documentation of “tic” and “toc” functions: https://www.mathworks.com/help/matlab/ref/tic.html
Hope it helps!
0 Comments
See Also
Categories
Find more on EEG/MEG/ECoG in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!