gpt4 book ai didi

python - 如何使用 scipy 和 lfilter 进行实时过滤?

转载 作者:太空狗 更新时间:2023-10-30 00:13:17 31 4
gpt4 key购买 nike

免责声明:我在 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 中的示例代码中获取了它 文档,但我不确定这是否正确。

然后到了我不确定如何处理少数初始样本的地步。此处的系数 ablen(a) = 5。当 lfilter 接受从现在到 n-4 的输入值时,我是用零填充它,还是需要等到 5 个样本过去并将它们作为一个整体,然后连续对每个样本进行采样下一步以同样的方式?

for i in range(0, len(a)-1): # Append 0 as initial values, wrong?
y.append(0)

step = 0
for i in xrange(0, samples): #x:
tmp = np.sin(x[i]) + 0.1*np.sin(15*x[i])
y.append(tmp)

# What to do with the inital filterings until len(y) == len(a) ?

if (step> len(a)):
y_filt, zi = scipy.signal.lfilter(b, a, y[-len(a):], axis=-1, zi=zi)
y_filt1.append(y_filt[4])

print(len(y))
y = y[4:]
print(len(y))
y_filt2 = scipy.signal.lfilter(b, a, y) # Offline filtered

plt.plot(x, y, x, y_filt1, x, y_filt2)
plt.show()

最佳答案

我想我遇到了同样的问题,并在 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) * data[0]
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()

想法是在每次后续调用 lfilter 时传递过滤器状态 z。对于前几个样本,过滤器可能会给出奇怪的结果,但稍后(取决于过滤器长度)它开始正常运行。

关于python - 如何使用 scipy 和 lfilter 进行实时过滤?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40483518/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com