用于活动识别的低通滤波平滑码的优化

2024-10-01 13:42:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试在加速度计数据上实现一个低通滤波器(使用x加速度(ax)、y加速度(ay)、z加速度(az))

我计算出我的α值是0.2

沿x方向的直流分量用以下公式计算

new_ax[n]=(1-α)*新[n-1]+(α*ax[n])

我可以计算一个只有几千条记录的小数据集。但是我有一个包含一百万条记录的数据集,用下面的代码运行需要很长时间。我将非常感谢任何帮助,即兴发挥我的代码的时间复杂性。在

### df is a pandas dataframe object
n_ax = []
seq = range(0, 1000000, 128)
for w in range(len(seq)):
   prev_x = 0
   if w+1 <= len(seq):
      subdf = df[seq[w]:seq[w+1]]
      for i in range(len(subdf)):
          n_ax.append((1-alpha)*prev_x + (alpha*subdf.ax[i]))
          prev_x = n_ax[i]

Tags: 数据inalphadfforlen记录range
2条回答

首先你似乎不需要

if w+1 <= len(seq):

w变量不会超过len(seq)。在

因此,要减少处理时间,只需使用numpy模块:

^{pr2}$

在这里,您将找到比内置列表快得多的数组和方法。例如,您可以直接在数组上应用numpy函数,而不是遍历numpy数组中的每个元素来进行一些处理,并且可以在几秒钟内获得结果,而不是几小时。例如:

data = numpy.arange(0, 1000000, 128);
shiftData = numpy.arange(128, 1000000, 128);
result = (1-alpha)*data[:-1] + shiftdata;

查看一些关于numpy的教程。我使用这个模块来处理图像数据,相比之下,循环浏览列表需要2周时间来处理5000多个图像,而使用numpy类型最多需要2分钟。在

假设您使用的是python2.7。在

  • 使用xrange。在
  • 不需要在循环中计算len(seq),因为它的值没有变化。在
  • 访问seq实际上并不需要它,因为您可以动态地计算它。在
  • 实际上您并不需要if语句,因为在代码中它的计算结果总是为true(w in range(len(seq))表示w最大值为len(seq)-1)。在
  • 为了得到subdf而进行的切片并不是真正必要的,因为您可以直接访问df(切片会创建一个新的列表)。在

请参阅下面的代码。在

n_ax = []
SUB_SAMPLE = 128
SAMPLE_LEN = 1000000
seq_len = SAMPLE_LEN/SUB_SAMPLE
for w in xrange(seq_len):
   prev_x = 0
   for i in xrange(w*SUB_SAMPLE,(w+1)*SUB_SAMPLE):
       new_x = (1-alpha)*prev_x + (alpha*df.ax[i])
       n_ax.append(new_x)
       prev_x = new_x

我想不出还有什么明显的优化。如果这仍然很慢,也许您应该考虑将df数据复制到python本机数据类型。如果这些都是float,那么使用python array,它的性能非常好。在

如果您还需要更好的性能,可以尝试使用multiprocessing模块并行,或者编写一个C模块,在内存中获取一个数组并进行计算,然后用ctypespython库调用它。在

相关问题 更多 >