在BeagleBone Black上使用numpy(不是scipy!)编程巴特沃斯滤波器
我刚开始学习Python,整体上也是个业余程序员。我希望能仅用numpy库来过滤一个信号。这个程序会运行在BeagleBone Black上,操作系统是Angstrom Linux,所以我能更新到的numpy库版本最多是1.4。由于一些传闻中的数据限制(我其实也不知道怎么检查)或者是numpy版本太旧,scipy在这个板子上无法使用。
所以第一个解决方案是换一个新的操作系统,但我不知道从哪里开始;我更擅长的是把公式放进程序里。
我本来希望使用filtfilt函数,但也许从lfilter开始会更好。这个网站看起来对实现它很有帮助,但对我来说有点复杂:
http://docs.scipy.org/doc/scipy-0.13.0/reference/generated/scipy.signal.lfilter.html
我可以在MATLAB中得到滤波器的系数,然后把它们转移到BeagleBone上。x就是我的信号数组,我可以上传。
第二部分有点跳跃——有没有办法仅用numpy而不是scipy来进行z变换?另外,基于MATLAB中滤波算法的保密性,我对自己能搞定这点没有信心,但有没有什么数学算法的描述,或者更好的是代码,能告诉我怎么做到这一点?
谢谢你耐心地读完这些内容和回复。请不要用复杂的语言来回答!
-Rob
1 个回答
对于滤波器设计的功能,你可以从 sicpy.signal.filter_design.py 里复制代码,这些代码几乎都是用纯 Python 写的。
但是如果你想对 IIR 滤波器使用 lfilter
,你需要为数据数组中的每个样本写一个循环。因为 Python 的循环速度比较慢,所以我觉得你需要用 C 语言来实现这个部分,然后通过 ctypes 来调用它。你在目标机器上有 C 编译器吗?
如果你能把你的滤波器设计成 FIR 滤波器,那么你可以使用 numpy.convolve(b, x)
。