details of skin-electrode impedance measurement ?
Dear community,
@wjcroft @retiutut @evaesteban
I have a question regarding the mechanism of the Cyton embedded impedance testing functionality. I was wondering whether the details of how the skin-electrode impedance is being measured can be shared. We are testing our own-built electrodes and it would greatly help our research if we can understand the details of the calculations, i.e. how the body resistance is being calculated, whether the reported impedance is the combination of the impedances for both target and reference electrodes, and etc.
Also, I was wondering whether there is any way to save the calculated real-time impedance values.
Thanks,
Comments
Alcor, hi.
There are many related posts on Cyton impedance, such as located with the Google Advanced Search button in upper right,
https://www.google.com/search?as_q=impedance+ADS1299&as_sitesearch=openbci.com
https://openbci.com/forum/index.php?p=/discussion/84/ads1299-electrode-impedance-measurement-algorithm
https://www.google.com/search?as_q=impedance+cyton&as_sitesearch=openbci.com
When in impedance mode, a calibrated current source is injected at 31 Hz. This is done by logic in the ADS1299 ADC chip. EEG amplitude of the resulting 31 Hz waveform correlates to impedance of that channel. This is also documented in the Texas Instrument data sheet for ADS1299.
https://www.ti.com/lit/ds/symlink/ads1299.pdf
https://www.ti.com/product/ADS1299
William
@AlcorRN Thank you for asking about this! I am actively working in the area of Cyton Impedance checking at this time.
The most important thing to consider at this point is that we can only reliably check the impedance on one electrode at a time, due to injecting the current into a particular channel. We are working to implement this in the GUI at this time, but it's a little bit harder to make perfect than anticipated.
https://github.com/OpenBCI/OpenBCI_GUI/issues/983
The next important thing is the speed at which we send commands to the Cyton. Example: You likely need to wait 100-500 ms between turning off impedance on channel 1 before turning on impedance check on channel 2. This will likely be rolled into the fix in the GUI. Due to the limitation of checking impedance on one channel at a time, you will need to loop through the channels you would check, while carefully following the information I have shared here. I am keenly aware of what should work in practice due to experience with the hardware and software.
The GUI always saves the raw data, before filters applied. Recording calculated Impedance values is not something that the GUI is meant to do, since this would get confusing with also recording data and the ability for users to turn this on or off on certain channels.
Though, you can write a program in Python using BrainFlow Python Binding that would collect data, use the same math as the GUI to derive Ohms, and save this information to a file. I recommend making your own Python script for your specific use case. It would also be great to make it open-source and share with the entire OpenBCI community. If this is beyond the scope of your resources, OpenBCI can consider developing this, as it could benefit our worldwide community.
If you have any more questions about what I have shared, please continue to reach out here on the Forum and we will be happy to assist and clarify.
Hope this helps,
RW
Thank you so much William and RW, for the quick and detailed response.
I believe it would be great to have the option on the GUI to choose between recording the sensor readings and the impedance readings. If OpenBCI team can help with that, it is much appreciated.
Can you please clarify on what you mean by "reliable" impedance measure on one channel at a time? What is the percentage of error? Is the skin-electrode modeled as resistance only or the combination of resistance and capacitance?
Also about: "The GUI always saves the raw data, before filters applied"
My understanding was that the GUI saves the data after applying 60Hz notch filter and the specified band-pass filter on the GUI. But, based on your statement, the output is actually the raw data (including all the band information [0-125Hz]). Is that correct?
Thanks,
Alcor
Most commercial EEG skin impedance meters use a similar technology: an EEG range AC signal is placed across the electrodes, and then the resistance measured. This then ensures that the measurement reflects actual skin impedance dynamics. If the injected signal had been a DC level, this would not be the case. And in fact DC inputs are subject to saturation effects.
Practical experience with the ADS1299 current injection scheme, shows that it should be done a single channel at a time.
https://www.google.com/search?q=eeg+impedance+meter
How the very high input impedance of the ADS1299 amplifier (1 gigaohm), relates to usable electrode impedance ranges for Cyton. See linked paper at comment below, from EGI scientists.
https://openbci.com/forum/index.php?p=/discussion/comment/13328/#Comment_13328
Fair enough. Maybe there is a compromise that involves a new "Cyton Impedance Widget" and we simply dump the information into a separate CSV file with timestamps!!! Was already planning on the new widget. Exporting to a file and displaying the last values on screen can't be that difficult of an MVP, and it could help you and others. Thanks for requesting this!
Yes absolutely! For example in our project, we understand that different ranges of skin-electrode impedance can give us good EEG readings, however, we are more interested in realizing how our electrodes impedance would change during the whole period of recording time.
Based on the discussion from the past forum posts, I've realized that currently the measurement of the reference electrode's impedance is not possible. It would be great if you can enable that as well, since the reference electrode plays an important role in the SNR of the signal.
Finally could you please confirm this:
Also about: "The GUI always saves the raw data, before filters applied"
My understanding was that the GUI saves the data after applying 60Hz notch filter and the specified band-pass filter on the GUI. But, based on your statement, the output is actually the raw data (including all the band information [0-125Hz]). Is that correct?
Thanks much,
Alcor
We save the raw data straight from the devices to CSV and BDF so that different filters can be applied/changed later during playback.