6 releases
0.3.1 | May 9, 2022 |
---|---|
0.3.0 | May 1, 2022 |
0.2.0 | Apr 27, 2022 |
0.1.2 | Apr 25, 2022 |
#578 in Audio
1MB
1K
SLoC
NDSP
Norsk Datateknikk No-STD DSP library for Rust.
The focus of the module is to build up a library of DSP code. Not compute speed focused at this time. The first goal is to get basic features up and running to simplify writing.
The goal is to write a library that targets embedded platforms.
It utilizes the mixed-num library to allow flexibility in fixed and floating point sizes and precisions.
The package.
The documentation.
Release notes are found under RELEASES.md.
Testing the library (for development purposes)
cargo test --features "std"
lib.rs
:
This is an experimental library for DSP in Rust, including for no-std environments.
It uses trait implementation from the mixed_num
crate to enable both fixed point and floating point support.
Most of the functionality in this library is no-std, but requires alloc.
The STD feature can be used to unlock plotting functionality, e.g. for testing purposes.
Example
use ndsp::*;
let signalf32 = Vec::lin_range(0f32, 9f32, 10);
let signalf64 = Vec::lin_range(2f64, 11f64, 10);
let result = signalf32.clone()*signalf64;
assert_eq!(result.to_string(), "[ 0, 3, 8, 15, 24, 35, 48, 63, 80, 99 ]" );
let signal1f32 = Vec::lin_range(2f64, 11f64, 10);
let result = signalf32*signal1f32;
assert_eq!(result.to_string(), "[ 0, 3, 8, 15, 24, 35, 48, 63, 80, 99 ]" );
This implementation simulataneously support complex numbers.
Example
use ndsp::*;
use mixed_num::*;
let omega = <f32>::mixed_pi()/f32::mixed_from_num(8i32);
let theta = 0f32;
let mut signal = Vec::osc(omega, theta, 4);
signal = &signal*&signal;
assert_eq!(signal.to_string(), "[ 1+0i, 0.7071067+0.7071068i, 0+0.99999994i, -0.7071067+0.7071068i ]" );
signal /= 2f32;
assert_eq!(signal.to_string(), "[ 0.25-0.25i, 0.35355338+0.000000029802322i, 0.24999999+0.24999999i, 0.000000029802322+0.35355338i ]" )
Plotting
The package contains utility funcitons that simplify plotting of data.
Plot Example
use ndsp::*;
let test_vec = Vec::lin_range(0f32, 1f32, 64);
test_vec.simple_plot("./figures/plot_test.png", "Test Plot");
The resulting plot is shown below.
use ndsp::*;
use mixed_num::*;
let x_vec = Vec::lin_range(0f32, f32::mixed_tau(), 64);
let mut y_vec = x_vec.clone();
y_vec.cos();
x_vec.plot(&y_vec, "./figures/lib_plot_x_y.png", "Cosine", "x", "cos(x)");
Window functions
The package support selected window funcitons.
use ndsp::*;
use mixed_num::Cartesian;
let mut vec = Vec::<f32>::bartlett(256);
vec.simple_plot("./figures/bartlett_test_lib.png", "Bartlett Window Function");
let c_vec = Vec::<Cartesian<f32>>::new_from_real(vec);
c_vec.plot_psd( 1f32, -110f32, "./figures/bartlett_psd_test_lib.png", "Bartlett Window Function" );
The resulitg plots are shown below.
Dependencies
~3–5.5MB
~105K SLoC