def filter_data_pre_raw(self, data, fcenter, bandwidth, order, filter_type): """Filters the OpenBCI data using the BrainFlow functions before creating an MNE Raw object. Parameters: data fcenter bandwidth order filter_type Returns: data """ for channel in self.eeg_info[0]: if filter_type == 'bandpass': DataFilter.perform_bandpass(data[channel], self.eeg_info[1], fcenter, bandwidth, order, FilterTypes.BESSEL.value, 0) elif filter_type == 'notch': DataFilter.perform_bandstop(data[channel], self.eeg_info[1], fcenter, bandwidth, order, FilterTypes.BUTTERWORTH.value, 0) elif filter_type == 'highpass': DataFilter.perform_highpass(data[channel], self.eeg_info[1], fcenter, order, FilterTypes.BUTTERWORTH.value, 0) return data
def main(): BoardShim.enable_dev_board_logger() # use synthetic board for demo params = BrainFlowInputParams() board_id = BoardIds.SYNTHETIC_BOARD.value board = BoardShim(board_id, params) board.prepare_session() board.start_stream() BoardShim.log_message(LogLevels.LEVEL_INFO.value, 'start sleeping in the main thread') time.sleep(10) data = board.get_board_data() board.stop_stream() board.release_session() # demo how to convert it to pandas DF and plot data eeg_channels = BoardShim.get_eeg_channels(board_id) df = pd.DataFrame(np.transpose(data)) plt.figure() df[eeg_channels].plot(subplots=True) plt.savefig('before_processing.png') # for demo apply different filters to different channels, in production choose one for count, channel in enumerate(eeg_channels): # filters work in-place if count == 0: DataFilter.perform_bandpass(data[channel], BoardShim.get_sampling_rate(board_id), 15.0, 6.0, 4, FilterTypes.BESSEL.value, 0) elif count == 1: DataFilter.perform_bandstop(data[channel], BoardShim.get_sampling_rate(board_id), 30.0, 1.0, 3, FilterTypes.BUTTERWORTH.value, 0) elif count == 2: DataFilter.perform_lowpass(data[channel], BoardShim.get_sampling_rate(board_id), 20.0, 5, FilterTypes.CHEBYSHEV_TYPE_1.value, 1) elif count == 3: DataFilter.perform_highpass(data[channel], BoardShim.get_sampling_rate(board_id), 3.0, 4, FilterTypes.BUTTERWORTH.value, 0) elif count == 4: DataFilter.perform_rolling_filter(data[channel], 3, AggOperations.MEAN.value) else: DataFilter.remove_environmental_noise( data[channel], BoardShim.get_sampling_rate(board_id), NoiseTypes.FIFTY.value) df = pd.DataFrame(np.transpose(data)) plt.figure() df[eeg_channels].plot(subplots=True) plt.savefig('after_processing.png')
def high_pass(self, data, parameter_list): filter_data = [] for i in range(parameter_list[-1]): DataFilter.perform_highpass(data[i], parameter_list[1], parameter_list[2], parameter_list[3], parameter_list[4], 3) filter_data.append(data[i]) filter_data = np.array(filter_data) return filter_data
def filtering(signal, sf, chosen_channels): for ch in chosen_channels: copy_signal = copy.deepcopy(signal[ch]) DataFilter.perform_lowpass(copy_signal, sf, 50.0, 5, FilterTypes.CHEBYSHEV_TYPE_1.value, 1) DataFilter.perform_highpass(copy_signal, sf, 3.0, 4, FilterTypes.BUTTERWORTH.value, 0) signal[ch] = copy_signal return signal
def main (): parser = argparse.ArgumentParser () # use docs to check which parameters are required for specific board, e.g. for Cyton - set serial port parser.add_argument ('--ip-port', type = int, help = 'ip port', required = False, default = 0) parser.add_argument ('--ip-protocol', type = int, help = 'ip protocol, check IpProtocolType enum', required = False, default = 0) parser.add_argument ('--ip-address', type = str, help = 'ip address', required = False, default = '') parser.add_argument ('--serial-port', type = str, help = 'serial port', required = False, default = '') parser.add_argument ('--mac-address', type = str, help = 'mac address', required = False, default = '') parser.add_argument ('--other-info', type = str, help = 'other info', required = False, default = '') parser.add_argument ('--board-id', type = int, help = 'board id, check docs to get a list of supported boards', required = True) parser.add_argument ('--log', action = 'store_true') args = parser.parse_args () params = BrainFlowInputParams () params.ip_port = args.ip_port params.serial_port = args.serial_port params.mac_address = args.mac_address params.other_info = args.other_info params.ip_address = args.ip_address params.ip_protocol = args.ip_protocol if (args.log): BoardShim.enable_dev_board_logger () else: BoardShim.disable_board_logger () board = BoardShim (args.board_id, params) board.prepare_session () # disable 2nd channel for cyton use real board to check it, emulator ignores commands if args.board_id == brainflow.board_shim.BoardIds.CYTON_BOARD.value: board.config_board ('x2100000X') board.start_stream () time.sleep (10) data = board.get_board_data () board.stop_stream () board.release_session () eeg_channels = BoardShim.get_eeg_channels (args.board_id) for count, channel in enumerate (eeg_channels): if count == 0: DataFilter.perform_bandpass (data[channel], BoardShim.get_sampling_rate (args.board_id), 15.0, 6.0, 4, FilterTypes.BESSEL.value, 0) elif count == 1: DataFilter.perform_bandstop (data[channel], BoardShim.get_sampling_rate (args.board_id), 5.0, 1.0, 3, FilterTypes.BUTTERWORTH.value, 0) elif count == 2: DataFilter.perform_lowpass (data[channel], BoardShim.get_sampling_rate (args.board_id), 9.0, 5, FilterTypes.CHEBYSHEV_TYPE_1.value, 1) elif count == 3: DataFilter.perform_highpass (data[channel], BoardShim.get_sampling_rate (args.board_id), 3.0, 4, FilterTypes.BUTTERWORTH.value, 0)
def plot(self): plt.figure() print('Only for channel #' + str(self.channels[0])) data = self.board.get_current_board_data(num_samples=450000) t = data[self.board.time_channel] - self.start_time data = data[self.board.eeg_channels][self.channels[0]] DataFilter.perform_highpass(data, self.board.rate, 3.0, 4, FilterTypes.BUTTERWORTH.value, 0) plt.plot(t, data) plt.title('OpenBCI Stream History') plt.ylabel('Voltage') plt.xlabel('Time (s)') plt.show() return data
def update(self): # received_data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes # print("Received message: ", received_data) data = self.board_shim.get_current_board_data(self.num_points) if data[0:7, 0:250].shape == (7, 250): for count, channel in enumerate(self.exg_channels): # plot timeseries DataFilter.perform_lowpass( data[channel], BoardShim.get_sampling_rate(args.board_id), high, 3, FilterTypes.BUTTERWORTH.value, 0) DataFilter.perform_highpass( data[channel], BoardShim.get_sampling_rate(args.board_id), low, 3, FilterTypes.BUTTERWORTH.value, 0) DataFilter.perform_bandstop( data[channel], BoardShim.get_sampling_rate(args.board_id), 50, 2, 8, FilterTypes.BUTTERWORTH.value, 0) self.curves[count + 1].setData(data[channel][-1001:].tolist()) window = data[0:8, -250:] # input window window = window - window[3, :] # Cz reference x = np.vstack((window[0:3, :], window[4:, :])) x = create_data(x, fs, 1, low, high, n_freqs, zeros, length) # convert to PSD x = np.reshape(x, (1, n_channels_ref, n_freqs)) x_csp = csp2.transform(x) window = np.reshape(window, (1, window.shape[0], window.shape[1])) x_raw_csp = csp1.transform(window) inference = np.hstack((x_csp, x_raw_csp)) current_time = datetime.now() current_time = current_time.strftime("%M:%S") result.append(model.predict(inference)[0]) MESSAGE = str(model.predict(inference)[0]) MESSAGE = bytes(MESSAGE, 'utf-8') sock.sendto(MESSAGE, (UDP_IP, UDP_PORT)) pygame.time.delay(100) self.curves[0].setData(result[-1001:]) self.app.processEvents()
def start_recording(total_sec, max_samples, params, args): board = BoardShim(args.board_id, params) board.prepare_session() # board.start_stream () # use this for default options board.start_stream(max_samples, args.streamer_params) time.sleep(total_sec) # data = board.get_current_board_data (256) # get latest 256 packages or less, doesnt remove them from internal buffer data = board.get_board_data( ) # get all data and remove it from internal buffer timestamp_channel = board.get_timestamp_channel(board_id=0) board.stop_stream() board.release_session() # demo how to convert it to pandas DF and plot data eeg_channels = BoardShim.get_eeg_channels(args.board_id) print(eeg_channels) df = pd.DataFrame(np.transpose(data)) plt.figure() df[eeg_channels].plot(subplots=True) plt.savefig('data/before_processing.png') # for demo apply different filters to different channels, in production choose one for count, channel in enumerate(eeg_channels): DataFilter.perform_lowpass(data[channel], BoardShim.get_sampling_rate(args.board_id), 30, 3, FilterTypes.BUTTERWORTH.value, 0) DataFilter.perform_highpass(data[channel], BoardShim.get_sampling_rate(args.board_id), 5, 3, FilterTypes.BUTTERWORTH.value, 0) DataFilter.perform_bandstop(data[channel], BoardShim.get_sampling_rate(args.board_id), 50, 2, 8, FilterTypes.BUTTERWORTH.value, 0) df = pd.DataFrame(np.transpose( data[:, 1000:])) # Usable after 1000 given order of filters are 3 plt.figure() df[eeg_channels].plot(subplots=True) plt.savefig('data/after_processing.png') return data, timestamp_channel
def run(self): # Initialize Acquisition Paramenters window_size = 3 sleep_time = 0.5 points_per_update = window_size * self.sampling_rate # Load Decoder classifier = keras.models.load_model( '..\jupyter-notebooks\classifier_22_v3') # Initialize Actuator # LIF Parameters: alpha = 0.4 beta = 0.1 v_ref = 0 v_thresh = 1 v_prev = np.zeros(4) v = np.zeros(4) # Manipulator Initialization portHandler = PortHandler(DEVICE_NAME) # There's also a class type that handles how to send packages across the COM port packetHandler = PacketHandler(PROTOCOL_VERSION) # Open the port if portHandler.openPort(): print('Succeeded to open the port') else: print('Failed to open the port') quit() enable_motor(MOTOR_ID_Y, packetHandler, portHandler) enable_motor(3, packetHandler, portHandler) enable_motor(2, packetHandler, portHandler) enable_motor(MOTOR_ID_Z, packetHandler, portHandler) position_my = 1900 position_mz = 1900 move_motor(position_my, MOTOR_ID_Y, packetHandler, portHandler) move_motor(1900, 3, packetHandler, portHandler) move_motor(1900, 2, packetHandler, portHandler) move_motor(position_mz, MOTOR_ID_Z, packetHandler, portHandler) _ = input() while self.keep_alive: start_time = time.time() time.sleep(sleep_time) # get current board data doesnt remove data from the buffer data = self.board.get_current_board_data(int(points_per_update)) # print('Data Shape %s' % (str(data.shape))) first_channel = True for channel in self.eeg_channels: # filters work in-place DataFilter.perform_highpass(data[channel], self.sampling_rate, 0.5, 4, FilterTypes.BUTTERWORTH.value, 0) DataFilter.perform_bandstop(data[channel], self.sampling_rate, 60.0, 2.0, 4, FilterTypes.BUTTERWORTH.value, 0) DataFilter.perform_bandpass(data[channel], self.sampling_rate, 19.0, 12.0, 4, FilterTypes.BUTTERWORTH.value, 0) stft_data = data[channel].copy() _, _, Zxx = signal.stft(stft_data, self.sampling_rate, nperseg=128, noverlap=127, nfft=256) spectro = np.asarray(Zxx[7:32, :]) spectro = np.abs(spectro) spectro = np.expand_dims(spectro, axis=2) if first_channel: tfi = spectro.copy() first_channel = False else: tfi = np.dstack((tfi, spectro)) res_tfi = resize(tfi, (64, 64, 8)) res_tfi = np.reshape(res_tfi, (1, 64, 64, 8)) outputs = classifier.predict(res_tfi) outputs = np.reshape(outputs, -1) output = np.argmax(outputs) exc = np.zeros(4) if output == 0: exc[0] = 1 elif output == 2: exc[1] = 1 elif output == 3: exc[2] = 1 elif output == 4: exc[3] = 1 print(v) dv = np.subtract((alpha * exc), (beta * v_prev)) v = np.add(v_prev, dv) print(v) if v[0] > v_thresh: position_my = move_down(position_my, packetHandler, portHandler) v[0] = v_ref elif v[1] > v_thresh: position_mz = move_left(position_mz, packetHandler, portHandler) v[1] = v_ref elif v[2] > v_thresh: position_mz = move_right(position_mz, packetHandler, portHandler) v[2] = v_ref elif v[3] > v_thresh: position_my = move_up(position_my, packetHandler, portHandler) v[3] = v_ref else: print('do not move') v_prev = v print(time.time() - start_time) disable_motor(MOTOR_ID_Y, packetHandler, portHandler) disable_motor(3, packetHandler, portHandler) disable_motor(2, packetHandler, portHandler) disable_motor(MOTOR_ID_Z, packetHandler, portHandler) # Close the port portHandler.closePort()
def main(): parser = argparse.ArgumentParser() # use docs to check which parameters are required for specific board, e.g. for Cyton - set serial port, parser.add_argument('--ip-port', type=int, help='ip port', required=False, default=0) parser.add_argument('--ip-protocol', type=int, help='ip protocol, check IpProtocolType enum', required=False, default=0) parser.add_argument('--ip-address', type=str, help='ip address', required=False, default='') parser.add_argument('--serial-port', type=str, help='serial port', required=False, default='') parser.add_argument('--mac-address', type=str, help='mac address', required=False, default='') parser.add_argument('--other-info', type=str, help='other info', required=False, default='') parser.add_argument( '--board-id', type=int, help='board id, check docs to get a list of supported boards', required=True) parser.add_argument('--log', action='store_true') args = parser.parse_args() params = BrainFlowInputParams() params.ip_port = args.ip_port params.serial_port = args.serial_port params.mac_address = args.mac_address params.other_info = args.other_info params.ip_address = args.ip_address params.ip_protocol = args.ip_protocol if (args.log): BoardShim.enable_dev_board_logger() else: BoardShim.disable_board_logger() # demo how to read data as 2d numpy array board = BoardShim(args.board_id, params) board.prepare_session() board.start_stream() BoardShim.log_message(LogLevels.LEVEL_INFO.value, 'start sleeping in the main thread') time.sleep(10) # data = board.get_current_board_data (256) # get latest 256 packages or less, doesnt remove them from internal buffer data = board.get_board_data( ) # get all data and remove it from internal buffer board.stop_stream() board.release_session() # demo how to convert it to pandas DF and plot data eeg_channels = BoardShim.get_eeg_channels(args.board_id) df = pd.DataFrame(np.transpose(data)) print('Data From the Board') print(df.head()) plt.figure() df[eeg_channels].plot(subplots=True) plt.savefig('before_processing.png') # demo for data serialization DataFilter.write_file(data, 'test.csv', 'w') restored_data = DataFilter.read_file('test.csv') restored_df = pd.DataFrame(np.transpose(restored_data)) print('Data From the File') print(restored_df.head()) # demo how to perform signal processing for count, channel in enumerate(eeg_channels): if count == 0: DataFilter.perform_bandpass( data[channel], BoardShim.get_sampling_rate(args.board_id), 15.0, 6.0, 4, FilterTypes.BESSEL.value, 0) elif count == 1: DataFilter.perform_bandstop( data[channel], BoardShim.get_sampling_rate(args.board_id), 5.0, 1.0, 3, FilterTypes.BUTTERWORTH.value, 0) elif count == 2: DataFilter.perform_lowpass( data[channel], BoardShim.get_sampling_rate(args.board_id), 9.0, 5, FilterTypes.CHEBYSHEV_TYPE_1.value, 1) elif count == 3: DataFilter.perform_highpass( data[channel], BoardShim.get_sampling_rate(args.board_id), 3.0, 4, FilterTypes.BUTTERWORTH.value, 0) df = pd.DataFrame(np.transpose(data)) print('Data After Processing') print(df.head()) plt.figure() df[eeg_channels].plot(subplots=True) plt.savefig('after_processing.png')
BUFFER_TIME = args.buffer params = BrainFlowInputParams() if args.synth else fill_in_cyton_params() board = BoardShim(board_id=board_id, input_params=params) board.prepare_session() board.start_stream() time.sleep(BUFFER_TIME) for i in range( 3 ): #TODO: make while(True) and elegantly shutdown when board is shutdown or keyboard interrupt data = board.get_board_data() channel = eegs[1] print(data.shape) foo = np.mean(data[channel]) log_info( f"eeg type is {type(data[channel])} with shape {data[eegs[1]].shape}") DataFilter.perform_highpass(data[channel], BoardShim.get_sampling_rate(board_id), 20.0, 5, FilterTypes.CHEBYSHEV_TYPE_1.value, 1) # DataFilter.perform_bandstop (data[channel], BoardShim.get_sampling_rate (board_id), 30.0, 1.0, 3, FilterTypes.BUTTERWORTH.value, 0) print(f"is foo the same as data[channel]? {foo == np.mean(data[channel])}") indexes = [timestamp, *eegs, *others] data_to_write = data[indexes] DataFilter.write_file(data=data_to_write, file_name=raw_data_path, file_mode='a') log_debug(f"sample {i}:: data is {data} or len {len(data)}") time.sleep(1) board.stop_stream() board.release_session()
async def capture(self, stream,url, port=None,plot=False, model=None,categories=None,details=None): # Authenticate res = self.session.post(url + '/login') cookies = "" cookieDict = res.cookies.get_dict() for cookie in (cookieDict): cookies += str(cookie + "=" + cookieDict[cookie] + "; ") o = urlparse(url) if (o.scheme == 'http'): uri = "ws://" + o.netloc elif (o.scheme == 'https'): uri = "wss://" + o.netloc else: print('not a valid url scheme') async with websockets.connect(uri,ping_interval=None, extra_headers=[('cookie', cookies)]) as websocket: print('Initializing board') self.board = initialize_board(stream,port) print('Starting stream') self.board.start_stream(num_samples=450000) self.start_time = time.time() signal.signal(signal.SIGINT, self.signal_handler) # # initialise plot and line # fig = plt.figure() # ax = fig.add_subplot(1, 1, 1) # xs = [] # ys = [] # def animate(i, xs, ys): # data = self.board.get_current_board_data(num_samples=DataFilter.get_nearest_power_of_two(self.board.rate))#1) # t = data[self.board.time_channel] # data = data[self.board.eeg_channels][self.channel] # if len(t) > 0: # t = t - self.start_time # DataFilter.perform_highpass(data, self.board.rate, 3.0, 4, FilterTypes.BUTTERWORTH.value, 0) # self.socket.emit('bci', {'signal':(data).tolist(), # 'time': (t*1000).tolist()}) # xs.append(t[-1]) # ys.append(data[-1]) # # Limit x and y lists to 20 items # xs = xs[-20:] # ys = ys[-20:] # # Draw x and y lists # ax.clear() # ax.plot(xs, ys) # # Format plot # plt.xticks(rotation=45, ha='right') # plt.subplots_adjust(bottom=0.30) # plt.title('OpenBCI Live Stream') # plt.ylabel('Voltage') # ani = animation.FuncAnimation(fig, animate, fargs=(xs, ys), interval=1) # plt.show() while True: # Get Data pass_data = [] rate = DataFilter.get_nearest_power_of_two(self.board.rate) data = self.board.get_current_board_data(num_samples=rate)#1) t = data[self.board.time_channel] if self.all_channels: data = data[self.board.eeg_channels] # SCALED else: data = data[self.board.eeg_channels][self.channels] # SCALED for entry in data: DataFilter.perform_highpass(entry, self.board.rate, 3.0, 4, FilterTypes.BUTTERWORTH.value, 0) pass_data.append((entry).tolist()) if len(t) > 0: t = t - self.start_time message = { 'destination': 'bci', 'data': {'ts_filtered':pass_data} } message = json.dumps(message, separators=(',', ':')) # (Re)Open Websocket Connection if not websocket.open: try: print('Websocket is NOT connected. Reconnecting...') websocket = await websockets.connect(uri,ping_interval=None, extra_headers=[('cookie', cookies)]) except: print('Unable to reconnect, trying again.') await websocket.send(message) time.sleep(.01)