Pulse train
Generate a train of pulses based on samples of a continuous function.
pulstran( t, d, func, fs = 1, method = c("linear", "nearest", "cubic", "spline"), ... )
t |
Time values at which |
d |
Offset removed from the values of the array |
func |
Continuous function used to generate a pulse train based on its
samples, specified as 'rectpuls', 'gauspuls', 'tripuls', or a function
handle. If you use |
fs |
Sample rate in Hz, specified as a real scalar. |
method |
Interpolation method, specified as one of the following options:
Interpolation is performed by the function |
... |
Further arguments passed to |
Generate the signal y <- sum(func(t + d, ...))
for each d
. If
d
is a matrix of two columns, the first column is the delay d
and the second column is the amplitude a
, and y <- sum(a *
func(t + d))
for each d, a
. Clearly, func
must be a function
which accepts a vector of times. Any extra arguments needed for the function
must be tagged on the end.
If instead of a function name you supply a pulse shape sampled at frequency
fs
(default 1 Hz), an interpolated version of the pulse is added at
each delay d
. The interpolation stays within the the time range of the
delayed pulse. The interpolation method defaults to linear, but it can be any
interpolation method accepted by the function interp1
Pulse train generated by the function, returned as a vector.
Sylvain Pelissier, sylvain.pelissier@gmail.com.
Conversion to R by Geert van Boxtel G.J.M.vanBoxtel@gmail.com.
## periodic rectangular pulse t <- seq(0, 60, 1/1e3) d <- cbind(seq(0, 60, 2), sin(2 * pi * 0.05 * seq(0, 60, 2))) y <- pulstran(t, d, 'rectpuls') plot(t, y, type = "l", xlab = "Time (s)", ylab = "Waveform", main = "Periodic rectangular pulse") ## assymetric sawtooth waveform fs <- 1e3 t <- seq(0, 1, 1/fs) d <- seq(0, 1, 1/3) x <- tripuls(t, 0.2, -1) y <- pulstran(t, d, x, fs) plot(t, y, type = "l", xlab = "Time (s)", ylab = "Waveform", main = "Asymmetric sawtooth waveform") ## Periodic Gaussian waveform fs <- 1e7 tc <- 0.00025 t <- seq(-tc, tc, 1/fs) x <- gauspuls(t, 10e3, 0.5) plot(t, x, type="l", xlab = "Time (s)", ylab = "Waveform", main = "Gaussian pulse") ts <- seq(0, 0.025, 1/50e3) d <- cbind(seq(0, 0.025, 1/1e3), sin(2 * pi * 0.1 * (0:25))) y <- pulstran(ts, d, x, fs) plot(ts, y, type = "l", xlab = "Time (s)", ylab = "Waveform", main = "Gaussian pulse train") # Custom pulse trains fnx <- function(x, fn) sin(2 * pi * fn * x) * exp(-fn * abs(x)) ffs <- 1000 tp <- seq(0, 1, 1/ffs) pp <- fnx(tp, 30) plot(tp, pp, type = "l",xlab = 'Time (s)', ylab = 'Waveform', main = "Custom pulse") fs <- 2e3 t <- seq(0, 1.2, 1/fs) d <- seq(0, 1, 1/3) dd <- cbind(d, 4^-d) z <- pulstran(t, dd, pp, ffs) plot(t, z, type = "l", xlab = "Time (s)", ylab = "Waveform", main = "Custom pulse train") ## Generate the pulse train again, but now use the generating ## function as an input argument. Include the frequency and damping ## parameter in the function call. In this case, pulstran generates ## the pulse so that it is centered about zero. y <- pulstran(t, dd, 'fnx', fn = 30) plot(t, y, type = "l", xlab = "Time (s)", ylab = "Waveform", main = "Custom pulse train") ## Change Interpolation Method with Custom Pulse ## Generate a custom exponentially decaying sawtooth waveform of ## requency 0.25 Hz. The generating function has a second input argument ## that specifies a single value for the sawtooth frequency and the damping ## factor. Display a generated pulse, sampled at 0.1 kHz for 1 second, with ## a frequency and damping value equal to 50. fnx <- function(x, fn) sawtooth(2 * pi * fn * 0.25 * x) * exp(-2 * fn * x^2) fs <- 100 t <- seq(0, 1, 1/fs) pp <- fnx(t, 50) plot(t, pp, type = "l", xlab = "Time (s)", ylab = "Waveform") ## Use the pulstran function to generate a train of custom pulses. ## The train is sampled at 0.1 kHz for 125 seconds. The pulses occur ## every 25 seconds and have exponentially decreasing amplitudes. Specify ## the generated pulse as a prototype. Generate three pulse trains using the ## default linear interpolation method, nearest neighbor interpolation ## and piecewise cubic interpolation. Compare the pulse trains on a ## single plot. d <- cbind(seq(0, 125, 25), exp(-0.015 * seq(0, 125, 25))) ffs <- 100 tp <- seq(0, 125, 1/ffs) r <- pulstran(tp, d, pp) y <- pulstran(tp, d, pp, method = 'nearest') q <- pulstran(tp, d, pp, method = 'spline') plot(tp, r, type = "l", xlab = "Time (s)", ylab = "Waveform") lines(tp, y, col=2) lines(tp, q, col=3) legend ("bottomright", lty=1, legend=c("linear", "nearest neighbor", "spline"), col=1:3)
Please choose more modern alternatives, such as Google Chrome or Mozilla Firefox.