From 44cc8acf0eac4161e80baae2faa622eb3504406a Mon Sep 17 00:00:00 2001 From: NeuroPawn Admin Date: Wed, 21 Oct 2026 10:09:43 -0700 Subject: [PATCH] Fix NeuroPawn Knight EEG scale factor (#9) --- src/board_controller/neuropawn/inc/knight_base.h | 2 ++ src/board_controller/neuropawn/knight.cpp | 6 ++---- src/board_controller/neuropawn/knight_base.cpp | 1 + src/board_controller/neuropawn/knight_imu.cpp | 5 ++--- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/board_controller/neuropawn/inc/knight_base.h b/src/board_controller/neuropawn/inc/knight_base.h index 68d79355c..39482d2e1 100644 --- a/src/board_controller/neuropawn/inc/knight_base.h +++ b/src/board_controller/neuropawn/inc/knight_base.h @@ -39,4 +39,6 @@ class KnightBase : public Board static constexpr int start_byte = 0xA0; static constexpr int end_byte = 0xC0; + // 4 Vref / (2^15 - 1) / gain / 79.57 * 1e6 -> uV. Gain is fixed at 12. + static constexpr double eeg_scale = 4.0 / (32768.0 - 1.0) / 12.0 / 79.57 * 1000000.0; }; diff --git a/src/board_controller/neuropawn/knight.cpp b/src/board_controller/neuropawn/knight.cpp index 7bcf9bd4c..16d5f3a2f 100644 --- a/src/board_controller/neuropawn/knight.cpp +++ b/src/board_controller/neuropawn/knight.cpp @@ -1,4 +1,3 @@ -#include #include #include "custom_cast.h" @@ -29,7 +28,6 @@ void Knight::read_thread () int res; unsigned char b[20] = {0}; - float eeg_scale = 4 / float ((pow (2, 15) - 1)) / 12 * 1000000.; int num_rows = board_descr["default"]["num_rows"]; double *package = new double[num_rows]; for (int i = 0; i < num_rows; i++) @@ -81,8 +79,8 @@ void Knight::read_thread () // exg data retrieval for (unsigned int i = 0; i < eeg_channels.size (); i++) { - package[eeg_channels[i]] = - eeg_scale * cast_16bit_to_int32 (b + 1 + 2 * i); // CHANGE TO 2+2*i if not working + package[eeg_channels[i]] = KnightBase::eeg_scale * + cast_16bit_to_int32 (b + 1 + 2 * i); // CHANGE TO 2+2*i if not working } // other channel data retrieval diff --git a/src/board_controller/neuropawn/knight_base.cpp b/src/board_controller/neuropawn/knight_base.cpp index a86714892..e7cea84c4 100644 --- a/src/board_controller/neuropawn/knight_base.cpp +++ b/src/board_controller/neuropawn/knight_base.cpp @@ -12,6 +12,7 @@ using json = nlohmann::json; constexpr int KnightBase::start_byte; constexpr int KnightBase::end_byte; +constexpr double KnightBase::eeg_scale; KnightBase::KnightBase (int board_id, struct BrainFlowInputParams params) : Board (board_id, params) { diff --git a/src/board_controller/neuropawn/knight_imu.cpp b/src/board_controller/neuropawn/knight_imu.cpp index c338fc709..f1ee2f342 100644 --- a/src/board_controller/neuropawn/knight_imu.cpp +++ b/src/board_controller/neuropawn/knight_imu.cpp @@ -1,7 +1,6 @@ #include #include #include -#include #include #include "custom_cast.h" @@ -35,7 +34,6 @@ void KnightIMU::read_thread () unsigned char b[frame_payload_size] = {0}; - float eeg_scale = 4 / float ((pow (2, 15) - 1)) / 12 * 1000000.; int num_rows = board_descr["default"]["num_rows"]; double *package = new double[num_rows]; for (int i = 0; i < num_rows; i++) @@ -91,7 +89,8 @@ void KnightIMU::read_thread () const int exg_offset = 1; for (unsigned int i = 0; i < eeg_channels.size () && i < exg_channels_count; i++) { - package[eeg_channels[i]] = eeg_scale * cast_16bit_to_int32 (b + exg_offset + 2 * i); + package[eeg_channels[i]] = + KnightBase::eeg_scale * cast_16bit_to_int32 (b + exg_offset + 2 * i); } // other channel data retrieval (keep old behavior)