scipy.signal.
upfirdn#
- scipy.signal.upfirdn(h, x, up=1, down=1, axis=-1, mode='constant', cval=0)[source]#
上采样、FIR 滤波和下采样。
- 参数:
- h类似数组
1-D FIR(有限脉冲响应)滤波器系数。
- x类似数组
输入信号数组。
- upint,可选
上采样率。默认为 1。
- downint,可选
下采样率。默认为 1。
- axisint,可选
应用线性滤波的输入数据数组的轴。沿着此轴的每个子数组都会应用滤波器。默认为 -1。
- modestr,可选
要使用的信号扩展模式。集合
{"constant", "symmetric", "reflect", "edge", "wrap"}
对应numpy.pad
提供的模式。"smooth"
通过根据数组每端的最后 2 个点的斜率进行扩展来实现平滑扩展。"antireflect"
和"antisymmetric"
是"reflect"
和"symmetric"
的反对称版本。模式 “line” 根据沿axis
的第一个点和最后一个点定义的线性趋势对信号进行扩展。从版本 1.4.0 开始添加。
- cvalfloat,可选
当
mode == "constant"
时要使用的常量值。从版本 1.4.0 开始添加。
- 返回:
- yndarray
输出信号数组。维度将与 x 相同,除了沿 axis 的维度外,该维度将根据 h、up 和 down 参数来更改大小。
说明
该算法是 Vaidyanathan 文本的一个框图 [1](图 4.3-8d)的实现方法。
通过系数为 P 的零插入进行上采样、长度为
N
的 FIR 滤波以及系数为 Q 的下采样的直接方法对于每个输出采样是 O(N*Q)。这里使用的多相实现是 O(N/P)。从版本 0.18 开始添加。
参考
[1]P. P. Vaidyanathan, Multirate Systems and Filter Banks, Prentice Hall, 1993.
示例
简单操作
>>> import numpy as np >>> 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.]) >>> 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]) >>> 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])
对多个信号应用一个滤波器
>>> 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.]])
沿
x
的第 0 个维度应用>>> upfirdn(h, x, 2, axis=0) array([[ 0., 1.], [ 0., 1.], [ 2., 3.], [ 2., 3.], [ 4., 5.], [ 4., 5.], [ 6., 7.], [ 6., 7.]])