Example #1
0
    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
Example #2
0
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')
Example #3
0
 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
Example #9
0
    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')
Example #11
0
File: bf.py Project: bookRa/keisaku
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)