<p>这是一个很好的回答,多利安,谢谢你。经过多年的阴影堆栈溢出,这将是我的第一个贡献。它是次要的,希望它有助于扩展用例。尽可能多地保留原始符号,以便于跟踪</p>
<p>只需要两次进口</p>
<pre><code>'''python
import numpy as np
import matplotlib.pyplot as plt
</code></pre>
<p>对rc_高通量α值的轻微修正</p>
<pre><code>def rc_low_pass(x_new, y_old, sample_rate_hz, lowpass_cutoff_hz):
dt = 1/sample_rate_hz
rc = 1/(2*np.pi*lowpass_cutoff_hz)
alpha = dt/(rc + dt)
y_new = x_new * alpha + (1 - alpha) * y_old
return y_new
def rc_high_pass(x_new, x_old, y_old, sample_rate_hz, highpass_cutoff_hz):
dt = 1/sample_rate_hz
rc = 1/(2*np.pi*highpass_cutoff_hz)
alpha = rc/(rc + dt)
y_new = alpha * (y_old + x_new - x_old)
return y_new
def rc_filters(xs, sample_rate_hz,
highpass_cutoff_hz,
lowpass_cutoff_hz):
# Initialize. This can be improved to match wikipedia.
x_prev = 0
y_prev_high = 0
y_prev_low = 0
for x in xs:
y_prev_high = rc_high_pass(x, x_prev, y_prev_high, sample_rate_hz,
highpass_cutoff_hz)
y_prev_low = rc_low_pass(x, y_prev_low, sample_rate_hz,
lowpass_cutoff_hz)
x_prev = x
yield y_prev_high, y_prev_low
</code></pre>
<p>现在转到主屏幕,我使用赫兹和秒的物理单位。请原谅基数为2的数字表示法,它有助于为FFT设置舞台</p>
<pre><code>if __name__ == "__main__":
"""
# RC filters for continuous signals
"""
sample_rate = 2**13 # Close to 8 kHz
duration_points = 2**10
sec_duration = duration_points/sample_rate
frequency_low = sample_rate/2**9
frequency_high = sample_rate/2**3
# Design the cutoff
number_octaves = 3
highpass_cutoff = frequency_high/2**number_octaves
lowpass_cutoff = frequency_low*2**number_octaves
print('Two-tone test')
print('Sample rate, Hz:', sample_rate)
print('Record duration, s:', sec_duration)
print('Low, high tone frequency:', frequency_low, frequency_high)
time_s = np.arange(duration_points)/sample_rate
sig = np.sin(2*np.pi*frequency_low*time_s) + \
np.sin(2*np.pi*frequency_high*time_s)
filt_signals = np.array([[high, low]
for high, low in
rc_filters(sig, sample_rate,
highpass_cutoff, lowpass_cutoff)])
</code></pre>
<p>输入信号不同,更接近我的典型用例,结果图显示通常的RC滤波器不是很快。这是一个经典的解决方案,在这里使用它很好</p>
<pre><code>plt.plot(sig, label="Input signal")
plt.plot(filt_signals[:, 0], label="High-pass")
plt.plot(filt_signals[:, 1], label="Low-pass")
plt.title("RC Low-pass and High-pass Filter Response")
plt.legend()
plt.show()
</code></pre>
<p><a href="https://i.stack.imgur.com/a2cX0.png" rel="nofollow noreferrer">Two-tone input, 6 octave separation; substantial spectral leakage.</a></p>