Programming Reference:MatlabFilter
The MatlabFilter calls the Matlab engine to act upon signals, parameters, and states. It provides the full BCI2000 filter interface to a Matlab filter implementation.
Filter Interface
For each BCI2000 filter member function, there is a corresponding Matlab function as follows:
GenericFilter member Matlab function syntax ==================== ====================== Constructor [parameters, states] = bci_Construct Destructor bci_Destruct Preflight out_signal_dim = bci_Preflight( in_signal_dim ) Initialize bci_Initialize( in_signal_dim, out_signal_dim ) Process out_signal = bci_Process( in_signal ) StartRun bci_StartRun StopRun bci_StopRun Resting bci_Resting Halt bci_Halt
Existence of the above-listed Matlab functions is not mandatory. The MatlabFilter uses the Matlab exist command to determine whether a given function is available, and will not try to call that function when this is not the case.
If either of the bci_Preflight, bci_Initialize, or bci_Process functions is not available, a warning will be displayed to the user.
Accessing Parameters and States
Parameters and states are accessible via global Matlab structs called bci_Parameters and bci_States. In Matlab, write
global bci_Parameters bci_States; my_sampling_rate = bci_Parameters.SamplingRate;
- Parameter values may be changed from inside the bci_StopRun script, and will automatically be propagated to the other modules.
- State values may be modified from the bci_Process function.
Declaring Parameters and States
To add parameters and states to the BCI2000 list of states, the bci_Construct function may return non-empty cell arrays of strings in its parameters and states return values. The strings constituting these cell arrays are parameter and state definitions.
Your added parameters will appear in the operator module's parameter configuration dialog. Your parameter definition's section name will be used to direct its position in the configuration dialog's register cards:
MyFilter int MyParam= 2 0 0 2 // ...
will display the MyParam parameter on separate register card named MyFilter.
Filtering:MyFilter int MyParam= 2 0 0 2 // ...
will display the parameter on the Filtering register card, inside a group called MyFilter.
Signal Format
BCI2000 signals are mapped to Matlab matrices with channel index first, and sample (element) index second. Signal dimension arguments of bci_Preflight and bci_Initialize are vectors of integers (1x2 matrices) as in [n_channels n_elements].
Error Reporting
To report errors from Matlab functions, use Matlab's error command. Your error messages will be displayed to the user from the operator module.
Combining with BCI2000 Signal Processing Filters
In the BCI2000 binary distribution, the MatlabFilter is shipped inside the MatlabSignalProcessing executable. There, the signal processing chain consists of the SpatialFilter and the MatlabFilter. However, by editing src/core/SignalProcessing/Matlab/PipeDefinition.cpp, you may add as many signal processing filters as you wish. (See Programming Reference:Filter Chain for information about defining a filter chain.)
This modification requires access to the BCI2000 source code. You will need to rebuild the MatlabSignalProcessing executable.
Command Line Options
MatlabWD
By default, the Matlab engine's working directory is set to the signal processing module's working directory at startup. When using the Matlab filter for signal processing, your filter's code will be contained in the bci_Process and associated Matlab functions, which will typically be located inside a dedicated directory. Thus, you may switch between Matlab-based filter implementations by selecting a Matlab working directory at startup. This may be done by specifying the MatlabWD parameter from the command line when starting the MatlabSignalProcessing module:
start MatlabSignalProcessing.exe --MatlabWD="./matlab" 127.0.0.1
will change Matlab's working directory to a directory called "matlab" inside the BCI2000 "prog" directory at startup, and execute bci_Process and associated functions from there.
This parameter must be set from the command line; later changes will have no effect.
MatlabStayOpen
By default, the Matlab instance associated with the Matlab engine is closed when BCI2000 quits. Generally, this behavior is desired to ensure a well-defined BCI2000 system state after startup. For debugging purposes, it is sometimes useful to have the engine's command window available even after BCI2000 has been quit. This behavior is controlled by another command-line parameter, MatlabStayOpen, which may take the following values:
- 0 is the default (no change in behavior),
- 1 keeps the Matlab engine's command window open but clears variables used to transmit information forth and back between BCI2000 and Matlab,
- 2 also preserves intermediate variables in the Matlab engine's workspace.
To set this parameter to 2, use this command line to start up the signal processing module:
start MatlabSignalProcessing.exe --MatlabStayOpen=2 127.0.0.1
Once the MatlabStayOpen parameter has been set from the command line, it may be modified in the Operator Module's parameter configuration dialog. The change will be applied when clicking Set Config.
Troubleshooting
Debugging Matlab functions
- Start BCI2000. The MatlabFilter will open a Matlab instance in its own window in minimized state.
- Switch to the minimized Matlab instance.
- Type, e.g.,
edit bci_Process.m
to open a Matlab editor window connected to the Matlab interactive window. - In the editor window, set breakpoints as you would normally.
- Execution will be paused, and you may examine variables moving the mouse over them.
Matlab doesn't find your scripts
Make sure your script directory is part of the Matlab search path. Example scripts are located inside prog/matlab.
There is no Matlab engine started up
Executematlab /regserver
from the command line when logged in with administrative privileges.
Changes to M-files appear to have no effect
Switch to the Matlab engine's command window, and enterclear;
or clear scriptname;
each time you change a Matlab function.
You get linker errors when rebuilding MatlabSignalProcessing
If you get linker errors after editing PipeDefinition.cpp, make sure that all filters' cpp files are part of the MatlabSignalProcessing project.
See also
Technical Reference:Core Modules#Signal Processing Module, Technical Reference:Parameter Definition, Technical Reference:State Definition, Programming Reference:GenericFilter Class, Programming Reference:Filter Chain, Programming Tutorial:Implementing a Filter using Matlab Scripts