13

私は、一連のデータの小刻みに動くことを実装する必要があるソフトウェアに取り組んでいます。これが私が受け取る入力のサンプルであり、各垂直ピクセルストリップの明度プロットとマージされています。 代替テキスト

左マージンが本当に波打っていること(つまり、最小値/最大値が1トンあること)は簡単にわかります。画像の重要なポイントのセットを生成したいと思います。ガウス平滑化関数をデータに約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

ローパス/ハイパス/ノッチ/バンドパスフィルター、フーリエ変換、またはウェーブレットを見てください。基本的な考え方は、さまざまな期間にわたって量子化された信号の周波数成分を把握するためのさまざまな方法がたくさんあるということです。

ウィグリネスとは何かを理解できれば、それは役に立ちます。左端のマージンは波打っていると思いますが、フーリエ変換を使用して視覚化できる高周波コンテンツが多く含まれています。

その赤い信号のハイパスフィルターを使用すると、高周波成分だけが得られ、振幅を測定してしきい値を設定し、揺れを判断できます。しかし、私は、小刻みに動くことは、その背後にもっと形式主義が必要だと思います。

于 2010-11-17T15:02:35.583 に答える
1

このような場合、numpyは、各要素にスカラーを追加したり、平均値を計算したりするなど、ベクトルデータを操作するための便利な関数を提供するため、作業がはるかに簡単になります。

たとえば、元のデータ(wiggliness1)または最初の差(wiggliness2)の交差率をゼロにしてみてください(正確には、wigglinessが何であるかによって異なりますが、グローバルトレンドを無視する場合は、差データを使用する必要があります)。 )。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 に答える