upfirdn#
- scipy.signal.upfirdn(h, x, вверх=1, вниз=1, ось=-1, mode='constant', cval=0)[источник]#
Повысить частоту дискретизации, применить КИХ-фильтр и понизить частоту дискретизации.
- Параметры:
- harray_like
Коэффициенты 1-D КИХ (конечно-импульсного) фильтра.
- xarray_like
Входной массив сигнала.
- вверхint, необязательный
Коэффициент повышения частоты дискретизации. По умолчанию 1.
- внизint, необязательный
Коэффициент понижающей дискретизации. По умолчанию 1.
- осьint, необязательный
Ось входного массива данных, вдоль которой применяется линейный фильтр. Фильтр применяется к каждому подмассиву вдоль этой оси. По умолчанию -1.
- modestr, optional
Режим расширения сигнала для использования. Набор
{"constant", "symmetric", "reflect", "edge", "wrap"}соответствуют режимам, предоставляемымnumpy.pad."smooth"реализует гладкое расширение путем расширения на основе наклона последних 2 точек на каждом конце массива."antireflect"и"antisymmetric"являются антисимметричными версиями"reflect"и"symmetric". Режим “линия” расширяет сигнал на основе линейного тренда, определённого первыми и последними точками вдольaxis.Добавлено в версии 1.4.0.
- cvalfloat, опционально
Постоянное значение для использования, когда
mode == "constant".Добавлено в версии 1.4.0.
- Возвращает:
- yndarray
Выходной массив сигнала. Размерности будут такими же, как x кроме как вдоль ось, который будет изменять размер в соответствии с h, вверх, и вниз параметры.
Примечания
Алгоритм является реализацией блок-схемы, показанной на странице 129 текста Вайдьянатана [1] (Рисунок 4.3-8d).
Прямой подход к увеличению частоты дискретизации с коэффициентом P с вставкой нулей, КИХ-фильтрация длины
N, и понижение частоты дискретизации с коэффициентом 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.]])
Применить вдоль 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.]])