## Smart Signal Processing #

### What the package can do for you #

This package provides frequently used functions for signal processing:

• Computes mean values, variance, standard deviation.
• Applies windowing (apodization functions) with exponential or Gaussian shapes to an array
• Applies the Fast Fourier Transform to an array.
• Calculates the power or magnitude of a complex-valued array.
• Phase-shifts (rotates in the complex plane) a complex-valued array.

### The major API functionalities #

• classes `Sigma`, `BaseLine`, `WinFunc`,`FFT`, `Phase`.

Examples:

• Multiplication with an exponential:

`WinFunc.expMult(array, decayFactor, false, "0");`

• Compute Fourier Transform:

`FFT.transform(reals, imags);`

• Compute magnitude:

`Phase.magnitude(reals, imags, true)`

• Compute variance in a region:
`Sigma.variance(array, ixstart, ixend)`

`smart_arrays_base`: Basic functions for 1D and 2D arrays

`smart_arrays_numerics`: Numerics with 1D and 2D arrays

`smart_arrays_compress`: Compress 1D and 2D arrays to a smaller size.

`smart_arrays_sample_data`: Computes 1D and 2D arrays containing sample data.

`smart_arrays_dbstore`: Store 1D and 2D arrays along with metadata on the local device.

`smart_arrays_plot_polyline`: Plot 1D arrays as polyline along with axes and more.

`smart_arrays_peaks`: Detect peaks in 1D and 2D arrays.

`smart_arrays_contour_finder`: Contours the three-dimensional surface represented by the values f(x,y) of a matrix.

`smart_arrays_lmfit`: Fits (x, y) data given as arrays to a specified model function using the Levenberg-Marquardt algorithm.

`smart_lorentz-gauss`: Compute Lorentz-Gauss (pseudo-Voigt) line shapes.

`smart_dialogs`: Easy-to-use dialogs in Web applications

## Smart Signal Processing #

### Version history #

2.1.1 - 2019-12-16 New optional argument `isComplex`of method `transformShuffled()`. 2.1.0 - 2019-10-05 Now sdk 2.5.0 in pubspec

2.0.0 - 2019-03-23 First version available on pub site.

2.0.4 - 2019-04-05 Added `Sigma.sigma2D()`.

2.0.6 - 2019-08-07 Fixed health suggestions of pub.dev

2.0.7 - 2019-09-06 Example is now plotted in the browser

2.0.9 - 2019-09-06 Example update.

2.0.10 - 2019-09-14 Example makes use of `smart_arrays_sample_data`

example/example.dart

``````// Copyright (c) 2019, Dr. Bruno Guigas. All rights reserved. Use of this source
// code is governed by a BSD-style license that can be found in the LICENSE file.
import 'dart:html';
import 'dart:typed_data';
import 'dart:convert';
import 'dart:math' as math;

import 'package:smart_arrays_plot_polyline/smart_arrays_plot_polyline.dart';
import 'package:smart_arrays_sample_data/smart_arrays_sample_data.dart';
import 'package:smart_signal_processing/smart_signal_processing.dart';

/// Signal processing example:
/// - Computes NPERIODS periods of a cosine shape with NPOINTS data points.
/// - Applies an exponential function, resulting in a decaying oscillation.
/// - Applies a real Fourier transform, resulting in a complex-valued line shape
///   whose real part is an absorption mode Lorentzian, and whose imaginary
///   part is a dispersion mode Lorentzian. The real part's maximum is at the
///   index defined by the number of cosine periods (NPERIODS).
/// - Plots the real and imaginary parts and the cosine in the browser.
main() {
// Generate a cosine
Sine1D sine1d = Sine1D(NPOINTS, 100.0, math.pi / 2, NPERIODS, 0.0, 0.0);
Float64List reals = sine1d.array;
Float64List imags = Float64List(reals.length); // remains zero

// Make cosine exponentially decaying
double decayFactor = -3.0 / (reals.length - 1);
WinFunc.expMult(reals, decayFactor, false, "0");
Float64List decayingCosine = Float64List.fromList(reals); // save for plotting

// In-place transform: initially [imags] has only zeroes. After transform,
// [reals] contains absorption mode and [imags] dispersion mode Lorentzian shape.
FFT.transform(reals, imags);

// Plot the result: Due to the symmetry properties of the FFT only the first
// halfs play a role. The second halfs contain identical information
// (corresonding to "negative frequencies"). Only half of the cosine is
// plotted to obtain for the x axis to be valid for all 3 displayed curves.
plotArrays([
reals.sublist(0, reals.length ~/ 2),
imags.sublist(0, imags.length ~/ 2),
decayingCosine.sublist(0, decayingCosine.length ~/ 2),
]);
}

final int NPOINTS = 512, NPERIODS = 50;

/// Displays the [arrays] computed by [main] in the browser using the
/// package 'smart_arrays_plot_polyline'.
void plotArrays(List<Float64List> arrays) {
// get divs from 'example.html' (application and plot containers)
DivElement appDiv = (querySelector("#app_div") as DivElement);
DivElement plotDiv = (querySelector("#plot_div") as DivElement);

// the plot will take all available space of [appDiv] in this example
plotDiv.style
..width = "\${appDiv.clientWidth}px"
..height = "\${appDiv.clientHeight}px";

// setup some polyline, axis and legend attributes
List<Map<PyA, String>> plotAttr = [
{PyA.YPOSITION_ZERO: "0.6"}, // for real part
{PyA.YPOSITION_ZERO: "0.6"}, // the same for the imaginary part
{PyA.YPOSITION_ZERO: "0.895", PyA.YSCALE: "5"} // scale and shift the cosine
];

// x axis labeling
Map<AxA, String> xaxisAttr = {
AxA.PHYS_X_START: "0",
AxA.PHYS_X_WIDTH: "\${arrays[0].length}", // from real part
AxA.LEGENDTEXT: "Number of points"
};

// y axis labeling
Map<AxA, String> yaxisAttr = {AxA.LEGENDTEXT: "Relative units"};

// legend text and position
Map<LegA, String> legendAttr = {
LegA.TOP_TITLE:
"Fourier Transform of a decaying cosine with \$NPERIODS periods",
LegA.SUB_TITLES: json.encode([
"Real part after transform",
"Imaginary part after transform",
"Decaying cosine (first half, vertically expanded and shifted down)"
]),
LegA.X: "45",
LegA.Y: "15"
};

// plot the arrays into [plotDiv]
SimplePlot(arrays, plotDiv, plotAttr, xaxisAttr, yaxisAttr, legendAttr, null);
}
``````

## Use this package as a library

### 1. Depend on it

``````
dependencies:
smart_signal_processing: ^2.1.1

``````

### 2. Install it

You can install packages from the command line:

with pub:

``````
\$ pub get

``````

with Flutter:

``````
\$ flutter pub get

``````

Alternatively, your editor might support `pub get` or `flutter pub get`. Check the docs for your editor to learn more.

### 3. Import it

Now in your Dart code, you can use:

``````
import 'package:smart_signal_processing/smart_signal_processing.dart';
``````
 Popularity: Describes how popular the package is relative to other packages. [more] 49 Health: Code health derived from static analysis. [more] 100 Maintenance: Reflects how tidy and up-to-date the package is. [more] 100 Overall: Weighted score of the above. [more] 75

We analyzed this package on Jan 19, 2020, and provided a score, details, and suggestions below. Analysis was completed with status completed using:

• Dart: 2.7.0
• pana: 0.13.4

#### Health suggestions

Format `lib/src/phase.dart`.

Run `dartfmt` to format `lib/src/phase.dart`.

#### Dependencies

Package Constraint Resolved Available
Direct dependencies
Dart SDK >=2.5.0 <3.0.0
build_runner ^1.6.2 1.7.3
build_web_compilers ^2.1.4 2.8.0
pedantic ^1.7.0 1.9.0
smart_arrays_base ^2.0.9 2.1.0
smart_arrays_plot_polyline ^2.0.8 2.2.1
smart_arrays_sample_data ^2.0.3 2.0.5
Transitive dependencies
_fe_analyzer_shared 1.0.3
analyzer 0.39.4
archive 2.0.13
args 1.5.2
async 2.4.0
bazel_worker 0.1.23
build 1.2.2
build_config 0.4.1+1
build_daemon 2.1.3
build_modules 2.7.0
build_resolvers 1.3.1
build_runner_core 4.3.0
built_collection 4.3.2
built_value 7.0.8
charcode 1.1.2
checked_yaml 1.0.2
code_builder 3.2.1
collection 1.14.12
convert 2.1.1
crypto 2.1.4
csslib 0.16.1
dart_style 1.3.3
fixnum 0.10.11
glob 1.2.0
graphs 0.2.0
html 0.14.0+3
http 0.12.0+4
http_multi_server 2.1.0
http_parser 3.1.3
io 0.3.3
js 0.6.1+1
json_annotation 3.0.1
logging 0.11.4
matcher 0.12.6
meta 1.1.8
mime 0.9.6+3
node_interop 1.0.3
node_io 1.0.1+2
package_config 1.1.0
package_resolver 1.0.10
path 1.6.4
pool 1.4.0
protobuf 1.0.1
pub_semver 1.4.2
pubspec_parse 0.1.5
quiver 2.1.2+1
scratch_space 0.0.4+2
shelf 0.7.5
shelf_web_socket 0.2.3
smart_arrays_compress 2.1.0
smart_arrays_contour_finder 2.0.6
smart_arrays_numerics 2.1.1
smart_lorentz_gauss 2.1.2
source_maps 0.10.8
source_span 1.6.0
stack_trace 1.9.3
stream_channel 2.0.0
stream_transform 1.1.0
string_scanner 1.0.5
term_glyph 1.1.0
timing 0.1.1+2
typed_data 1.1.6
watcher 0.9.7+13
web_socket_channel 1.1.0
yaml 2.2.0