<p>首先,您需要从截止点为过滤器设置一个时间常数:<code>alpha = dt / (RC + dt)</code>和<code>cutoff = 1 / (2 * pi * RC)</code></p>
<p>您需要此因子来计算下一个过滤值:</p>
<pre><code>def low_pass(x_new, y_old, cutoff=20):
alpha = dt / (dt + 1 / (2 * np.pi * cutoff))
y_new = x_new * alpha + (1 - alpha) * y_old
return y_new
</code></pre>
<p>来自维基百科:<a href="https://en.wikipedia.org/wiki/Low-pass_filter" rel="nofollow noreferrer">low-pass</a></p>
<pre><code>def high_pass(x_new, x_old, y_old, cutoff=20):
alpha = dt / (dt + 1 / (2 * np.pi * cutoff))
y_new = alpha * (y_old + x_new - x_old)
return y_new
</code></pre>
<p>来自维基百科:<a href="https://en.wikipedia.org/wiki/High-pass_filter" rel="nofollow noreferrer">high-pass</a></p>
<pre><code>def continuous_filter(xs):
prev_highpass, prev_lowpass = 0, 0
x_prev = 0 # need initializatoin for highpass
y_prev_high = 0 # initialization
y_prev_low = 0 # initialization
for x in xs:
y_prev_high = high_pass(x, x_prev, y_prev_high)
y_prev_low = low_pass(x, y_prev_low)
x_prev = x
yield y_prev_high, y_prev_low
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)])
</code></pre>