| phasegram | R Documentation |
Produces a phasegram of a sound or another time series, which is a collection of Poincare sections cut through phase portraits of consecutive frames. The x axis is time, just as in a spectrogram, the y axis is a slice through the phase portrait, and the color shows the density of trajectories at each point of the phase portrait.
phasegram(
x,
samplingRate = NULL,
from = NULL,
to = NULL,
windowLength = 10,
step = NULL,
overlap = 50,
timeLag = NULL,
theilerWindow = NULL,
nonlinStats = c("ed", "d2", "ml", "sur"),
ed_pars = list(max.embedding.dim = 15),
d2_pars = list(min.embedding.dim = 2, min.radius = 0.001, n.points.radius = 20),
ml_pars = list(min.embedding.dim = 2, radius = 0.001),
sur_pars = list(FUN = nonlinearTseries::timeAsymmetry, K = 20),
bw = 0.01,
bins = 5/bw,
reportEvery = NULL,
cores = 1,
rasterize = FALSE,
plot = TRUE,
savePlots = FALSE,
embed = FALSE,
colorTheme = "bw",
col = NULL,
xlab = "Time",
ylab = "",
main = NULL,
width = 900,
height = 500,
units = "px",
res = NA,
...
)
x |
path to a folder, one or more wav or mp3 files c('file1.wav', 'file2.mp3'), Wave object, numeric vector, or a list of Wave objects or numeric vectors |
samplingRate |
sampling rate of |
from, to |
if NULL (default), analyzes the whole sound, otherwise from...to (s) |
windowLength |
length of the analysis window, ms |
step |
step between successive windows, ms; if provided, overrides
|
overlap |
overlap between successive windows, % |
timeLag |
time lag between the original and time-shifted version of each
frame that together represent the phase portrait (ms). Defaults to the
number of steps beyond which the mutual information function reaches its
minimum or, if that fails, the steps until mutual information experiences
the first exponential decay - see |
theilerWindow |
time lag between two points that are considered locally
independent and can be treated as neighbors in the reconstructed phase
space (ms). Converted internally to samples. Defaults to the first minimum
or, if unavailable, the first zero of the autocorrelation function (or,
failing that, to |
nonlinStats |
nonlinear statistics to report: "ed" = the optimal number
of embedding dimensions, "d2" = correlation dimension D2, "ml" = maximum
Lyapunov exponent, "sur" = the results of surrogate data testing for
stochasticity. These are calculated using the functionality of the package
nonlinearTseries, which can be slow. Set to |
ed_pars |
a list of control parameters passed to
|
d2_pars |
a list of control parameters passed to
|
ml_pars |
a list of control parameters passed to
|
sur_pars |
a list of control parameters passed to
|
bw |
standard deviation of the smoothing kernel, as in
|
bins |
the number of bins along the Y axis after rasterizing (has no
effect if |
reportEvery |
when processing multiple inputs, report estimated time
left every |
cores |
number of cores for parallel processing |
rasterize |
if FALSE, only plots and returns Poincare sections on the
original scale (most graphical parameters will then have no effect); if
TRUE, rasterizes the phasegram matrix and plots it with more graphical
parameters. The rasterized matrix is returned even if |
plot |
if TRUE, produces a plot of the results |
savePlots |
if TRUE, creates a subdirectory in the input directory (if input is a file or folder) or in the working directory (if input is a vector etc), named after the function (eg "spectrogram/"). All plots and audio files (if any) are saved in this new directory. If there are multiple inputs, an html notebook is also created for easy viewing and listening |
embed |
if TRUE and savePlots is set and there are multiple inputs, all saved images and audio (if any) are embedded in the exported html notebook for easy sharing; if FALSE, the html file links to separate images and audio files (but separate files are still saved). NB: for this to work, package "base64enc" must be installed |
colorTheme |
black and white ('bw'), as in seewave package ('seewave'),
matlab-type palette ('matlab'), or any palette from
|
col |
actual colors, eg rev(rainbow(100)) - see ?hcl.colors for colors in base R (overrides colorTheme) |
xlab, ylab, main |
graphical parameters passed to
soundgen:::filled.contour.mod (if |
width, height, units, res |
graphical parameters for saving plots passed to
|
... |
other graphical parameters passed to soundgen:::filled.contour.mod
(if |
Algorithm: the input sound is normalized to [-1, 1] and divided into
consecutive frames windowLength ms long without multiplying by any
windowing function (unlike in STFT). For each frame, a phase portrait is
obtained by time-shifting the frame by timeLag ms. A Poincare section
is taken through the phase portrait (currently at a fixed angle, namely the
default in poincareMap), giving the
intersection points of trajectories with this bisecting line. The density of
intersections is estimated with a smoothing kernel of bandwidth bw
(as an alternative to using histogram bins). The density distributions per
frame are stacked together into a phasegram (output: orig). The
density values in orig are normalized by the global maximum across all
frames. The resulting phasegram can optionally be rasterized to smooth it for
plotting (output: rasterized); the rasterized matrix is additionally
normalized row by row for display.
For a single input, a list of three components:
the full phasegram as a data frame. $time is the
middle of each frame (ms), $x is the coordinate along the
Poincare section (approximately on the normalized audio scale), and
$y is the density of intersections of system trajectories with
the Poincare section, normalized by the global maximum across all
frames. Failed or flat frames are represented by NA rows
the rasterized phasegram as a numeric matrix, or
NULL if rasterize = FALSE. Rows correspond to time
frames and columns correspond to bins along the Poincare-section
coordinate. Values are row-normalized for display, so each non-empty
row has a maximum of 1. If no valid Poincare intersections are found,
a zero-valued matrix is returned
per-frame descriptives as a data frame. Always
included are time (ms), shannon = normalized Shannon
entropy of Poincare sections, and nPeaks = log-normalized
number of peaks in the density distribution of Poincare sections. If
requested via nonlinStats, also includes ed = optimal
number of embedding dimensions, d2 = correlation dimension,
ml = maximum Lyapunov exponent (positive values suggest chaos),
and sur = stochasticity index from surrogate data testing,
rescaled to approximately 0 = deterministic and 1 = stochastic
For multiple inputs, a list of such per-input results is returned.
Herbst, C. T., Herzel, H., Švec, J. G., Wyman, M. T., & Fitch, W. T. (2013). Visualization of system dynamics using phasegrams. Journal of the Royal Society Interface, 10(85), 20130288.
Huffaker, R., Huffaker, R. G., Bittelli, M., & Rosa, R. (2017). Nonlinear time series analysis with R. Oxford University Press.
target = soundgen(sylLen = 300, pitch = c(350, 420, 420, 410, 340) * 3,
subDep = c(0, 0, 60, 50, 0, 0) / 2, addSilence = 0, plot = TRUE)
# Nonlinear statistics are also returned (slow - disable by setting
# nonlinStats = NULL if these are not needed)
ph = phasegram(target, 16000, nonlinStats = NULL)
## Not run:
ph = phasegram(target, 16000, windowLength = 20, step = 20,
rasterize = TRUE, bw = .01, bins = 150)
ph$descriptives
# Unfortunately, phasegrams are greatly affected by noise. Compare:
target2 = soundgen(sylLen = 300, pitch = c(350, 420, 420, 410, 340) * 3,
subDep = c(0, 0, 60, 50, 0, 0), noise = -30, jitterDep = .4,
rolloff = -5, addSilence = 0, plot = TRUE)
ph2 = phasegram(target2, 16000, nonlinStats = NULL)
# low-pass filtering may help a bit
target2_lowpass = bandpass(target2, 16000, upr = 2500)
phasegram(target2_lowpass, 16000, nonlinStats = NULL)
s2 = soundgen(sylLen = 3000, addSilence = 0, temperature = 1e-6,
pitch = c(380, 550, 500, 220), subDep = c(0, 0, 40, 0, 0, 0, 0, 0),
amDep = c(0, 0, 0, 0, 80, 0, 0, 0), amFreq = 80,
jitterDep = c(0, 0, 0, 0, 0, 3), plot = TRUE, yScale = 'bark')
phasegram(s2, 16000, windowLength = 10, nonlinStats = NULL, bw = .001)
phasegram(s2, 16000, windowLength = 10, nonlinStats = NULL, bw = .02)
## End(Not run)
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.