如何用scipy和lfilter实时过滤?

2024-09-27 09:35:06 发布

您现在位置:Python中文网/ 问答频道 /正文

免责声明:我对dsp的使用可能没有我应该的那么好,因此,要让这段代码正常工作,我应该有更多的问题。在

我需要能够过滤传入的信号。我试着让这段代码发挥作用,但我一辈子都不能让它发挥作用。 引用scipy.signal.lfilter doc

import numpy as np
import scipy.signal
import matplotlib.pyplot as plt
from lib import fnlib

samples = 100
x = np.linspace(0, 7, samples)
y = [] # Unfiltered output
y_filt1 = [] # Real-time filtered

nyq = 0.5 * samples
f1_norm = 0.1 / nyq
f2_norm = 2 / nyq
b, a = scipy.signal.butter(2, [f1_norm, f2_norm], 'band', analog=False)
zi = scipy.signal.lfilter_zi(b,a)
zi = zi*(np.sin(0) + 0.1*np.sin(15*0))

这会将zi初始设置为zi*y[0],在本例中为0。取自lfilter文档中的示例代码。不确定这是否正确。在

然后到了我不确定如何处理最初的几个样品的地步。 a和b系数在这里是len(a)=5。 由于lfilter需要从现在到n-4的输入值,我是用零填充它,还是需要等到5个样本过去,将其作为一个块进行采样,然后继续对下一步进行采样?在

^{pr2}$

Tags: 代码importnormsignalasnpscipysin
1条回答
网友
1楼 · 发布于 2024-09-27 09:35:06

我想我也遇到了同样的问题,并在https://github.com/scipy/scipy/issues/5116上找到了一个解决方案:

from scipy import zeros, signal, random

def filter_sbs():
    data = random.random(2000)
    b = signal.firwin(150, 0.004)
    z = signal.lfilter_zi(b, 1)
    result = zeros(data.size)
    for i, x in enumerate(data):
        result[i], z = signal.lfilter(b, 1, [x], zi=z)
    return result

if __name__ == '__main__':
    result = filter_sbs()

其思想是在每个后续调用中使用pass The filter statez。在前几个示例中,过滤器可能会给出奇怪的结果,但是过了一段时间(取决于过滤器的长度),它应该可以正常工作。在

相关问题 更多 >

    热门问题