Collecting Continuous Alpha/Beta Data.
I am only asking about this here because the folks on the Brainflow forum could not assist me in this problem. I'm trying to use Alpha/Beta ratio to control a musical algorithm real-time. I need to receive continuous ratio values, so I tried looping the one of the Band Power samples on the Brainflow guide.
import time
from brainflow.board_shim import BoardShim, BrainFlowInputParams, LogLevels, BoardIds
from brainflow.data_filter import DataFilter, WindowOperations, DetrendOperations
def main():
BoardShim.enable_dev_board_logger()
params = BrainFlowInputParams()
board_id = BoardIds.GANGLION_BOARD.value
board_descr = BoardShim.get_board_descr(board_id)
params.serial_port = "COM7"
sampling_rate = int(board_descr['sampling_rate'])
try:
board = BoardShim(board_id, params)
board.prepare_session()
board.start_stream()
while True:
BoardShim.log_message(LogLevels.LEVEL_INFO.value, 'start sleeping in the main thread')
time.sleep(2)
# Fetch data from the board
data = board.get_current_board_data(num_samples=512)
eeg_channels = board.get_eeg_channels(board_id)
eeg_channel = eeg_channels[1]
nfft = min(DataFilter.get_nearest_power_of_two(len(data[eeg_channel])), len(data[eeg_channel]))
DataFilter.detrend(data[eeg_channel], DetrendOperations.LINEAR.value)
psd = DataFilter.get_psd_welch(data[eeg_channel], nfft, nfft // 2, sampling_rate,
WindowOperations.BLACKMAN_HARRIS.value)
# Calculate the band power for alpha (7.0-13.0 Hz) and beta (14.0-30.0 Hz) frequency ranges
freq_start_alpha, freq_end_alpha = 7.0, 13.0
freq_start_beta, freq_end_beta = 14.0, 30.0
band_power_alpha = DataFilter.get_band_power(psd, freq_start_alpha, freq_end_alpha)
band_power_beta = DataFilter.get_band_power(psd, freq_start_beta, freq_end_beta)
# Print or log the ratio
ratio = band_power_alpha / band_power_beta
print("alpha/beta ratio:", ratio)
except Exception as e:
print(f"Error: {e}")
finally:
# Stop the stream and release the session when done
if 'board' in locals() and board.is_prepared():
board.stop_stream()
board.release_session()
if __name__ == "__main__":
main()
Here is the error I am getting. There is no other info in the log:
[2024-01-03 12:42:36.177] [board_logger] [debug] start streaming
[2024-01-03 12:42:36.178] [board_logger] [info] start sleeping in the main thread
[2024-01-03 12:42:38.181] [data_logger] [error] Please review your arguments.
Error: INVALID_ARGUMENTS_ERROR:13 unable to calc psd welch
My thought is that the sleep value (2) is not long enough for the program to calculate the needed values. It works when I make the sleep value 5 seconds. Is there any way I could get it to spit out values quicker?
Comments
I would continue working with Andrey and exploring how to make this work on BrainFlow Slack. This is a very specific question about BrainFlow, and he is the creator. Patience, resilience, and hard work will always end in a good result!