上采样,FIR滤波器和下采样
参数:
h:array_like一维FIR(finite-impulse响应)滤波器系数。
x:array_like输入信号阵列。
up:int, 可选参数上采样率。默认值为1。
down:int, 可选参数下采样率。默认值为1。
axis:int, 可选参数输入数据数组的轴,沿该轴应用线性滤波器。过滤器沿此轴应用于每个子数组。默认值为-1。
mode:str, 可选参数要使用的信号扩展模式。套装{"constant", "symmetric", "reflect", "edge", "wrap"}对应于由numpy.pad。"smooth"通过基于数组两端的最后2个点的斜率进行扩展,实现平滑扩展。"antireflect"和"antisymmetric"是的anti-symmetric版本"reflect"和"symmetric"。模式“line”根据线性趋势由信号的第一个点和最后一个点定义的信号扩展信号axis。
1.4.0版的新函数。
cval:float, 可选参数何时使用的常数mode == "constant"。
1.4.0版的新函数。
返回值:
y:ndarray输出信号数组。除沿轴方向外,尺寸将与x相同,后者将根据h,up和down参数改变尺寸。
注意:
该算法是Vaidyanathan文本第129页上显示的框图的实现[1](图4.3-8d)。
P.P. Vaidyanathan,多速率系统和滤波器组,Prentice Hall,1993年。
直接用零因子P进行上采样的方法,长度的FIR滤波N,并且按Q因子进行的下采样是每个输出采样的O(N * Q)。此处使用的多相实现是O(N /P)。
版本0.18中的新函数。
例子:
操作简单:
>>> 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. ])
将单个滤波器应用于多个信号:
>>> x = np.reshape(np.arange(8), (4, 2))
>>> x
array([[0, 1],
[2, 3],
[4, 5],
[6, 7]])
沿的最后一个尺寸应用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.]])
沿的第0维应用x:
>>> upfirdn(h, x, 2, axis=0)
array([[ 0., 1.],
[ 0., 1.],
[ 2., 3.],
[ 2., 3.],
[ 4., 5.],
[ 4., 5.],
[ 6., 7.],
[ 6., 7.]])