- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在从程序中检索正确值时遇到问题。我目前正在使用 startService 以便从服务类启动计时器并能够从我的 mainActivity 类关闭它。我使用的示例激活类中的计时器,似乎工作得很好,但问题是我无法从 mainActivity 类中关闭它。
PS。我在我的程序中使用 EPOC+ EEG 耳机。这是我的 Activity 训练课
import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;
public class ActivityTraining extends Activity implements EngineInterface {
EngineConnector engineConnector;
Spinner spinAction;
Button btnTrain, btnClear;
ProgressBar progressBarTime,progressPower;
AdapterSpinner spinAdapter;
ImageView imgBox;
ArrayList<DataSpinner> model = new ArrayList<DataSpinner>();
int indexAction, _currentAction,userId=0,count=0;
Timer timer;
TimerTask timerTask;
float _currentPower = 0;
float startLeft = -1;
float startRight = 0;
float widthScreen = 0;
boolean isTraining =false;
ArrayList<Song> songList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_trainning);
engineConnector = EngineConnector.shareInstance();
engineConnector.delegate = this;
init();
songList = (ArrayList<Song>) getIntent()
.getSerializableExtra(MusicPhoneUtils.SONG_LIST_INTENT);
Log.d("ActivityTraining", "GOT SONG COUNT = " + songList.size());
}
public void init() {
spinAction=(Spinner)findViewById(R.id.spinnerAction);
btnTrain=(Button)findViewById(R.id.btstartTraing);
btnClear=(Button)findViewById(R.id.btClearData);
btnClear.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
switch (indexAction){
case 0:
engineConnector.trainningClear(IEmoStateDLL.IEE_MentalCommandAction_t.MC_NEUTRAL.ToInt());
break;
case 1:
engineConnector.trainningClear(IEmoStateDLL.IEE_MentalCommandAction_t.MC_PUSH.ToInt());
break;
case 2:
engineConnector.trainningClear(IEmoStateDLL.IEE_MentalCommandAction_t.MC_PULL.ToInt());
break;
case 3:
engineConnector.trainningClear(IEmoStateDLL.IEE_MentalCommandAction_t.MC_LEFT.ToInt());
break;
case 4:
engineConnector.trainningClear(IEmoStateDLL.IEE_MentalCommandAction_t.MC_RIGHT.ToInt());
break;
default:
break;
}
}
});
progressBarTime=(ProgressBar)findViewById(R.id.progressBarTime);
progressBarTime.setVisibility(View.INVISIBLE);
progressPower=(ProgressBar)findViewById(R.id.ProgressBarpower);
imgBox = (ImageView)findViewById(R.id.imgBox);
setDataSpinner();
spinAction.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
indexAction = arg2;
}
public void onNothingSelected(AdapterView<?> arg0) {
//TODO Auto-genereted method stub
}
});
这是我调用服务类来启动
Intent strtService = new Intent().setClass(getApplicationContext(), StartEndEpocService.class);
startService(strtService);
这是原始计时器所在的位置
Timer timeListenAction = new Timer();
timeListenAction.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
handlerUpdateUI.sendEmptyMessage(1);
}
}, 0, 20);
}
从 Service 类调用连接方法,将值传递给 handlerUpdateUI
public void connect() {
handlerUpdateUI.sendEmptyMessage(1);
}
Handler handlerUpdateUI = new Handler(){
public void handleMessage(Message msg) {
switch (msg.what){
case 0:
count++;
int trainninTime = (int)MentalCommandDetection.IEE_MentalCommandGetTrainingTime(userId)[1]/1000;
if(trainninTime>0){
progressBarTime.setProgress(count/trainninTime);
}
if (progressBarTime.getProgress()>=100){
timerTask.cancel();
timer.cancel();
}
break;
case 1:
changePages();
default:
break;
}
};
};
public void startTrainingMentalcommand(IEmoStateDLL.IEE_MentalCommandAction_t MentalCommandAction) {
isTraining = engineConnector.startTrainingMetalcommand(isTraining, MentalCommandAction);
btnTrain.setText((isTraining) ? "Abort Trainning" : "Train");
}
public void setDataSpinner(){
model.clear();
DataSpinner data = new DataSpinner();
data.setTvName("Neutral");
data.setChecked(engineConnector.checkTrained(IEmoStateDLL.IEE_MentalCommandAction_t.MC_NEUTRAL.ToInt()));
model.add(data);
data = new DataSpinner();
data.setTvName("Push");
data.setChecked(engineConnector.checkTrained(IEmoStateDLL.IEE_MentalCommandAction_t.MC_PUSH.ToInt()));
model.add(data);
data = new DataSpinner();
data.setTvName("Pull");
data.setChecked(engineConnector.checkTrained(IEmoStateDLL.IEE_MentalCommandAction_t.MC_PULL.ToInt()));
model.add(data);
data=new DataSpinner();
data.setTvName("Left");
data.setChecked(engineConnector.checkTrained(IEmoStateDLL.IEE_MentalCommandAction_t.MC_LEFT.ToInt()));
model.add(data);
data=new DataSpinner();
data.setTvName("Right");
data.setChecked(engineConnector.checkTrained(IEmoStateDLL.IEE_MentalCommandAction_t.MC_RIGHT.ToInt()));
model.add(data);
spinAdapter = new AdapterSpinner(this, R.layout.row, model);
spinAdapter.setDropDownViewResource(R.layout.support_simple_spinner_dropdown_item);
spinAction.setAdapter(spinAdapter);
}
@Override
public boolean onCreateOptionMenu(Menu menu){
getMenuInflater().inflate(R.menu.activity_trainning, menu);
return true;
}
public void TimerTask(){
count = 0;
timerTask = new TimerTask() {
@Override
public void run() {
handlerUpdateUI.sendEmptyMessage(0);
}
};
}
private void changePages() {
//currentAction(_currentAction, _currentPower);
float power = _currentPower;
Log.e("ActivityTraining", "current_action: " + _currentAction);
Log.e("ActivityTraining", "power: " + power);
if ((_currentAction == IEmoStateDLL.IEE_MentalCommandAction_t.MC_PUSH.ToInt() && power > 0)) {
Log.e("ActivityTraining", "current_action: " + _currentAction);
Log.e("ActivityTraining", "power: " + power);
Intent MC_RIGHT = new Intent().setClass(getApplicationContext(), FragmentBondActivity.class);
MC_RIGHT.putExtra(MusicPhoneUtils.SONG_LIST_INTENT, songList);
MC_RIGHT.putExtra(MusicPhoneUtils.START_AUTO_PLAY_INTENT, false);
MC_RIGHT.putExtra(MusicPhoneUtils.LAST_SONG_USER_PLAYED_INTENT,
getIntent().getSerializableExtra(MusicPhoneUtils.LAST_SONG_USER_PLAYED_INTENT));
MC_RIGHT.putExtra("target", "play");
startActivity(MC_RIGHT);
}
if (((_currentAction == IEmoStateDLL.IEE_MentalCommandAction_t.MC_LEFT.ToInt())) && power > 0) {
Log.e("ActivityTraining", "current_action: " + _currentAction);
Log.e("ActivityTraining", "power: " + power);
Intent MC_LEFT = new Intent().setClass(getApplicationContext(),FragmentBondActivity.class);
MC_LEFT.putExtra(MusicPhoneUtils.SONG_LIST_INTENT, songList);
MC_LEFT.putExtra("target", "songList");
startActivity(MC_LEFT);
}
if(((_currentAction == IEmoStateDLL.IEE_MentalCommandAction_t.MC_RIGHT.ToInt())) && power > 0) {
Log.e("ActivityTraining", "current_action: " + _currentAction);
Log.e("ActivityTraining", "power: " + power);
Intent MC_RIGHT = new Intent().setClass(getApplicationContext(), SettingsActivity.class);
startActivity(MC_RIGHT);
}
if(((_currentAction == IEmoStateDLL.IEE_MentalCommandAction_t.MC_PULL.ToInt())) && power > 0) {
Log.e("ActivityTraining", "current_action: " + _currentAction);
Log.e("ActivityTraining", "power: " + power);
Intent MC_PULL = new Intent().setClass(getApplicationContext(), MainActivity.class);
MC_PULL.putExtra(MusicPhoneUtils.SONG_LIST_INTENT, songList);
MC_PULL.putExtra("target", "songList");
startActivity(MC_PULL);
}
}
public void enableClick() {
btnClear.setClickable(true);
spinAction.setClickable(true);
}
@Override
public void userAdd(int userId) {
// TODO Auto-generated method stub
this.userId=userId;
}
@Override
public void userRemoved() {
// TODO Auto-generated method stub
}
@Override
public void trainStarted() {
// TODO Auto-generated method stub
progressBarTime.setVisibility(View.VISIBLE);
btnClear.setClickable(false);
spinAction.setClickable(false);
timer = new Timer();
TimerTask();
timer.schedule(timerTask , 0, 10);
}
@Override
public void trainSucceed() {
// TODO Auto-generated method stub
progressBarTime.setVisibility(View.VISIBLE);
btnTrain.setText("Train");
enableClick();
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
ActivityTraining.this);
// set title
alertDialogBuilder.setTitle("Training Succeeded");
// set dialog message
alertDialogBuilder
.setMessage("Training is successful. Accept this training?")
.setCancelable(false)
.setIcon(R.drawable.ic_launcher)
.setPositiveButton("Yes",
new DialogInterface.OnClickListener() {
public void onClick(
DialogInterface dialog,int which) {
engineConnector.setTrainControl(MentalCommandDetection.IEE_MentalCommandTrainingControl_t.MC_ACCEPT.getType());
}
})
.setNegativeButton("No",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
engineConnector.setTrainControl(MentalCommandDetection.IEE_MentalCommandTrainingControl_t.MC_REJECT.getType());
}
});
AlertDialog alertDialog = alertDialogBuilder.create();
alertDialog.show();
}
@Override
public void trainFailed(){
progressBarTime.setVisibility(View.INVISIBLE);
btnTrain.setText("Train");
enableClick();
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
ActivityTraining.this);
// set title
alertDialogBuilder.setTitle("Training Failed");
// set dialog message
alertDialogBuilder
.setMessage("Signal is noisy. Can't training")
.setCancelable(false)
.setIcon(R.drawable.ic_launcher)
.setPositiveButton("OK",
new DialogInterface.OnClickListener() {
public void onClick(
DialogInterface dialog, int which) {
}
});
AlertDialog alertDialog = alertDialogBuilder.create();
alertDialog.show();
isTraining = false;
}
@Override
public void trainCompleted() {
// TODO Auto-generated method stub
DataSpinner data=model.get(indexAction);
data.setChecked(true);
model.set(indexAction, data);
spinAdapter.notifyDataSetChanged();
isTraining = false;
}
@Override
public void trainRejected() {
// TODO Auto-generated method stub
DataSpinner data=model.get(indexAction);
data.setChecked(false);
model.set(indexAction, data);
spinAdapter.notifyDataSetChanged();
enableClick();
isTraining = false;
}
@Override
public void trainErased() {
// TODO Auto-generated method stub
new AlertDialog.Builder(this)
.setTitle("Training Erased")
.setMessage("")
.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
}
})
.setIcon(android.R.drawable.ic_dialog_alert)
.show();
DataSpinner data=model.get(indexAction);
data.setChecked(false);
model.set(indexAction, data);
spinAdapter.notifyDataSetChanged();
enableClick();
isTraining = false;
}
@Override
public void trainReset() {
// TODO Auto-generated method stub
if(timer!=null){
timer.cancel();
timerTask.cancel();
}
isTraining = false;
progressBarTime.setVisibility(View.VISIBLE);
progressBarTime.setProgress(0);
enableClick();
};
问题就从这里开始。当我从服务类调用计时器时,_currentAction 和 _currentPower 的值不会更新到该类中。连接脑电耳机后正常值应如下: _当前操作 = 1 _当前功率 = 0.0此外,它不会更新类中的值,并且不断返回 _currentAction = 0 和 _currentPower = 0.0 的值虽然这是正常的,因为这些是在类的开头声明变量的值。
当我在 ActivityTraining 类中使用计时器时,值会得到很好的更新。
@Override
public void currentAction(int typeAction, float power) {
// TODO Auto-generated method stub
progressPower.setProgress((int)(power*100));
_currentAction = typeAction;
_currentPower = power;
}
public void TrainingHomePage(View v) {
Intent goingB = new Intent(this, MainActivity.class);
setResult(RESULT_OK, goingB);
finish();
}
}
这是我的服务等级
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.widget.Toast;
import com.example.assiotiscy.headshake.MentalCommand.ActivityTraining;
import java.util.Timer;
import java.util.TimerTask;
public class StartEndEpocService extends Service {
ActivityTraining activityTraining = new ActivityTraining();
Timer timeListenAction;
@Override
public void onCreate() {
super.onCreate();
//Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show();
thread();
}
private void thread () {
timeListenAction =new Timer();
timeListenAction.scheduleAtFixedRate(new TimerTask() {
@Override
public void run () {
activityTraining.connect();
}
},0,20);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(this, "Service Started...", Toast.LENGTH_SHORT).show();
return START_NOT_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
// We don't provide binding, so return null
return null;
}
@Override
public void onDestroy() {
Toast.makeText(this, "Service Stopped...", Toast.LENGTH_SHORT).show();
if (timeListenAction != null){
timeListenAction.cancel();
timeListenAction.purge();
}
}
}
/最后这是我的 EngineConnector 类。/
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import com.emotiv.insight.IEdk;
import com.emotiv.insight.IEdkErrorCode;
import com.emotiv.insight.IEmoStateDLL;
import com.emotiv.insight.IEmoStateDLL.IEE_MentalCommandAction_t;
import com.emotiv.insight.MentalCommandDetection;
import com.emotiv.insight.MentalCommandDetection.IEE_MentalCommandTrainingControl_t;
import java.util.Timer;
import java.util.TimerTask;
public class EngineConnector {
public static Context context;
public static EngineConnector engineConnectInstance = null;
private Timer timer;
private TimerTask timerTask;
public boolean isConnected = false;
private int state;
private int userId = -1;
private boolean firstActionAdded = false;
public EngineInterface delegate;
public static void setContext(Context context) {
EngineConnector.context = context;
}
public static EngineConnector shareInstance() {
if (engineConnectInstance == null) {
engineConnectInstance = new EngineConnector() {
};
}
return engineConnectInstance;
}
public EngineConnector() {
connectEngine();
}
private void connectEngine() {
IEdk.IEE_EngineConnect(EngineConnector.context, "");
timer = new Timer();
timerTask();
timer.schedule(timerTask, 0, 10);
}
这是脑电图的连接发生的情况。我还从这个类中删除了一些不必要的代码。
public void timerTask() {
if (timerTask != null)
return;
timerTask = new TimerTask() {
@Override
public void run() {
/*Connect device with Epoc Plus headset*/
int numberDevice = IEdk.IEE_GetEpocPlusDeviceCount();
//Log.d("EngineConnector: ", "numberDevice: " + numberDevice);
if (numberDevice != 0) {
if (!isConnected)
IEdk.IEE_ConnectEpocPlusDevice(0, false);
}
/*************************************/
state = IEdk.IEE_EngineGetNextEvent();
// Log.d("EngineConnector:- ", "State: " + state);
if (state == IEdkErrorCode.EDK_OK.ToInt()) {
int eventType = IEdk.IEE_EmoEngineEventGetType();
//Log.d("EngineConnector", "eventType: " +eventType);
switch (eventType) {
case TYPE_USER_ADD:
Log.e("connect", "User Added");
isConnected = true;
// TURNING OFF HEADSET WILL RESET ALL ACTIONS EVEN IF IN APP THAT ACTION STILL HAS "V" BESIDE
// userId is re-set by IEE_EmoEngineEventGetUserId();
userId = IEdk.IEE_EmoEngineEventGetUserId();
Log.e("UserID ", "" + userId);
hander.sendEmptyMessage(HANDLER_USER_ADD);
// This is the issue: by default activated action is Push (set by library so there is nothing we could do in our side
// We're going to get around this issue by replace Push with first action that user would choose in enableMentalcommandActions() method
long[] activeAction = MentalCommandDetection.IEE_MentalCommandGetActiveActions(userId);
Log.e("Default Action list: ", "0x" + Long.toBinaryString(activeAction[1]));
break;
case TYPE_USER_REMOVE:
Log.e("disconnect", "User Removed");
isConnected = false;
userId = -1;
hander.sendEmptyMessage(HANDLER_USER_REMOVE);
break;
case TYPE_EMOSTATE_UPDATE:
if (!isConnected)
break;
IEdk.IEE_EmoEngineEventGetEmoState();
hander.sendMessage(hander
.obtainMessage(HANDLER_ACTION_CURRENT));
break;
case TYPE_METACOMMAND_EVENT:
int type = MentalCommandDetection.IEE_MentalCommandEventGetType();
if (type == MentalCommandDetection.IEE_MentalCommandEvent_t.IEE_MentalCommandTrainingStarted
.getType()) {
Log.e("MentalCommand", "training started");
hander.sendEmptyMessage(HANDLER_TRAIN_STARTED);
} else if (type == MentalCommandDetection.IEE_MentalCommandEvent_t.IEE_MentalCommandTrainingSucceeded
.getType()) {
Log.e("MentalCommand", "training Succeeded");
hander.sendEmptyMessage(HANDLER_TRAIN_SUCCEED);
} else if (type == MentalCommandDetection.IEE_MentalCommandEvent_t.IEE_MentalCommandTrainingCompleted
.getType()) {
Log.e("MentalCommand", "training Completed");
hander.sendEmptyMessage(HANDLER_TRAIN_COMPLETED);
} else if (type == MentalCommandDetection.IEE_MentalCommandEvent_t.IEE_MentalCommandTrainingDataErased
.getType()) {
Log.e("MentalCommand", "training erased");
hander.sendEmptyMessage(HANDLER_TRAIN_ERASED);
} else if (type == MentalCommandDetection.IEE_MentalCommandEvent_t.IEE_MentalCommandTrainingFailed
.getType()) {
Log.e("MentalCommand", "training failed");
hander.sendEmptyMessage(HANDLER_TRAIN_FAILED);
} else if (type == MentalCommandDetection.IEE_MentalCommandEvent_t.IEE_MentalCommandTrainingRejected
.getType()) {
Log.e("MentalCommand", "training rejected");
hander.sendEmptyMessage(HANDLER_TRAIN_REJECTED);
} else if (type == MentalCommandDetection.IEE_MentalCommandEvent_t.IEE_MentalCommandTrainingReset
.getType()) {
Log.e("MentalCommand", "training Reset");
hander.sendEmptyMessage(HANDLER_TRAINED_RESET);
}
break;
default:
break;
}
}
}
};
}
Handler hander = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case HANDLER_USER_ADD:
if (delegate != null)
delegate.userAdd(userId);
break;
case HANDLER_USER_REMOVE:
if (delegate != null)
delegate.userRemoved();
break;
在 Handler_ACTION_CURRENT 中:currentAction 方法引用自 Activity Training 类
case HANDLER_ACTION_CURRENT:
if (delegate != null)
delegate.currentAction(IEmoStateDLL
.IS_MentalCommandGetCurrentAction(), IEmoStateDLL
.IS_MentalCommandGetCurrentActionPower());
break;
case HANDLER_TRAIN_STARTED:
if (delegate != null)
delegate.trainStarted();
break;
case HANDLER_TRAIN_SUCCEED:
if (delegate != null)
delegate.trainSucceed();
break;
case HANDLER_TRAIN_FAILED:
if (delegate != null)
delegate.trainFailed();
break;
case HANDLER_TRAIN_COMPLETED:
if (delegate != null)
delegate.trainCompleted();
break;
case HANDLER_TRAIN_ERASED:
if (delegate != null)
delegate.trainErased();
break;
case HANDLER_TRAIN_REJECTED:
if (delegate != null)
delegate.trainRejected();
break;
case HANDLER_TRAINED_RESET:
if (delegate != null)
delegate.trainReset();
break;
default:
break;
}
}
};
}
我想知道从服务类激活计时器的问题可能是什么。
提前谢谢
最佳答案
我的问题的问题是,由于我的 ActivityTrainning 类已经是一个 Activity ,并且我正在将其另一个对象创建到服务类中(ActivityTrainning ActivityTrainning = new ActivityTrainning()),所以我有 2 个不同的 ActivityTrainning 类对象。
一个简单/好的解决方案如下:
Activity A 应该有一个变量
static ActivityA activityA;
在onCreate状态:
activityA = this;
并添加此方法:
public static ActivityA getInstance(){
return activityA;
}
在 Activity B 中,调用:
ActivityA.getInstance().myFunction(); //call myFunction using activityA
关于java - 从服务类调用并连接到 EEG 耳机时出现计时器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43454325/
我正在尝试在 Python 中对 EEG 信号执行 FFT,然后根据带宽确定它是 alpha 信号还是 beta 信号。它看起来不错,但结果图与它们应该的完全不同,频率和幅度值不是我预期的。感谢任何帮
我在从程序中检索正确值时遇到问题。我目前正在使用 startService 以便从服务类启动计时器并能够从我的 mainActivity 类关闭它。我使用的示例激活类中的计时器,似乎工作得很好,但问题
我有以 3D numpy 数组(纪元 * channel * 时间点)形式出现的 EEG 数据。 timepoint 是一个包含每个采样时间点的 256 元素数组(总共 1s,256Hz)。 epoc
我必须使用 eegkit 包在 R 上分析一些 EEG 数据(脑电图)。 文件的格式为 .eeg 。有人知道如何用 R 读取这些文件吗? 谢谢 最佳答案 您可以查看Medical Image Anal
我有点不确定如何处理这个问题,因为这对我来说是个新话题,因此非常感谢对我的代码的任何指导。我有一组脑电图记录(18949 条脑电图记录,采样率为 500Hz,记录单位为 nV)。我正在尝试根据数据创建
我在 csv 文件中有一些原始脑电图数据,这些数据是使用 Emotiv EPOC 捕获的,作为我为本科论文所做的实验的一部分。我上传了其中一个文件 here以供引用。我希望对特定波段的数据进行带通滤波
我正在学习用于脑电图分析的 MNE 软件包的基础知识。我能够加载我的数据(.edf 格式)并执行各种操作。但是, 中描述的绘图功能 https://mne.tools/stable/auto_tuto
我在 MATLAB 中有一个简单的 EEG 信号,如下图所示。而我想要的是根据下表提取脑电图的成分。 Delta - 高达 4 Hz; Theta - 4 -> 8 赫兹 阿尔法 - 8 -> 13
我正在使用名为 Gtec.NAUTILUS 的 EEG 检测套件,它为我提供 500hz 下 32 个 channel 的二进制数据。然后数据将转换为 CSV 格式。现在我想使用 python 3.5
我正在使用名为 Gtec.NAUTILUS 的 EEG 检测套件,它为我提供 500hz 下 32 个 channel 的二进制数据。然后数据将转换为 CSV 格式。现在我想使用 python 3.5
我是 BCI 新手。我有来自 Neurosky 的 Mindset EEG 设备我将来自设备的原始数据值记录在 csv 文件中。我可以从 csv 中读取数据并将其提取到 Matlab 中,然后应用 F
我有一个 BrainVision 核心数据格式的数据集,它由每个受试者的头文件 (.vhdr)、标记文件 (.vmrk) 和原始 EEG 数据 (.eeg) 文件组成。我知道 python 有 mne
我已经使用 Python 的 MNE 包加载了一些 EEG 数据。数据有 46 个从 10-20 蒙太奇获得的记录 channel ,但我们已经确定了许多死 channel ,只想关注剩余的 chan
我正在从事一个项目,我想在其中显示由可移植设备(例如,通过 Wifi 或蓝牙进行无线数据传输的微 Controller )测量的生物传感器 EEG/ECG 数据。为此,我需要与可移植设备/微 Cont
我是一名优秀的程序员,十分优秀!