Пример #1
0
def main():
    BoardShim.enable_dev_board_logger()

    # use synthetic board for demo
    params = BrainFlowInputParams()
    board_id = BoardIds.SYNTHETIC_BOARD.value
    sampling_rate = BoardShim.get_sampling_rate(board_id)
    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)
    nfft = DataFilter.get_nearest_power_of_two(sampling_rate)
    data = board.get_board_data()
    board.stop_stream()
    board.release_session()

    eeg_channels = BoardShim.get_eeg_channels(board_id)
    # second eeg channel of synthetic board is a sine wave at 10Hz, should see huge alpha
    eeg_channel = eeg_channels[1]
    # optional detrend
    DataFilter.detrend(data[eeg_channel], DetrendOperations.LINEAR.value)
    psd = DataFilter.get_psd_welch(data[eeg_channel], nfft, nfft // 2,
                                   sampling_rate,
                                   WindowFunctions.BLACKMAN_HARRIS.value)

    band_power_alpha = DataFilter.get_band_power(psd, 7.0, 13.0)
    band_power_beta = DataFilter.get_band_power(psd, 14.0, 30.0)
    print("alpha/beta:%f", band_power_alpha / band_power_beta)

    # fail test if ratio is not smth we expect
    if (band_power_alpha / band_power_beta < 100):
        raise ValueError('Wrong Ratio')
Пример #2
0
    def streamLoop():
        pass_data = []
        rate = DataFilter.get_nearest_power_of_two(board.rate)
        data = board.get_board_data()
        t = data[board.time_channel]

        data = data[board.eeg_channels]

        for entry in data:
            pass_data.append((entry).tolist())

        data = {}
        data['raw'] = pass_data
        data['times'] = t.tolist()

        # Send Metadata on First Loop
        if loopCount == 0:
            data['sps'] = board.rate
            data['deviceType'] = 'eeg'
            data['format'] = 'brainflow'
            tags = []
            for i, channel in enumerate(board.eeg_channels):
                tags.append({
                    'ch': channel - 1,
                    'tag': board.eeg_names[i],
                    'analyze': True
                })

            data['eegChannelTags'] = tags

        return data
Пример #3
0
    def main(self):
        self.board.prepare_session()
        self.board.start_stream()
        try:
            nfft = DataFilter.get_nearest_power_of_two(self.sampling_rate)
            eeg_channels = BoardShim.get_eeg_channels(self.board_id)
            time.sleep(3)
            cv2_thread = threading.Thread(target=self.cv2_video_thread)
            audio_thread = threading.Thread(target=self.audio_thread)
            cv2_thread.start()
            audio_thread.start()
            self.player_is_playing = True
            signal_freq_coeff = 1.1  # auto adjustable coefficient?
            high_signal_freq_coeff = 1.5
            data_log_file = open(f'log2-{time.time()}.csv', 'a')
            print_bands = []
            for channel in self.channels.keys():
                print_bands.append(','.join(
                    [b.name for b in self.channels[channel]]))
            data_log_file.write(
                f'time,metrics_sum,signal,high_signal,{",".join(print_bands)}')
            metrics_hist = []
            while self.player_is_playing:
                time.sleep(.3)
                self.on_next(eeg_channels, nfft)
                metrics_sum = 0.0
                for metric in self.metrics:
                    metrics_sum += metric.get_metric()
                metrics_hist.append(metrics_sum)
                if len(metrics_hist) > 50:
                    metrics_hist.pop(0)

                avg_metrics_hist = sum(metrics_hist) / len(metrics_hist)
                self.positive_signal = avg_metrics_hist < metrics_sum * signal_freq_coeff

                self.is_last_signal_delta_high = False
                if self.positive_signal and avg_metrics_hist < metrics_sum * high_signal_freq_coeff:
                    self.is_last_signal_delta_high = True

                print(
                    f'{self.positive_signal} {avg_metrics_hist} < {metrics_sum*signal_freq_coeff}'
                )
                print_bands = []
                for channel in self.channels.keys():
                    print_bands.append(','.join([
                        str(b.band_current_power)
                        for b in self.channels[channel]
                    ]))

                log_line = f'\n{time.asctime(time.gmtime(time.time()))},{metrics_sum},{self.positive_signal},{self.is_last_signal_delta_high},{",".join(print_bands)}'

                data_log_file.write(log_line)

            data_log_file.close()
            audio_thread.join()
            cv2_thread.join()
        except Exception as e:
            print(e)
            self.player_is_playing = False
        return
Пример #4
0
def main():
    BoardShim.enable_dev_board_logger()

    # use synthetic board for demo
    params = BrainFlowInputParams()
    board_id = BoardIds.SYNTHETIC_BOARD.value
    sampling_rate = BoardShim.get_sampling_rate(board_id)
    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_current_board_data(
        DataFilter.get_nearest_power_of_two(sampling_rate))
    board.stop_stream()
    board.release_session()

    eeg_channels = BoardShim.get_eeg_channels(board_id)
    for count, channel in enumerate(eeg_channels):
        # optional: subtract mean or detrend
        psd = DataFilter.get_psd(data[channel], sampling_rate,
                                 WindowFunctions.BLACKMAN_HARRIS.value)
        band_power_alpha = DataFilter.get_band_power(psd, 7.0, 13.0)
        band_power_beta = DataFilter.get_band_power(psd, 14.0, 30.0)
        print("alpha/beta:%f", band_power_alpha / band_power_beta)
Пример #5
0
 def main(self):
     self.board.prepare_session()
     self.board.start_stream()
     try:
         nfft = DataFilter.get_nearest_power_of_two(self.sampling_rate)
         eeg_channels = BoardShim.get_eeg_channels(self.board_id)
         time.sleep(3)
         signals = []
         cv2_thread = threading.Thread(target=self.cv2_video_read_thread)
         audio_thread = threading.Thread(target=self.audio_thread)
         cv2_thread.start()
         audio_thread.start()
         self.player_is_playing = True
         while self.player_is_playing:
             signals.append(self.on_next(eeg_channels, nfft))
             if len(signals) > 3:
                 signals.pop(0)
             avg_signal = sum(signals) / len(signals)
             self.positive_signal = avg_signal < signals[-1]
             self.last_signal_delta = abs(avg_signal - signals[-1])
             if signals[-1] > 9:  # min positive signals
                 self.positive_signal = True
             print(
                 f'up {self.last_signal_delta}' if avg_signal < signals[-1]
                 else f'down {self.last_signal_delta}')  # enable it later
         audio_thread.join()
         cv2_thread.join()
     except Exception as e:
         print(e)
     return
Пример #6
0
 def _init_psd(self):
     self.psd_plot = self.win.addPlot(row=0,col=1, rowspan=len(self.exg_channels)//2)
     self.psd_plot.showAxis('left', False)
     self.psd_plot.setMenuEnabled('left', False)
     self.psd_plot.setTitle('PSD Plot')
     self.psd_plot.setLogMode(False, True)
     self.psd_curves = list()
     self.psd_size = DataFilter.get_nearest_power_of_two(self.sampling_rate)
     for i in range(len(self.exg_channels)):
         psd_curve = self.psd_plot.plot(pen=self.pens[i % len(self.pens)])
         psd_curve.setDownsampling(auto=True, method='mean', ds=3)
         self.psd_curves.append(psd_curve)
Пример #7
0
    def main(self):
        self.board.prepare_session()
        self.board.start_stream()
        try:
            nfft = DataFilter.get_nearest_power_of_two(self.sampling_rate)
            eeg_channels = BoardShim.get_eeg_channels(self.board_id)
            time.sleep(3)
            cv2_thread = threading.Thread(target=self.cv2_video_thread)
            audio_thread = threading.Thread(target=self.audio_thread)
            cv2_thread.start()
            audio_thread.start()
            self.player_is_playing = True
            signal_freq_coeff = .5  # auto adjustable coefficient?
            high_signal_freq_coeff = .15
            data_log_file = open(f'log-{time.time()}.csv', 'a')
            while self.player_is_playing:
                time.sleep(.1)
                bands_signals = self.on_next(eeg_channels, nfft)
                positive_signals_sum = 0.0
                negative_signals_sum = 0.0
                for i in bands_signals.keys():
                    if bands_signals[i] > 0:
                        positive_signals_sum += bands_signals[i]
                    else:
                        negative_signals_sum += bands_signals[i]

                self.positive_signal = abs(
                    negative_signals_sum
                ) < positive_signals_sum * signal_freq_coeff

                self.is_last_signal_delta_high = False
                if self.positive_signal and positive_signals_sum * high_signal_freq_coeff > abs(
                        negative_signals_sum):
                    self.is_last_signal_delta_high = True

                print_bands = []
                for proto in self.protocol:
                    print_bands.append(
                        f'{eeg_channels[proto.channel_inx]},' + ",".join(
                            [str(b.band_current_power) for b in proto.bands]))

                log_line = f'\n{time.asctime(time.gmtime(time.time()))},{positive_signals_sum},{negative_signals_sum},{self.positive_signal},{self.is_last_signal_delta_high},{",".join(print_bands)}'

                data_log_file.write(log_line)

            data_log_file.close()
            audio_thread.join()
            cv2_thread.join()
        except Exception as e:
            print(e)
            self.player_is_playing = False
        return
Пример #8
0
def main():
    BoardShim.enable_dev_board_logger()

    # use synthetic board for demo
    params = BrainFlowInputParams()
    board_id = BoardIds.SYNTHETIC_BOARD.value
    sampling_rate = BoardShim.get_sampling_rate(board_id)
    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_current_board_data(
        DataFilter.get_nearest_power_of_two(sampling_rate))
    board.stop_stream()
    board.release_session()

    eeg_channels = BoardShim.get_eeg_channels(board_id)
    # demo for transforms
    for count, channel in enumerate(eeg_channels):
        print('Original data for channel %d:' % channel)
        print(data[channel])
        # demo for wavelet transforms
        # wavelet_coeffs format is[A(J) D(J) D(J-1) ..... D(1)] where J is decomposition level, A - app coeffs, D - detailed coeffs
        # lengths array stores lengths for each block
        wavelet_coeffs, lengths = DataFilter.perform_wavelet_transform(
            data[channel], 'db5', 3)
        app_coefs = wavelet_coeffs[0:lengths[0]]
        detailed_coeffs_first_block = wavelet_coeffs[lengths[0]:lengths[1]]
        # you can do smth with wavelet coeffs here, for example denoising works via thresholds
        # for wavelets coefficients
        restored_data = DataFilter.perform_inverse_wavelet_transform(
            (wavelet_coeffs, lengths), data[channel].shape[0], 'db5', 3)
        print('Restored data after wavelet transform for channel %d:' %
              channel)
        print(restored_data)

        # demo for fft, len of data must be a power of 2
        fft_data = DataFilter.perform_fft(data[channel],
                                          WindowFunctions.NO_WINDOW.value)
        # len of fft_data is N / 2 + 1
        restored_fft_data = DataFilter.perform_ifft(fft_data)
        print('Restored data after fft for channel %d:' % channel)
        print(restored_fft_data)
    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)