Python - lineární filter
Z Varhoo
(Rozdíly mezi verzemi)
(Nová stránka: The filter function is implemented as a direct II transposed structure. This means that the filter implements a[0]*y[n] = b[0]*x[n] + b[1]*x[n-1] + ... + b[nb]*x[n-nb] ...) |
|||
(Není zobrazena 1 mezilehlá verze od 1 uživatele.) | |||
Řádka 39: | Řádka 39: | ||
for m in range(len(x)): |
for m in range(len(x)): |
||
y[m] = b[0]/a[0] * x[m] + _z[0] |
y[m] = b[0]/a[0] * x[m] + _z[0] |
||
+ | |||
for i in range(len(zi)): |
for i in range(len(zi)): |
||
− | + | zf[i] = 0. |
|
− | zf[i] = 0. #b[0]/a[0]*x[0] |
||
− | |||
if i == len(zi)-1: |
if i == len(zi)-1: |
||
zf[i] = zf[i] - a[i+1]/a[0]*y[m] |
zf[i] = zf[i] - a[i+1]/a[0]*y[m] |
||
− | print "ok", i, len(zi)-1-i |
||
else: |
else: |
||
zf[i] = zf[i] + _z[i+1] - a[i+1]/a[0]*y[m] |
zf[i] = zf[i] + _z[i+1] - a[i+1]/a[0]*y[m] |
||
− | # print zf |
||
_z = zf |
_z = zf |
||
− | print _z |
||
return [y,zf] |
return [y,zf] |
Aktuální verze z 24. 4. 2011, 04:16
The filter function is implemented as a direct II transposed structure. This means that the filter implements
a[0]*y[n] = b[0]*x[n] + b[1]*x[n-1] + ... + b[nb]*x[n-nb] - a[1]*y[n-1] - ... - a[na]*y[n-na]
using the following difference equations:
y[m] = b[0]*x[m] + z[0,m-1] z[0,m] = b[1]*x[m] + z[1,m-1] - a[1]*y[m] ... z[n-3,m] = b[n-2]*x[m] + z[n-2,m-1] - a[n-2]*y[m] z[n-2,m] = b[n-1]*x[m] - a[n-1]*y[m]
where m is the output sample number and n=max(len(a),len(b)) is the model order.
The rational transfer function describing this filter in the z-transform domain is:
-1 -nb b[0] + b[1]z + ... + b[nb] z Y(z) = ---------------------------------- X(z) -1 -na a[0] + a[1]z + ... + a[na] z
více na docs.scipy.org [1]
#!/bin/python # coding:utf-8 from scipy.signal import * def filter(b, a, x, zi=None): y = zeros(len(x)) zf = zeros(len(zi)) n = max(len(a),len(b))-1 _z = zi for m in range(len(x)): y[m] = b[0]/a[0] * x[m] + _z[0] for i in range(len(zi)): zf[i] = 0. if i == len(zi)-1: zf[i] = zf[i] - a[i+1]/a[0]*y[m] else: zf[i] = zf[i] + _z[i+1] - a[i+1]/a[0]*y[m] _z = zf return [y,zf]
Ještě nějaké testovací data
#testování b = [4.] a = [1.,2.,1.,2.] x = [1.,2.,2.,0.,0.,1.,0.,1.] zi = [1,2.,0.5] print filter(b,a,x,zi) print lfilter(b,a,x,zi=zi)