通过封装两个库模块中的一些功能,我们可以清楚地看到数字滤波器的外观。 另外,通过将__init__分为两部分,可以即时重置过滤器的创建参数和内部条件。
""" Encapulates a scipy filter. Given type, freq and order,
create the coefficients and internal conditions, etc."""
import scipy.signal.filter_design as fd
import scipy.signal.signaltools as st
_filterTypeDict = {'elliptic':'ellip', 'Butterworth':'butter',
'Chebyshev I':'cheby1', 'Chebyshev II':'cheby2',
'Bessel':'bessel'}
DefaultFilterType = 'Butterworth'
DefaultFilterOrder = 2
DefaultFilterFreq = 0.1
class FilterObject(object):
def __init__(self, channelNumber, nTaps, freq,
bType='lowpass', fType="butter", output='ba'):
self.channelNumber = channelNumber
self.InitFilter(nTaps, freq, bType, fType, output)
def InitFilter(self, nTaps, freq, bType, fType, output):
print "taps = %d: freq = %f" % (nTaps, freq)
b, a = fd.iirfilter(nTaps, freq, btype=bType, ftype=fType, output=output)
self.b, self.a = b, a
self.ic = st.lfiltic(b, a, (0.0,))
def Filter(self, dataArray):
resTuple = st.lfilter(self.b, self.a, dataArray, zi=self.ic)
self.ic = resTuple[-1]
return resTuple[0]
if __name__ == "__main__":
x = (1.5, 1.4, 1.5, 1.6, 1.5, 1.4, 1.5, 1.6)
f = FilterObject(2, .05)
for a in range(20):
print f.Filter(x)
这是另一个很好的例子。
_filterTypeDict是“名称修改”的示例。 这是保持模块作用域变量为半私有的方法。
导入myModule时
模块作用域的类,函数和变量由引用
myModule.myClass(),myModule.myFunction(),myModule.myVariable。
当您使用以下命令导入模块的对象时
从myModule导入*
除_semiprivate变量外,该模块中的所有名称均置于导入模块的范围内。 他们是半私人的,因为您仍然可以
a = myModule._semiprivate(名称已导入到当前作用域中,并在其前面添加了模块名称)。
From: https://bytes.com/topic/python/insights/568075-encapsulating-sypy-filter