tro*_*dhe 6 python filtering signal-processing real-time scipy
免责声明:我可能不如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))
Run Code Online (Sandbox Code Playgroud)
这最初将zi设置为zi*y [0],在本例中为0.取自lfilter doc中的示例代码.不确定这是否正确.
然后它到了我不确定如何使用初始少量样本的地步.这里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()
Run Code Online (Sandbox Code Playgroud)
我想我遇到了同样的问题,并在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()
Run Code Online (Sandbox Code Playgroud)
这个想法是z在每次后续调用中传递过滤器状态lfilter。对于前几个样本,过滤器可能会给出奇怪的结果,但稍后(取决于过滤器长度)它开始正确运行。
| 归档时间: |
|
| 查看次数: |
3261 次 |
| 最近记录: |