upfirdn(h, x, up=1, down=1, axis=-1, mode='constant', cval=0)
The algorithm is an implementation of the block diagram shown on page 129 of the Vaidyanathan text (Figure 4.3-8d).
The direct approach of upsampling by factor of P with zero insertion, FIR filtering of length N
, and downsampling by factor of Q is O(N*Q) per output sample. The polyphase implementation used here is O(N/P).
1-D FIR (finite-impulse response) filter coefficients.
Input signal array.
Upsampling rate. Default is 1.
Downsampling rate. Default is 1.
The axis of the input data array along which to apply the linear filter. The filter is applied to each subarray along this axis. Default is -1.
The signal extension mode to use. The set {"constant", "symmetric", "reflect", "edge", "wrap"}
correspond to modes provided by numpy.pad
. "smooth"
implements a smooth extension by extending based on the slope of the last 2 points at each end of the array. "antireflect"
and "antisymmetric"
are anti-symmetric versions of "reflect"
and "symmetric"
. The mode :None:None:`"line"`
extends the signal based on a linear trend defined by the first and last points along the axis
.
The constant value to use when mode == "constant"
.
The output signal array. Dimensions will be the same as x
except for along :None:None:`axis`
, which will change size according to the h
, :None:None:`up`
, and down
parameters.
Upsample, FIR filter, and downsample.
Simple operations:
>>> from scipy.signal import upfirdn
... upfirdn([1, 1, 1], [1, 1, 1]) # FIR filter array([ 1., 2., 3., 2., 1.])
>>> upfirdn([1], [1, 2, 3], 3) # upsampling with zeros insertion array([ 1., 0., 0., 2., 0., 0., 3., 0., 0.])
>>> upfirdn([1, 1, 1], [1, 2, 3], 3) # upsampling with sample-and-hold array([ 1., 1., 1., 2., 2., 2., 3., 3., 3.])
>>> upfirdn([.5, 1, .5], [1, 1, 1], 2) # linear interpolation array([ 0.5, 1. , 1. , 1. , 1. , 1. , 0.5, 0. ])
>>> upfirdn([1], np.arange(10), 1, 3) # decimation by 3 array([ 0., 3., 6., 9.])
>>> upfirdn([.5, 1, .5], np.arange(10), 2, 3) # linear interp, rate 2/3 array([ 0. , 1. , 2.5, 4. , 5.5, 7. , 8.5, 0. ])
Apply a single filter to multiple signals:
>>> x = np.reshape(np.arange(8), (4, 2))
... x array([[0, 1], [2, 3], [4, 5], [6, 7]])
Apply along the last dimension of x
:
>>> h = [1, 1]
... upfirdn(h, x, 2) array([[ 0., 0., 1., 1.], [ 2., 2., 3., 3.], [ 4., 4., 5., 5.], [ 6., 6., 7., 7.]])
Apply along the 0th dimension of x
:
>>> upfirdn(h, x, 2, axis=0) array([[ 0., 1.], [ 0., 1.], [ 2., 3.], [ 2., 3.], [ 4., 5.], [ 4., 5.], [ 6., 7.], [ 6., 7.]])See :
The following pages refer to to this document either explicitly or contain code examples using this.
scipy.signal._upfirdn.upfirdn
scipy.signal._signaltools.resample_poly
Hover to see nodes names; edges to Self not shown, Caped at 50 nodes.
Using a canvas is more power efficient and can get hundred of nodes ; but does not allow hyperlinks; , arrows or text (beyond on hover)
SVG is more flexible but power hungry; and does not scale well to 50 + nodes.
All aboves nodes referred to, (or are referred from) current nodes; Edges from Self to other have been omitted (or all nodes would be connected to the central node "self" which is not useful). Nodes are colored by the library they belong to, and scaled with the number of references pointing them