1

パラレルポートで生成された信号がどれだけ安定しているかを測定しています。

オシロスコープによって生成された CSV ファイルからインポートされた numpy 配列があります。次の出力は、問題を示すために削除されたバリアントです。

import numpy as np
data = np.array([0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0])

t = np.array([0.    ,0.0005, 0.001 ,0.0015,
     0.002 ,0.0025, 0.003 ,0.0035,
     0.004 ,0.0045, 0.005 ,0.0055,
     0.006 ,0.0065, 0.007 ,0.0075,
     0.008 ])

プロットするとこんな感じ。 ここに画像の説明を入力

インパルスの持続時間をリストの値として取得する最もクリーンな方法を探しています。

これを書いた後、私はソリューションを自分でゼロから実装しようとします。私が望んでいるのは、持続時間を取得するための好ましい方法です。おそらく、私が気付いていないためのnumpy関数がありますか?

4

4 に答える 4

1

入力信号がデバウンスされていると仮定すると、配列をループすることができます。

high_times = []

low_high = 0

for i in xrange(len(t) - 1):
    if data[i] == 0 and data[i+1] == 1:
        low_high = i
    elif data[i] == 1 and data[i+1] == 0:
        high_times.append(t[i] - t[low_high])

high_timesは、信号が各パルスで高い状態にあった時間のリストです。

于 2012-10-30T11:11:34.577 に答える
1

がとdataの int 配列であると仮定します。01

1.)0これは、最後のパルスから最後のパルスまでの持続時間を定義し1ます。

import numpy as np

idx = t[np.abs(np.diff(data)) == 1]
lasting_times = idx[1::2] - idx[::2]

2.)1最初から最後まで持続時間の定義を好む場合1:

diff = np.diff(data)
lasting_times = t[diff == -1] - t[1:][diff == 1]

: いずれにせよ、データの末尾に対処する必要があります。つまり、これらのソリューションでは、data先頭と末尾が0...であると想定しています。

于 2012-10-30T12:04:26.480 に答える
0

データ リストに 1 と 0 のみが含まれていると仮定します。

print [(m.start(),m.end()) for m in re.finditer('1+', '0000111100001111')]

出力

 [(4, 8), (12, 16)]
于 2012-10-30T11:17:17.600 に答える
0

itertools モジュールの groupby を使用すると、非常に簡単に実行できます。

from itertools import groupby
#union of the point with duration of the point
val_dt = zip(data[:-1],t[:-1]-t[1:])
#groupby to unite similar values
steps = [ (g[0],sum( h[1] for h in g[1])) for g in groupby(val_dt,lambda s:s[0])]
print steps
#[(0, -0.002), (1, -0.002), (0, -0.002), (1, -0.002)]

この方法は、メモリ管理の観点からは完全ではありませんが、機能します。

于 2012-10-30T16:54:48.253 に答える