||Digital Filtering - EEG|
EEG acquired signals are highly vulnerable to different kind of
Some noise can be avoided by preparation of test surroundings, hence other noise can not be avoided and must be removed by specific filtering methods.
The Signal-to-Noise ratio (SNR) of an acquired EEG signal is a measure of signal quality and describes the ratio of signal power to noise power. The raw Electroencephalogram (EEG) data needs filtering in order for proper noise reduction and signal evaluation.
Reasons and implications of artefacts causing the noise are discussed in this Jupyter Notebook as well as the application and implication of different filters on the signal.
1 - Importation of the needed packages
# Biosignalsnotebooks python package import biosignalsnotebooks as bsnb # Scientific packages from numpy import array, mean from scipy.signal import welch
2.1 - Load data from signal samples library
# Load Data from file path data_artefact_segment_1, header = bsnb.load_signal("eeg_sample_artefacts_seg1", get_header=True) data_artefact_segment_2 = bsnb.load_signal("eeg_sample_artefacts_seg2") data_artefact_segment_3 = bsnb.load_signal("eeg_sample_artefacts_seg3")
2.2 - Select the relevant channel to work with
# [The acquired EEG data is at channel 2 ("CH2") # for segments 1 and 2 and at channel 1 ("CH1") for segment 3] eeg_artefact_segment_1 = data_artefact_segment_1["CH2"] eeg_artefact_segment_2 = data_artefact_segment_2["CH2"] eeg_artefact_segment_3 = data_artefact_segment_3["CH1"]
2.3 - Store some acquisition constants inside variables
Two extremely relevant parameters defined before data acquisition are the sampling rate and ADC resolution. On the previous cell we only request the header of eeg_sample_artefacts_seg1 signal sample because the remaining signal samples were collected in similar conditions (at the same sampling rate and resolution).
sr = header["sampling rate"] # Sampling Rate resolution = header["resolution"]
2.4 - Conversion of ADC sample values to physical units (uV) and generation of a time-axis
The device used to acquire EEG data belongs to the "biosignalsplux" model. In order to convert the raw EEG signal to its physical units, the recorded data must be passed as an input of raw_to_phy function.
#Unit Conversion uv_eeg_artefact_segment_1 = bsnb.raw_to_phy("EEG", "biosignalsplux", eeg_artefact_segment_1, resolution, "uV") time_eeg_artefact_segment_1 = bsnb.generate_time(uv_eeg_artefact_segment_1, sr) uv_eeg_artefact_segment_2 = bsnb.raw_to_phy("EEG", "biosignalsplux", eeg_artefact_segment_2, resolution, "uV") time_eeg_artefact_segment_2 = bsnb.generate_time(uv_eeg_artefact_segment_2, sr) uv_eeg_artefact_segment_3 = bsnb.raw_to_phy("EEG", "biosignalsplux", eeg_artefact_segment_3, resolution, "uV") time_eeg_artefact_segment_3 = bsnb.generate_time(uv_eeg_artefact_segment_3, sr)
3 - Plot of Raw Data and Artefact check
In the following topics, the previously loaded raw data is compared to check for artefacts influencing the signal.
Types of Artefacts which can influence the signal:
The latter is explained in detail in the notebook
EEG - Electrode Placement
Besides the mentioned artefacts, it needs to be considered that the signal varies among different test subjects!
3.1 Noise Artefacts
Surrounding noise can be eliminated but in some locations not completely be prevented. To illustrate surrounding noise in the signal, the following plot shows a baseline test with closed eyes: The electrodes were placed in the occipital lobe O1 and O2 electrode placement.
#Plot of Raw data - eys closed bsnb.plot_eeg_signal_wind(time_eeg_artefact_segment_3, uv_eeg_artefact_segment_3, time_range=[0, 90.5], time_windows_evt_1=[(20.5,23), (55, 65),(89.5,90.5)], time_windows_evt_2=, y_axis_label="Electric Voltage (uV)", legend=["Noise - coffee machine / people talking"])