The Zephyr Scientific Library (zscilib) is an attempt to provide a set of
functions useful for scientific computing, data analysis and data manipulation
in the context of resource constrained embedded hardware devices.
It is written entirely in C, and while the main development target for the
library is the Zephyr Project,
it tries to be as portable as possible, and a standalone reference project
is included to use this library in non-Zephyr-based projects.
This version of zscilib has been developed and tested against Zephyr 3.3.0.
Motivation
As the processing power of small, embedded MCUs increases and costs fall, more
computation can be done on the endnode itself. This allows for more of the
‘complex’ data analysis that used to take place at the PC or server level
(data aggregation, statistical analysis, etc.) to be done in less time,
using less data storage, and at a lower overall processing cost on small,
embedded devices.
A key goal of zscilib is to allow more data processing to happen on the
endnode.
By generating scientifically-relevant data points (standard SI units,
pre-filtered data, etc.) directly on the endnode, zscilib aims to be a bridge
between raw data and more numerically complex toolkits like gsl, numpy
or R.
What makes zscilib distinct?
Numerous high quality, mature, open source scientific libraries already exist:
Despite the wealth of mature functions in these existing libraries, though,
they tend to have the following two problems in an embedded context:
They are overly broad and resource intensive (GSL, etc.), and thus aren’t
appropriate for small, resource constrained devices like the ARM Cortex M
family.
They are missing many of the domain-specific features required to convert
raw sensor data into actionable information (CMSIS-DSP, Lis).
The second item is of particular importance, since the goal of embedded systems
is often ‘sensing’ via raw data, correlating that data, and acting on the final
data points or passing them on for further analysis.
CMSIS-DSP contains a number of highly efficient algorithms for filtering
raw sensor data, but it doesn’t offer any domain-specific assistance converting
filtered accelerometer vectors into orientation data, for example, or reading
a set of photodiodes and converting that data into a useful photometric value
like lux. It is excellent at ‘conditioning’ data, but not at ‘understanding’ it.
zscilib aims to find a middle ground between these two, allowing for richer
processing of raw data, but within the confines and limitations of the class
of microcontrollers commonly used on low-cost sensor endnodes.
Quick Start: Standalone
A few makefile-based projects are included in samples/standalone showing
how zscilib can be used independent of Zephyr.
If you already have an appropriate GNU toolchain and build tools (make, etc.)
installed, you can simply execute the following commands:
$ cd samples/standalone/svd_pinv
$ make
$ bin/zscilib
Hello, zscilib!
...
Quick Start: Zephyr RTOS
Running a sample application
To run one of the sample applications using qemu, run the following commands:
Be sure to run source zephyr/zephyr-env.sh (OS X or Linux) or
.\zephyr\zephyr-env.cmd (Windows) before the commands below! This also
assumes qemu-system-arm is available on your local system.
To run compliance tests to make sure submitted code matches Zephyr PR
requirements, run this (updating HEAD~2 for the number of commits to check,
or setting it to origin/master.. to check everything):
The -py extension is optional, and makes use of a version of GDB from the
ARM GNU toolchain releases that enables Python scripts to be used with your
debug sessions. See the LVC21-308 presentation at the top of this
section for details.
From here, you can start debugging with the (gdb) prompt.
For example:
(gdb) b main
(gdb) c
Continuing.
Breakpoint 1, main () at modules/lib/zscilib/samples/matrix/pinv/src/main.c:70
70 printf("\n\nzscilib pseudo-inverse demo\n\n");
(gdb) n
72 pinv_demo();
(gdb) step
pinv_demo () at modules/lib/zscilib/samples/matrix/pinv/src/main.c:25
25 zsl_real_t vi[18 * 3] = {
(gdb) n
...
(gdb) quit
Floating-Point Usage
zscilib can be configured to make use of single-precision (32-bit) or
double-precision (64-bit) floating point values via the
CONFIG_ZSL_SINGLE_PRECISION flag, which will determine the size of
zsl_real_t used throughout the library. The default setting for this
flag is n, meaning 64-bit values are used by default.
There is a tradeoff between the added range and precision that 64-bit
(double-precision) floating point values offer, and the memory and performance
gains of the smaller, less-precise but faster 32-bit (single-precision)
operations.
Due to the reduced precision of single-precision values, certain complex
functions in zscilib are only available when double-precision is enabled
(PINV, SVD, etc.).
Comparison
Single-Precision (32-bit) Floats
Require 4 bytes of memory to store
Have about 7 significant digits of precision
Have a range of about 1.E-36 to 1.E+36
HW acceleration available on Cortex-M4F, Cortex-M7 and most Cortex-M33 MCUs.
Generates smaller, more efficient code than double
Double-Precision (64-bit) Floats
Requires 8 bytes of memory to store
Have about 13 significant digits of precision
Have a range of about 1.E-303 to 1.E+303
HW acceleration generally only available on large, Cortex-M7 MCUs
Generates larger code, with more processing overhead per operation
Float Stack Usage in Zephyr
The sample code in this library typically has the CONFIG_FPU option set,
meaning that floating-point support is configured for
Unshared FP registers mode. This mode is used when the application
has a single thread that uses floating point registers.
If your application makes use of multiple threads, and more than one of
these threads uses floating-point operations, you should also enable the
CONFIG_FPU_SHARING config flag, which configures the kernel for
Shared FP registers mode. In this mode, the floating point registers are
saved and restored during each context switch, even when the associated threads
are not using them. This feature comes at the expense of an extra 72 bytes of
stack memory per stack frame (s0..s15 + FPCSR, plus an alignment word
to ensure that the stack pointer is double-word aligned).
Current Features
Features marked with the
v0.2.0 flag are in progress
or planned as part of the current release cycle, and may be partially
implemented or stubbed at present.
v0.3.0 indicates features planned for that later release.
Linear Algebra
Vector Operations
f32: Single-precision floating-point operations
f64: Double-precision floating-point operations
ARM: Optimised Arm Thumb-2 ASM implementation
Feature
Func
f32
f64
Arm
Notes
Array to vector
zsl_vec_from_arr
x
x
Copy
zsl_vec_copy
x
x
Get subset
zsl_vec_get_subset
x
x
Add
zsl_vec_add
x
x
Subtract
zsl_vec_sub
x
x
Negate
zsl_vec_neg
x
x
Sum
zsl_vec_sum
x
x
2 or more vects
Scalar add
zsl_vec_scalar_add
x
x
Scalar multiply
zsl_vec_scalar_mult
x
x
Scalar divide
zsl_vec_scalar_div
x
x
Distance
zsl_vec_dist
x
x
Between 2 vects
Dot product
zsl_vec_dot
x
x
Norm/abs value
zsl_vec_norm
x
x
Project
zsl_vec_project
x
x
To unit vector
zsl_vec_to_unit
x
x
Cross product
zsl_vec_cross
x
x
Sum of squares
zsl_vec_sum_of_sqrs
x
x
Comp-wise mean
zsl_vec_mean
x
x
Arithmetic mean
zsl_vec_ar_mean
x
x
Reverse
zsl_vec_rev
x
x
Zero to end
zsl_vec_zte
x
x
0 vals to end
Equality check
zsl_vec_is_equal
x
x
Non-neg check
zsl_vec_is_nonneg
x
x
All values >= 0
Contains
zsl_vec_contains
x
x
Quicksort
zsl_vec_sort
x
x
Print
zsl_vec_print
x
x
Matrix Operations
f32: Single-precision floating-point operations
f64: Double-precision floating-point operations
ARM: Optimised Arm Thumb-2 ASM implementation
Feature
Func
f32
f64
Arm
Notes
Array to matrix
zsl_mtx_from_arr
x
x
Copy
zsl_mtx_copy
x
x
Get value
zsl_mtx_get
x
x
Set value
zsl_mtx_set
x
x
Get row
zsl_mtx_get_row
x
x
Set row
zsl_mtx_set_row
x
x
Get col
zsl_mtx_get_col
x
x
Set col
zsl_mtx_set_col
x
x
Add
zsl_mtx_add
x
x
Add (d)
zsl_mtx_add_d
x
x
Destructive
Sum rows
zsl_mtx_sum_rows_d
x
x
Destructive
Sum rows scaled
zsl_mtx_sum_rows_scaled_d
x
x
Destructive
Subtract
zsl_mtx_sub
x
x
Subtract (d)
zsl_mtx_sub_d
x
x
Destructive
Multiply
zsl_mtx_mult
x
x
Multiply (d)
zsl_mtx_mult_d
x
x
Destructive
Multiply sc (d)
zsl_mtx_scalar_mult_d
x
x
Destructive
Multiple row sc (d)
zsl_mtx_scalar_mult_row_d
x
x
Destructive
Transpose
zsl_mtx_trans
x
x
Adjoint 3x3
zsl_mtx_adjoint_3x3
x
x
Adjoint
zsl_mtx_adjoint
x
x
Wedge product
zsl_mtx_vec_wedge
x
Reduce
zsl_mtx_reduce
x
x
Row+col removal
Reduce (iter)
zsl_mtx_reduce_iter
x
x
Iterative ver.
Augment
zsl_mtx_augm_diag
x
x
Adds row+col(s)
Determinant 3x3
zsl_mtx_deter_3x3
x
x
Determinant
zsl_mtx_deter
x
x
Gaussian El.
zsl_mtx_gauss_elim
x
x
Gaussian El. (d)
zsl_mtx_gauss_elim_d
x
x
Destructive
Gaussian Rd.
zsl_mtx_gauss_reduc
x
x
Column norm.
zsl_mtx_cols_norm
x
x
Unitary col vals
Gram-Schimdt
zsl_mtx_gram_schmidt
x
x
Elem. norm.
zsl_mtx_norm_elem
x
x
Norm vals to i,j
Elem. norm. (d)
zsl_mtx_norm_elem_d
x
x
Destructive
Invert 3x3
zsl_mtx_inv_3x3
x
x
Invert
zsl_mtx_inv
x
x
Balance
zsl_mtx_balance
x
x
Householder Ref.
zsl_mtx_householder
x
x
QR decomposition
zsl_mtx_qrd
x
x
QR decomp. iter.
zsl_mtx_qrd_iter
x
Eigenvalues
zsl_mtx_eigenvalues
x
Eigenvectors
zsl_mtx_eigenvectors
x
SVD
zsl_mtx_svd
x
Pseudoinverse
zsl_mtx_pinv
x
Min value
zsl_mtx_min
x
x
Max value
zsl_mtx_max
x
x
Min index
zsl_mtx_min_idx
x
x
Max index
zsl_mtx_max_idx
x
x
Equality check
zsl_mtx_is_equal
x
x
Non-neg check
zsl_mtx_is_notneg
x
x
All values >= 0
Symmetr. check
zsl_mtx_is_sym
x
x
Print
zsl_mtx_print
x
x
Unary matrix operations
The following component-wise unary operations can be executed on a matrix
using the zsl_mtx_unary_op function:
Increment (++)
Decrement (--)
Negative (-)
Logical negation (!)
Round
Abs
Floor
Ceiling
Exponent
Natural log
Log10
Square root
Sin, cos, tan
Asin, acos, atan
Sinh, cosh, tanh
Binary matrix operations
The following component-wise binary operations can be executed on a pair
of symmetric matrices using the zsl_mtx_binary_op function:
Add (a + b)
Subtract (a - b)
Multiply (a * b)
Divide (a / b)
Mean (mean(a, b)
Exponent (a^b)
Min (min(a, b))
Max (max(a, b))
Equal (a == b)
Not equal (a != b)
Less than (a < b)
Greater than (a > b)
Less than or equal to (a <= b)
Greater than or equal to (a >= b)
NOTE: Component-wise unary and binary matrix operations can also
make use of user-defined functions at the application level if the existing
operand list is not sufficient. See zsl_mtx_unary_func and
zsl_mtx_binary_func for details.
Numerical Analysis
Statistics
Mean
Trimmed mean
Weighted mean
Time-weighted mean
De-mean
Percentile (AKA quantile)
Median
Weighted median
Quartile
Interquartile range
Mode
Data range
Mean absolute deviation
Median absolute deviation from median
Variance
Standard deviation
Covariance
Covariance matrix
Linear regression
Multiple linear regression [1]
Weighted multiple minear regression [1]
Quadrid fitting (Least-squars fitting of a quadric surface) [1]
Absolute error
Relative error
Standard error
[1] Only available in double-precision
Probability Operations
Uniform probability density function (PDF)
Uniform distribution mean
Uniform distribution variance
Uniform cumulative distribution function (CDF)
Normal probability density function (PDF)
Normal cumulative distribution function (CDF)
Inverse Error function
Inverse normal cumulative distribution function (CDF)
Factorial
Binomial coefficient
Binomial probability density function (PDF)
Binomial distribution mean
Binomial distribution variance
Binomial cumulative distribution function (CDF)
Information entropy
Bayes’ Theorem
Interpolation
Nearest neighbour (AKA ‘piecewise constant’)
Linear (AKA ‘piecewise linear’)
Natural cubic spline
Physics
Atomic
Nuclear radius
Atomic Radioactive decay
Bohr orbital radius
Bohr orbital velocity
Bohr orbital energy
Bragg’s law
Dynamics
Newton’s second law
Mass-acceleration relationship
Friction (Fn, uK/s)
Normal force on an incline (in newtons based on mass, gravity, angle)
Tension
Dynamic lever
Pendulums
Period
Max Speed
Electrical Components
Capacitance
Charge, voltage
Area, distance
Energy stored in capacitor
Energy stored in inductor
Transformer turns to voltage
Resistor/inductor/capacitor voltage relationship
Resistor/capacitor charge/discharge
Current during charge
Current during discharge
Charge (in coulombs) during charge
Charge (in coulombs) during discharge
Current of RL circuit in time
Electric
Coulomb’s law
Charge density
Potential energy
Electric field
Coulombs potential
Electric flux
Force from a charge
Electricity
Current (charge per second)
Resistors in series/parallel
Capacitors in series/parallel
Resistivity of wire
Ohm’s law
Power
Current, voltage
Voltage, resistance
Current, resistance
Energy
Kinetic energy
Elastic potential energy
Gravitational potential energy
Power (work/energy over time)
Energy lost to friction
Energy of a photon
Mechanical energy of a system
Total energy of a system
Fluids
Density (of substance in Kg/m^2)
Simple pressure (force, area)
Pressure in a fluid (at a certain height/depth, gravity, density, surf. pres.)
Bouyant Force
Fluid flow rate proportion
Fluid force rate proportion
Bernoulli’s equation
Volume flow rate
Gases
Average velocity of a gas molecule (mass, temp, moles)
Ideal gas law (pressure based on moles, temp, volume)
Boyle’s law (relationship of pressure, volume)
Charles/Gay-Lussac law (relationship of pressure, volume)
Gravitation
Orbital period
Escape velocity
Gravitational acceleration
Orbital velocity
Gravitational force
Gravitational potential energy
Kinematics
Change in distance (initial velocity, time, acceleration)
Initial position (final pos, init velocity, accel, time)
Initial position (final pos, init velocity, final velocity, accel)
Change in time (initial and final velocity, acceleration)
Instantaneous velocity (initial velocity, time, acceleration)
CIE 1960 CCT (Duv = 0.0) to 8-bit RGBA (supplied XYZ to RGB color space correlation matrix)
CIE 1960 CCT (Duv = 0.0) to float RGBA (supplied XYZ to RGB color space correlation matrix)
CIE 1960 CCT and Duv pair to CIE 1931 xyY chromaticity
CIE 1960 CCT and Duv pair to CIE 1931 XYZ tristimulus
CIE 1960 (u, v) pair to CIE 1960 CCT and Duv pair using:
McCamy
Ohno 2014
CIE 1931 XYZ tristimulus to 8-bit RGBA (supplied XYZ to RGB color space correlation matrix)
CIE 1931 XYZ tristimulus to float RGBA (supplied XYZ to RGB color space correlation matrix)
[ ] Gamma encode
[ ] Gamma decode
Color Data
Illuminants
A
B
C
D50
D55
D65
E
ICC
CIE Standard Observer Models
CIE 1931 2 degree standard observer color matching functions
CIE 1964 10 degree standard observer color matching functions
CIE Luminous Efficiency Functions
CIE 1988 Photopic
CIE 1951 Scotopic
CIE LERP interpolation helper function
XYZ to RGB Color Space Correlation Matrices
XYZ to linear sRGB (D65)
XYZ to linear sRGB (D50)
XYZ to Adobe RGB 98
XYZ to Sony S-Gamut3.cine D65
XYZ to NTSC
XYZ to PAL/SECAM
XYZ to ITU-R BT.709
XYZ to ITU-R BT.2020
XYZ to ACES Primaries #0 (AP0)
XYZ to ACES Primaries #1 (AP1)
XYZ to DCI-P3
XYZ to DCI-P3+
XYZ to CIE RGB
Chemistry
[ ] Periodic table data including:
[ ] Full name
[ ] Abbreviation
Atomic number
Standard atomic weight
Measurement API (v0.2.0)
The zsl_measurement struct is a proof of concept attempt at representing
measurements in a concise but unambiguous manner.
It consists of:
A measurement type (Base Type + Extended Type)
The SI unit it uses (SI Unit Type)
The specific C type used to represent it in memory (C Type)
Additional meta-data to help interpret the measurement payload
There is an option to adjust the measurement’s scale in +/- 10^n steps
(Scale Factor) from the default SI unit and scale indicated by the SI Unit
Type. For example, if ‘Ampere’ is indicated as the SI unit, the measurement
could indicate that the value is in uA by setting the scale factor to -6.
Measurement struct(s) (see: zsl_measurement)
Base Measurement Types
[ ] Extended Measurement Types
Color
Light
Temperature
[ ] Other groups TBD
SI Units
SI Scales
C Types
Longer Term Planned Features
Help is welcome on the following planned or desirable features.
Scalar Operations
Fast trigonometry approximations
Digital Signal Processing (v0.3.0)
Simple moving average filter
Windowed moving average filter
Weighted moving average filter
Other basic IIR and FIR-type filters and helper functions.
Spectrometry
Conversion between radiometric and photometric units
Radiometric data to lux
Radiometric data to CCT/Duv
Spectral analysis
Calibration
Offset management
Correlation matrix generation
Non-linear compensation
Architecture-Specific Optimisations
Basic tooling has been added to allow for optimised architecture-specific
implementations of key functions in assembly.
At present, this feature isn’t being actively used or developed, but an aim
of zscilib is to add optimised versions of key functions to try to get the
best possible performance out of limited resources.
Initial optimisation will target the Arm Cortex-M family of devices and the
Thumb and Thumb-2 instruction sets, though other architectures can be
accommodated if necessary or useful.
You can format the source code to match this style automatically using the
uncrustify command line tool, which has plugins available for many
common text editors (Atom Beautify, for example).
Zephyr Scientific Library (zscilib)
The Zephyr Scientific Library (zscilib) is an attempt to provide a set of functions useful for scientific computing, data analysis and data manipulation in the context of resource constrained embedded hardware devices.
It is written entirely in C, and while the main development target for the library is the Zephyr Project, it tries to be as portable as possible, and a standalone reference project is included to use this library in non-Zephyr-based projects.
This version of zscilib has been developed and tested against Zephyr 3.3.0.
Motivation
As the processing power of small, embedded MCUs increases and costs fall, more computation can be done on the endnode itself. This allows for more of the ‘complex’ data analysis that used to take place at the PC or server level (data aggregation, statistical analysis, etc.) to be done in less time, using less data storage, and at a lower overall processing cost on small, embedded devices.
By generating scientifically-relevant data points (standard SI units, pre-filtered data, etc.) directly on the endnode, zscilib aims to be a bridge between raw data and more numerically complex toolkits like
gsl,numpyorR.What makes zscilib distinct?
Numerous high quality, mature, open source scientific libraries already exist:
Despite the wealth of mature functions in these existing libraries, though, they tend to have the following two problems in an embedded context:
The second item is of particular importance, since the goal of embedded systems is often ‘sensing’ via raw data, correlating that data, and acting on the final data points or passing them on for further analysis.
CMSIS-DSP contains a number of highly efficient algorithms for filtering raw sensor data, but it doesn’t offer any domain-specific assistance converting filtered accelerometer vectors into orientation data, for example, or reading a set of photodiodes and converting that data into a useful photometric value like lux. It is excellent at ‘conditioning’ data, but not at ‘understanding’ it.
zscilib aims to find a middle ground between these two, allowing for richer processing of raw data, but within the confines and limitations of the class of microcontrollers commonly used on low-cost sensor endnodes.
Quick Start: Standalone
A few makefile-based projects are included in
samples/standaloneshowing how zscilib can be used independent of Zephyr.If you already have an appropriate GNU toolchain and build tools (
make, etc.) installed, you can simply execute the following commands:Quick Start: Zephyr RTOS
Running a sample application
To run one of the sample applications using qemu, run the following commands:
Press
CTRL+Athenxto quit qemu.Running Unit Tests
To run the unit tests for this library, run the following command:
See the
testsfolder for further details.To run compliance tests to make sure submitted code matches Zephyr PR requirements, run this (updating
HEAD~2for the number of commits to check, or setting it toorigin/master..to check everything):Debugging with QEMU
If you wish to debug using QEMU (and with minor variation actual hardware), you can run the following commands to start a new GDB debug session.
In one terminal window, run:
Once the ELF file has been built, we can start a GDB server on the default
1234socket, and wait for a new connection via:In a new terminal window, connect to the GDB server via:
From here, you can start debugging with the
(gdb)prompt.For example:
Floating-Point Usage
zscilib can be configured to make use of single-precision (32-bit) or double-precision (64-bit) floating point values via the
CONFIG_ZSL_SINGLE_PRECISIONflag, which will determine the size ofzsl_real_tused throughout the library. The default setting for this flag isn, meaning 64-bit values are used by default.There is a tradeoff between the added range and precision that 64-bit (double-precision) floating point values offer, and the memory and performance gains of the smaller, less-precise but faster 32-bit (single-precision) operations.
Comparison
Single-Precision (32-bit) Floats
Double-Precision (64-bit) Floats
Float Stack Usage in Zephyr
The sample code in this library typically has the
CONFIG_FPUoption set, meaning that floating-point support is configured for Unshared FP registers mode. This mode is used when the application has a single thread that uses floating point registers.If your application makes use of multiple threads, and more than one of these threads uses floating-point operations, you should also enable the
CONFIG_FPU_SHARINGconfig flag, which configures the kernel for Shared FP registers mode. In this mode, the floating point registers are saved and restored during each context switch, even when the associated threads are not using them. This feature comes at the expense of an extra 72 bytes of stack memory per stack frame (s0..s15+FPCSR, plus an alignment word to ensure that the stack pointer is double-word aligned).Current Features
Linear Algebra
Vector Operations
zsl_vec_from_arrzsl_vec_copyzsl_vec_get_subsetzsl_vec_addzsl_vec_subzsl_vec_negzsl_vec_sumzsl_vec_scalar_addzsl_vec_scalar_multzsl_vec_scalar_divzsl_vec_distzsl_vec_dotzsl_vec_normzsl_vec_projectzsl_vec_to_unitzsl_vec_crosszsl_vec_sum_of_sqrszsl_vec_meanzsl_vec_ar_meanzsl_vec_revzsl_vec_ztezsl_vec_is_equalzsl_vec_is_nonnegzsl_vec_containszsl_vec_sortzsl_vec_printMatrix Operations
zsl_mtx_from_arrzsl_mtx_copyzsl_mtx_getzsl_mtx_setzsl_mtx_get_rowzsl_mtx_set_rowzsl_mtx_get_colzsl_mtx_set_colzsl_mtx_addzsl_mtx_add_dzsl_mtx_sum_rows_dzsl_mtx_sum_rows_scaled_dzsl_mtx_subzsl_mtx_sub_dzsl_mtx_multzsl_mtx_mult_dzsl_mtx_scalar_mult_dzsl_mtx_scalar_mult_row_dzsl_mtx_transzsl_mtx_adjoint_3x3zsl_mtx_adjointzsl_mtx_vec_wedgezsl_mtx_reducezsl_mtx_reduce_iterzsl_mtx_augm_diagzsl_mtx_deter_3x3zsl_mtx_deterzsl_mtx_gauss_elimzsl_mtx_gauss_elim_dzsl_mtx_gauss_reduczsl_mtx_cols_normzsl_mtx_gram_schmidtzsl_mtx_norm_elemzsl_mtx_norm_elem_dzsl_mtx_inv_3x3zsl_mtx_invzsl_mtx_balancezsl_mtx_householderzsl_mtx_qrdzsl_mtx_qrd_iterzsl_mtx_eigenvalueszsl_mtx_eigenvectorszsl_mtx_svdzsl_mtx_pinvzsl_mtx_minzsl_mtx_maxzsl_mtx_min_idxzsl_mtx_max_idxzsl_mtx_is_equalzsl_mtx_is_notnegzsl_mtx_is_symzsl_mtx_printUnary matrix operations
The following component-wise unary operations can be executed on a matrix using the
zsl_mtx_unary_opfunction:++)--)-)!)Binary matrix operations
The following component-wise binary operations can be executed on a pair of symmetric matrices using the
zsl_mtx_binary_opfunction:a + b)a - b)a * b)a / b)mean(a, b)a^b)min(a, b))max(a, b))a == b)a != b)a < b)a > b)a <= b)a >= b)Numerical Analysis
Statistics
[1] Only available in double-precision
Probability Operations
Interpolation
Physics
Atomic
Dynamics
Electrical Components
Electric
Electricity
Energy
Fluids
Gases
Gravitation
Kinematics
Magnetics
Mass
Momentum
Optics
Photons
Projectiles
Relativity (v0.3.0)
Rotation
Sound
Thermodynamics
Waves
Work
Motion and Orientation
AHRS/Attitude (Degrees)
Compass
Euler Angles (Radians)
Gravity
Quaternions
Sensor Fusion
Colorimetry
Types/Structs
Functions
Color Data
Illuminants
CIE Standard Observer Models
CIE Luminous Efficiency Functions
XYZ to RGB Color Space Correlation Matrices
Chemistry
Measurement API (v0.2.0)
The
zsl_measurementstruct is a proof of concept attempt at representing measurements in a concise but unambiguous manner.It consists of:
There is an option to adjust the measurement’s scale in +/- 10^n steps (Scale Factor) from the default SI unit and scale indicated by the SI Unit Type. For example, if ‘Ampere’ is indicated as the SI unit, the measurement could indicate that the value is in uA by setting the scale factor to -6.
zsl_measurement)Longer Term Planned Features
Help is welcome on the following planned or desirable features.
Scalar Operations
Digital Signal Processing (v0.3.0)
Spectrometry
Calibration
Architecture-Specific Optimisations
Basic tooling has been added to allow for optimised architecture-specific implementations of key functions in assembly.
At present, this feature isn’t being actively used or developed, but an aim of zscilib is to add optimised versions of key functions to try to get the best possible performance out of limited resources.
Initial optimisation will target the Arm Cortex-M family of devices and the Thumb and Thumb-2 instruction sets, though other architectures can be accommodated if necessary or useful.
Code Style
Since the primary target of this codebase is running as a module in Zephyr OS, it follows the same coding style, which is itself based on the Linux kernel coding style.
You can format the source code to match this style automatically using the uncrustify command line tool, which has plugins available for many common text editors (Atom Beautify, for example).
Contributing
If you wish to contribute to this library, you can raise a PR as follows:
git cloneyour forked repository.Also have a look at the Issues page to see if there is any outstanding work or issues that you might be able to help with!
License
Apache 2.0.