*Matter 2* provides a variety of signal processing tools for both uniformly-sampled and nonuniformly-sampled signals in both 1D and 2D, as well as a limited selection of processing tools for signals of arbitrary dimension.

While the primary motivation for implementing these signal processing tools is for use with mass spectrometry imaging experiments, most of the provided functions are broadly applicable to any signal processing domain.

*Matter* uses a few consistent terms across its available functions when referring to certain aspects of signal processing. These terms will frequently appear as parameters to signal processing functions.

Signals may have multiple *dimensions*. Each dimension corresponds to a *domain*.

Here is a simple 1-dimensional signal that resembles a mass spectrum:

```
set.seed(1)
s <- simspec(1)
plot_signal(s, xlab="Index", ylab="Intensity")
```

A 1-dimensional signal has a single domain.

For a mass spectrum, the domain values are the mass-to-charge ratios, (or *m/z*-values).

`plot_signal(domain(s), s, xlab="m/z", ylab="Intensity")`

A 2-dimensional signal has two domains.

For example, for an image (which is a 2D signal), the domain values are the *x* and *y* locations of the pixels.

`plot_image(volcano)`

The dimensionality of a signal is the number of domains.

For example, a mass spectrum collected in tandem with liquid chromatography and ion mobility spectrometry (i.e., LC-IMS-MS) is a 3-dimensional signal. The domains for LC-IMS-MS spectra would include (1) retension times, (2) drift times, and (3) *m/z*-values.

Note that the values of a signal (e.g., intensities) are not considered as a separate dimension or domain.

In some cases, it is necessary for *Matter* to distinguish between the *observed* domain values for a signal and the *effective* domain values for a signal.

This is most obvious when we need to represent multiple nonuniformly-sampled signals (that may have been observed at different domain values) with a single set of domain values.

```
set.seed(1)
s1 <- simspec(1)
s2 <- simspec(1)
# spectra with different m/z-values
head(domain(s1))
```

`## [1] 507.8720 508.0159 508.1598 508.3037 508.4476 508.5915`

`head(domain(s2))`

`## [1] 562.5085 562.6585 562.8085 562.9585 563.1085 563.2585`

```
# create a shared vector of m/z-values
mzr <- range(domain(s1), domain(s2))
mz <- seq(from=mzr[1], to=mzr[2], by=0.2)
# create representations with the same m/z-values
s1 <- sparse_vec(s1, index=domain(s1), domain=mz)
s2 <- sparse_vec(s2, index=domain(s2), domain=mz)
```

In cases like this, *Matter* refers to the observed domain values as the signal `index`

, and the effective domain values as the signal `domain`

.

*Matter* provides a family of 1D smoothing methods that follow the naming scheme `filt1_*`

:

`filt1_ma`

performs moving average filtering`filt1_conv`

performs convolutional filtering with custom weights`filt1_gauss`

performs Gaussian filtering`filt1_bi`

performs bilateral filtering`filt1_adapt`

performs adaptive bilateral filtering`filt1_diff`

performs nonlinear diffusion filtering`filt1_guide`

performs guided filtering`filt1_pag`

performs peak-aware guided filtering`filt1_sg`

performs Savitzky-Golay filtering

We demonstrate the smoothing results on a simulate signal below:

```
set.seed(1)
s <- simspec(1, sdnoise=0.25, resolution=500)
```

```
p1 <- plot_signal(s)
p2 <- plot_signal(filt1_ma(s))
p3 <- plot_signal(filt1_gauss(s))
p4 <- plot_signal(filt1_bi(s))
p5 <- plot_signal(filt1_diff(s))
p6 <- plot_signal(filt1_guide(s))
p7 <- plot_signal(filt1_pag(s))
p8 <- plot_signal(filt1_sg(s))
plt <- as_facets(list(
"Original"=p1,
"Moving average"=p2,
"Gaussian"=p3,
"Bilateral"=p4,
"Diffusion"=p5,
"Guided"=p6,
"Peak-aware"=p7,
"Savitsky-Golay"=p8), nrow=4, ncol=2)
plot(plt)
```

Now we zoom in on the x-axis to better see the differences in the smoothing.

`plot(plt, xlim=c(5800, 6100))`

*Matter* also provides a family of 2D image smoothing methods that follow the naming scheme `filt2_*`

:

`filt2_ma`

performs moving average filtering`filt2_conv`

performs convolutional filtering with custom weights`filt2_gauss`

performs Gaussian filtering`filt2_bi`

performs bilateral filtering`filt2_adapt`

performs adaptive bilateral filtering`filt2_diff`

performs nonlinear diffusion filtering`filt2_guide`

performs guided filtering

If a multichannel image is provided (e.g., a 3D array), then these functions will smooth each channel independently.

We demonstrate the smoothing results on the `volcano`

dataset with added noise:

```
set.seed(1)
img <- volcano + rnorm(length(volcano), sd=2.5)
```

```
p1 <- plot_image(img)
p2 <- plot_image(filt2_ma(img))
p3 <- plot_image(filt2_gauss(img))
p4 <- plot_image(filt2_bi(img))
p5 <- plot_image(filt2_diff(img))
p6 <- plot_image(filt2_guide(img))
plt <- as_facets(list(
"Original"=p1,
"Moving average"=p2,
"Gaussian"=p3,
"Bilateral"=p4,
"Diffusion"=p5,
"Guided"=p6), nrow=3, ncol=2)
plot(plt)
```