我很难弄清楚如何使用高通滤波器通过“scipy butter”功能消除数据信号的直流偏移,因为我的采样率非常高。我的问题的症结似乎是我的采样率 Fs 非常高,而我的截止频率非常低(理想情况下只是 DC 偏移分量,但可能是 1 到 10Hz,采样率为 125ksps)。
这是我的示例代码:
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt
# inital parameters
Fs = 125000 # sample rate (if changed to 125sps looks better)
n = 9 # filter order
Fc = 10 # cut off freq (Hz)
Nyq = Fs/2. # Nyquist freq (1/2 Fs)
Fcc = float(Fc)/float(Nyq) # normalized cut off freq
# find butterworth xfer functions
sos = signal.butter(n, Fcc, btype='hp', output='sos', analog=False)
# find freq/mag
w, h = signal.sosfreqz(sos, worN=1500, fs=Fs)
#convert to log scale
h_db = 20*np.log10(np.abs(h))
# plot filter response
fig1, ax1 = plt.subplots(1, 1)
ax1.plot(0.5*Fs*(w/np.pi), h_db)
ax1.set_title('db log')
plt.show()
我认为这是按预期工作的,因为将采样率从 125,000 降至 125 会产生看起来合理的响应。我认为我在这里缺少 Fc 与 Fs 的一些基本内容。
这是响应图:
这是我尝试将此过滤器应用于的数据的屏幕截图:
如您所见,我想使用高通滤波器从我的数据文件中过滤掉一个 DC 偏移量。现在我只是想让过滤器响应正常运行,所以我还不担心处理数据 - 我只是添加了数据文件截图以供参考。我不需要任何花哨的东西。所以我的问题如下:
- 为什么我会有响铃和如此激进的反应?
- 低截止频率和高采样率如何影响滤波器响应?
- 为什么 Scipy 从 b,butter() 过滤器中的方法转到“sos”?我很好奇他们为什么切换到这种新的 sos 方法。我的理解是它更准确和/或防止 b,a 方法中的错误。我不确定这是否只是将二阶传递函数连接在一起,尽管级联更简单过滤器什么的。
- 此外,您可以注意到(如果您打印(w)以查看我的频率轴)我的频率似乎从 0 运行到 2*pi。这是正常的还是应该从0到pi?
- 如果问题 #4 是“是的,这应该是 0 到 2*pi”而不是脚本中的第 23 行:
实际上是
ax1.plot(0.5*Fs*(w/(2*np.pi)), h_db)
以便我在最终结果/图中的频率范围从 0 到 1/2*Fs?
谢谢你的帮助!

