13

我正在开发一款需要实现一组数据摆动的软件。这是我将收到的输入样本,与每个垂直像素条的亮度图合并: 替代文字

很容易看出左边距真的很不稳定(即有大量的最小值/最大值),我想生成一组图像的临界点。我已经对数据应用了高斯平滑函数 ~ 10 次,但一开始似乎很不稳定。

有任何想法吗?

这是我的原始代码,但它不会产生非常好的结果(对于摆动):

def local_maximum(list, center, delta):
  maximum = [0, 0]

  for i in range(delta):
    if list[center + i] > maximum[1]: maximum = [center + i, list[center + i]]
    if list[center - i] > maximum[1]: maximum = [center - i, list[center - i]]

  return maximum

def count_maxima(list, start, end, delta, threshold = 10):
      count = 0

  for i in range(start + delta, end - delta):
    if abs(list[i] - local_maximum(list, i, delta)[1]) < threshold: count += 1

  return count

def wiggliness(list, start, end, delta, threshold = 10):
  return float(abs(start - end) * delta) / float(count_maxima(list, start, end, delta, threshold))
4

2 回答 2

5

看看低通/高通/陷波/带通滤波器、傅立叶变换或小波。基本思想是有很多不同的方法来计算在不同时间段内量化的信号的频率内容。

如果我们能弄清楚什么是摆动,那将有所帮助。我想说最左边的边距是 wiggly b/c 它有更多的高频内容,你可以通过使用傅立叶变换来可视化。

如果您对该红色信号进行高通滤波器,您将只获得高频内容,然后您可以测量幅度并进行阈值以确定摆动。但我想摆动只是需要更多的形式主义。

于 2010-11-17T15:02:35.583 回答
1

对于这样的事情,numpy 让事情变得更容易,因为它提供了用于操作矢量数据的有用函数,例如为每个元素添加一个标量,计算平均值等。

例如,您可以尝试使用原始数据-wiggness1 或第一个差异-wiggness2 的零交叉率(取决于应该是什么摆动,确切地说,如果要忽略全球趋势,您可能应该使用差异数据)。对于 x,您将从原始数据中获取感兴趣的切片或窗口,从而获得一种局部摆动的度量。如果您使用原始数据,在消除偏差后,您可能还希望将所有小于某个阈值的值设置为 0 以忽略低幅度摆动。

import numpy as np

def wiggliness1(x):
    #remove bias:
    x=x-np.average(x)
    #calculate zero crossing rate:
    np.sum(np.abs(np.sign(np.diff(x))))


def wiggliness(x):
    #calculate zero crossing rate of the first difference:
    return np.sum(np.abs(np.sign(np.diff(np.sign(np.diff(x))))))
于 2010-11-17T17:01:41.793 回答