【发布时间】:2017-03-21 21:05:50
【问题描述】:
免责声明:我在 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 个样本过去并将它们作为一个块,然后在相同的下一步中连续采样怎么办?
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()
【问题讨论】:
-
你找到解决办法了吗?
-
是的,我在一年前的某个时候解决了这个问题。我可以看看我是否有时间重新挖掘它,因为我忘记了很多细节。
-
输出的差异与块大小无关。通过循环在每次迭代中提供多少样本并不重要。在实时版本(第二个代码块)中,过滤器的状态未初始化。在离线版本(第一个代码块)中,它使用
lfilter_zi进行初始化。
标签: python scipy filtering signal-processing real-time