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')
def update(self): data = self.board_shim.get_current_board_data(self.num_points) avg_bands = [0, 0, 0, 0, 0] for count, channel in enumerate(self.exg_channels): # plot timeseries DataFilter.detrend(data[channel], DetrendOperations.CONSTANT.value) DataFilter.perform_bandpass(data[channel], self.sampling_rate, 30.0, 56.0, 2, FilterTypes.BUTTERWORTH.value, 0) DataFilter.perform_bandstop(data[channel], self.sampling_rate, 50.0, 4.0, 2, FilterTypes.BUTTERWORTH.value, 0) DataFilter.perform_bandstop(data[channel], self.sampling_rate, 60.0, 4.0, 2, FilterTypes.BUTTERWORTH.value, 0) self.curves[count].setData(data[channel].tolist()) if data.shape[1] > self.psd_size: # plot psd psd_data = DataFilter.get_psd_welch(data[channel], self.psd_size, self.psd_size // 2, self.sampling_rate, WindowFunctions.BLACKMAN_HARRIS.value) lim = min(70, len(psd_data[0])) self.psd_curves[count].setData(psd_data[1][0:lim].tolist(), psd_data[0][0:lim].tolist()) # plot bands avg_bands[0] = avg_bands[0] + DataFilter.get_band_power(psd_data, 1.0, 4.0) avg_bands[1] = avg_bands[1] + DataFilter.get_band_power(psd_data, 4.0, 8.0) avg_bands[2] = avg_bands[2] + DataFilter.get_band_power(psd_data, 8.0, 13.0) avg_bands[3] = avg_bands[3] + DataFilter.get_band_power(psd_data, 13.0, 30.0) avg_bands[4] = avg_bands[4] + DataFilter.get_band_power(psd_data, 30.0, 50.0) avg_bands = [int(x * 100 / len(self.exg_channels)) for x in avg_bands] self.band_bar.setOpts(height=avg_bands) self.app.processEvents()
def psd_welch(self, data, parameter_list): feature_data = [] for i in range(parameter_list[-1]): DataFilter.detrend(data[i], 1) DataFilter.detrend(data[i], 2) new_data = DataFilter.get_psd_welch(data[i], parameter_list[1], parameter_list[2], parameter_list[3], parameter_list[4]) feature_data.append(new_data[0]) feature_data = np.array(feature_data) return feature_data
def on_next(self, eeg_channels, nfft): data = self.board.get_current_board_data( max(self.sampling_rate, nfft) + 1) #get_board_data () we are taking ~1 sec data ~10 times a sec for channel in self.channels.keys(): channel_data = data[channel] DataFilter.detrend(channel_data, DetrendOperations.LINEAR.value) psd = DataFilter.get_psd_welch( channel_data, nfft, nfft // 2, self.sampling_rate, WindowFunctions.BLACKMAN_HARRIS.value) for component in self.channels[channel]: component.add_band_power_value(psd)
def on_next(self, eeg_channels, nfft): data = self.board.get_current_board_data( max(self.sampling_rate, nfft) + 1) #get_board_data () we are taking ~1 sec data ~10 times a sec bands_sum = collections.defaultdict(float) for channel in self.protocol: channel_data = data[eeg_channels[channel.channel_inx]] DataFilter.detrend(channel_data, DetrendOperations.LINEAR.value) psd = DataFilter.get_psd_welch( channel_data, nfft, nfft // 2, self.sampling_rate, WindowFunctions.BLACKMAN_HARRIS.value) for band in channel.bands: band.add_band_power_value(psd) bands_sum[band.name] += band.get_signal() return bands_sum
def on_next(self, eeg_channels, nfft): time.sleep(.3) data = self.board.get_current_board_data( max(self.sampling_rate, nfft) + 1) #get_board_data () we are taking ~1 sec data ~3 times a sec for channel in self.protocol: channel_data = data[eeg_channels[channel.channel_inx]] DataFilter.detrend(channel_data, DetrendOperations.LINEAR.value) psd = DataFilter.get_psd_welch( channel_data, nfft, nfft // 2, self.sampling_rate, WindowFunctions.BLACKMAN_HARRIS.value) for band in channel.bands: band.add_band_power_value(psd, 30) #print(f'channel: {channel.channel_inx} positive_signals: {channel.get_positive_signals_count()} avg_power: {channel.get_avg_bands()}') return sum([i.get_positive_signals_count() for i in self.protocol])
def update(self): data = self.board_shim.get_current_board_data(self.num_points) for count, channel in enumerate(self.exg_channels): # plot timeseries DataFilter.detrend(data[channel], DetrendOperations.CONSTANT.value) DataFilter.perform_bandpass(data[channel], self.sampling_rate, 51.0, 100.0, 2, FilterTypes.BUTTERWORTH.value, 0) DataFilter.perform_bandpass(data[channel], self.sampling_rate, 51.0, 100.0, 2, FilterTypes.BUTTERWORTH.value, 0) DataFilter.perform_bandstop(data[channel], self.sampling_rate, 50.0, 4.0, 2, FilterTypes.BUTTERWORTH.value, 0) DataFilter.perform_bandstop(data[channel], self.sampling_rate, 60.0, 4.0, 2, FilterTypes.BUTTERWORTH.value, 0) self.curves[count].setData(data[channel].tolist()) self.app.processEvents()