【问题标题】:Filtering accelerometry data in scipy在 scipy 中过滤加速度数据
【发布时间】:2025-12-02 01:30:01
【问题描述】:

我是 python 和 scipy 的新手,我正在尝试过滤 25Hz 的 3 维加速度数据。我遇到了一个奇怪的问题,在应用过滤器后,我的数据图被平滑了,但是根据过滤器的顺序和截止频率,这些值似乎被放大了很多。这是我的代码:

from scipy import loadtxt 
from scipy import signal
import numpy as np
import matplotlib.pyplot as plt 
my_data = loadtxt("DATA-001.CSV",delimiter=",",skiprows=8)


N, Wn = signal.buttord( [3,11], [.3,18], .1, 10, True)
print N
print Wn
b,a = signal.butter(N, Wn, 'bandpass', analog=True)


filtered_z = signal.filtfilt(a,b,[my_data[1:500,3]],)
filtered_z = np.reshape(filtered_z, (499,))
plt.figure(1)
plt.subplot(411)
plt.plot(my_data[1:500,0],my_data[1:500,3])

plt.subplot(412)
plt.plot(my_data[1:500,0], filtered_z, 'k')
plt.show()

现在,此代码返回此图:

如果有人有任何建议,我不确定如何摆脱这个奇怪的增益问题? 谢谢!

【问题讨论】:

  • 你在 signal.filtfilt 中有错误的系数。应该是:filtered_z = signal.filtfilt(b,a,[my_data[1:500,3]],)。此外,滤波器极点和零点的大小会导致放大。
  • @EngineerCamp 你的评论应该是一个答案!
  • @EngineerCamp 感谢您的回复!但是,当我切换系数时,我的所有数据都变成了“nan”,有解决方案吗?
  • @ZackyBalkhy 听起来您的滤波器不稳定,因此请查看系数以确定。您想使用带通滤波器而不是低通滤波器有什么特别的原因吗?
  • @EngineerCamp 我希望能够滤除高端噪声和低端重力效应(我在某处读到这可以通过滤波器完成)但我会将其切换为低通和然后我可以稍后在算法上解释重力。我的系数应该是什么样的?感谢所有的帮助。

标签: python filter scipy


【解决方案1】:

您在 signal.filtfilt 中的系数有误。应该是:

filtered_z = signal.filtfilt(b,a,[my_data[1:500,3]],)

系数的大小和比率会导致信号放大。

【讨论】:

  • 感谢您的回复!但是,当我切换系数时,我的所有数据都变成了“nan”,有解决方案吗?
  • @ZackyBalkhy 您能解释一下您是如何得出带通和阻带频率的吗?
  • 我将我在文献中读到的频率用于加速度计滤波并对其进行调整以尝试找到最佳平滑。
  • @ZackyBalkhy 过滤器设计既是一门艺术,也是一门科学。看看这个帖子*.com/questions/12093594/… 的答案,并用你的价值观来尝试一下。您当前的滤波器设计指定带通在 0.5 到 1.75 Hz 之间,我怀疑这是否真的是您想要的。这也可能导致您的过滤器不稳定。有关详细信息,请参阅quora.com/…