upfirdn#
- scipy.signal.upfirdn(h, x, up=1, down=1, axis=-1, mode='constant', cval=0)[Quelle]#
Hochtasten, FIR-filtern und runtertasten.
- Parameter:
- harray_like
1-D FIR (Finite Impulse Response) Filterkoeffizienten.
- xarray_like
Eingangssignal-Array.
- upint, optional
Hochtastrate. Standardwert ist 1.
- downint, optional
Runtertastrate. Standardwert ist 1.
- axisint, optional
Die Achse des Eingabedatenarrays, entlang der der lineare Filter angewendet werden soll. Der Filter wird auf jeden Unterarray entlang dieser Achse angewendet. Standard ist -1.
- modestr, optional
Der zu verwendende Modus für die Signalerweiterung. Die Mengen
{"constant", "symmetric", "reflect", "edge", "wrap"}entsprechen den vonnumpy.padbereitgestellten Modi."smooth"implementiert eine glatte Erweiterung, indem sie basierend auf der Steigung der letzten 2 Punkte an jedem Ende des Arrays erweitert wird."antireflect"und"antisymmetric"sind antisymmetrische Versionen von"reflect"und"symmetric". Der Modus „line“ erweitert das Signal basierend auf einem linearen Trend, der durch den ersten und letzten Punkt entlang deraxisdefiniert ist.Hinzugefügt in Version 1.4.0.
- cvalfloat, optional
Der konstante Wert, der verwendet wird, wenn
mode == "constant".Hinzugefügt in Version 1.4.0.
- Rückgabe:
- yndarray
Das Ausgangssignal-Array. Die Dimensionen sind dieselben wie bei x, außer entlang der axis, deren Größe gemäß den Parametern h, up und down geändert wird.
Hinweise
Der Algorithmus ist eine Implementierung des Blockdiagramms auf Seite 129 des Vaidyanathan-Lehrbuchs [1] (Abbildung 4.3-8d).
Der direkte Ansatz des Hochtastens um den Faktor P mit Nulleinfügung, FIR-Filtern der Länge
Nund Runtertasten um den Faktor Q kostet O(N*Q) pro Ausgangssample. Die hier verwendete Polyphasenimplementierung kostet O(N/P).Hinzugefügt in Version 0.18.
Referenzen
[1]P. P. Vaidyanathan, Multirate Systems and Filter Banks, Prentice Hall, 1993.
Beispiele
Einfache Operationen
>>> 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])
Einen einzelnen Filter auf mehrere Signale anwenden
>>> x = np.reshape(np.arange(8), (4, 2)) >>> x array([[0, 1], [2, 3], [4, 5], [6, 7]])
Entlang der letzten Dimension von
xanwenden>>> h = [1, 1] >>> upfirdn(h, x, 2) array([[ 0., 0., 1., 1.], [ 2., 2., 3., 3.], [ 4., 4., 5., 5.], [ 6., 6., 7., 7.]])
Entlang der 0-Dimension von
xanwenden>>> upfirdn(h, x, 2, axis=0) array([[ 0., 1.], [ 0., 1.], [ 2., 3.], [ 2., 3.], [ 4., 5.], [ 4., 5.], [ 6., 7.], [ 6., 7.]])