我有一个应用程序,接收固定频率的输入信号。我一直在尝试为这个传入信号实现一个过滤器,而不必节省N个时间步并对其执行过滤功能。我想做的是类似于一维卡尔曼滤波器,我用新的观测值更新我的当前状态。我不是数学家,因此维基百科关于这是否可能的页面对我来说是完全无法理解的。此外,这个域中的StackOverflow答案(我已经发现)只考虑是否有N个时间步的信号可用,以及如何对其执行过滤,我可以毫无问题地进行过滤
我在下面提供了一些虚拟代码,说明了我一直试图编写的函数类型
import numpy as np
import matplotlib.pyplot as plt
def high_pass(new, previous, cutoff=20):
# Howto?
return 0
def low_pass(new, previous, cutofff=20):
# Howto?
return 0
def continuous_filter(vs):
prev_highpass, prev_lowpass = 0, 0
for v in vs:
prev_highpass = high_pass(v, prev_highpass)
prev_lowpass = low_pass(v, prev_lowpass)
yield prev_highpass, prev_lowpass
np.random.seed(21)
sec_duration = 10.0
time_resolution = 1e3
dt = 1/time_resolution
steps = int(sec_duration * time_resolution)
signal = np.sum([np.sin(np.linspace(0, np.random.randint(10, 100), steps)) * np.random.random() for _ in range(3)], axis=0)
filt_signals = np.array([[high, low] for high, low in continuous_filter(signal)])
plt.plot(signal, label="Input signal")
plt.plot(filt_signals[:, 0], label="High-pass")
plt.plot(filt_signals[:, 1], label="Low pass")
plt.legend()
plt.show()
有人能告诉我这是否可能吗?我一直在看电影,但我不明白
首先,您需要从截止点为过滤器设置一个时间常数:
alpha = dt / (RC + dt)
和cutoff = 1 / (2 * pi * RC)
您需要此因子来计算下一个过滤值:
来自维基百科:low-pass
来自维基百科:high-pass
这是一个很好的回答,多利安,谢谢你。经过多年的阴影堆栈溢出,这将是我的第一个贡献。它是次要的,希望它有助于扩展用例。尽可能多地保留原始符号,以便于跟踪
只需要两次进口
对rc_高通量α值的轻微修正
现在转到主屏幕,我使用赫兹和秒的物理单位。请原谅基数为2的数字表示法,它有助于为FFT设置舞台
输入信号不同,更接近我的典型用例,结果图显示通常的RC滤波器不是很快。这是一个经典的解决方案,在这里使用它很好
Two-tone input, 6 octave separation; substantial spectral leakage.
相关问题 更多 >
编程相关推荐