2016-04-22 4 views
1

私はこれらのデータセットを完璧に間隔をおいて配置しています。ピークはディラックデルタ関数ではなくガウス形状のピークです。 Pythonを使ってピーク間の距離を非常に正確に分析する必要があります。 enter image description herePythonのピークを分析する

私は初心者ですので、私は本当にいくつかの助けに感謝します。 ファイルの種類は、.csv.h5です。

(私は.csvファイルはので、私は.h5に切り替える必要があった大規模なサンプルには大きすぎだということが分かった。)

私の分析では、これまで私はpandas -packageとnumpy -packageと私の推測を使用していました彼らが私のためにこの問題を解決することもできるということです。

だから、私はピーク上の特定の点を除外できるという考えを得ました。私はこれを試した:

import numpy as np 
import matplotlib.pyplot as plt 
import pandas as pd 

#data = [time,voltage] 
data1 = pd.read_csv('1pps_withoutReference.csv', sep=',') 

#Plot data 
time = data1["x"]; 
voltage = data1["y"]; 
plt.plot(time,voltage) 
plt.show() 

t = data1["x"]; 
v = data1["y"]; 

if n+1>4 and n-1<4: n=n; 
else v.remove('n'); 
for n in v; 

私は最後の部分でやろうとしていることのアイデアはかなり明確ですが、それは単に動作していないと思う。 私は、直前のポイントが4未満で、直後のポイントが上のポイントのみを計算します。これは私に離散的な値を与え、ピーク間の距離を探しているので、実際には関係のない小さなオフセットになります。

私は友人の助けによって問題を解決しました。

#getting t values for every peak. 
time = data1["x"] 
volt = data1["y"] 

trig_lev = 2.5 
#Creating new vector to contain the values of the peaks 
t_peak = [] 
#For-loop updating the list with the disired values 
for i in np.arange(0, len(time)): 
    if volt[i] < trig_lev and volt[i+1] >= trig_lev: 
    t_peak.append(time[i]) 
+1

何を試してみましたか(どこにいらっしゃるのかを示すコードを表示してください)、どうやって差異を定義しますか?(中心から中心、sigma = 1から) –

+0

あなたのデータのどこかをCSV/h5形式でアップロードし、ここにリンクを投稿できますか? – MaxU

+0

コームのフーリエ変換はコームです。あなたの櫛がチャープ(空間周波数の変化)のような偏差を示している場合、あなたはFT内で広がりを見せることができます。 FFTの最初の周波数ピークは間隔に対応します。 'time'ドメインにあるピークが多いほどピークが狭くなります。その最初のピークの幅は、精度に制限はありませんが、時間 - 帯域幅積を反映しています。あなたは最高の精度であなたの間隔を得るためにそのピークの放物線のフィットを作ることができます。一般的にGoogleの頻度推定です。 – roadrunner66

答えて

1

私は例えば偽vt配列を作成してみましょう。

In [1]: import numpy as np 

In [2]: v = np.random.random(20)*10 

In [3]: t = np.arange(len(v)) 

さて、数字の配列に<または>操作がブール値の配列を返すので、これは動作しますv

3〜5
In [4]: cond = np.logical_and(v < 5, v > 3) 

In [5]: cond 
Out[5]: 
array([False, False, False, True, False, False, False, False, False, 
     False, False, False, False, False, True, False, False, False, 
     False, False], dtype=bool) 

内のすべての値を見つけてみましょう。

In [6]: v 
Out[6]: 
array([ 2.82501842, 9.28107914, 8.48711041, 4.61051569, 1.77473463, 
     7.69499025, 9.74680202, 1.37199899, 6.34510291, 2.33337724, 
     2.22011283, 6.63674361, 9.20012545, 5.80648649, 4.43828229, 
     1.4105842 , 2.72444927, 2.09571288, 5.80758599, 1.73408051]) 

In [7]: v < 5 
Out[7]: 
array([ True, False, False, True, True, False, False, True, False, 
     True, True, False, False, False, True, True, True, True, 
     False, True], dtype=bool) 

In [8]: v > 3 
Out[8]: 
array([False, True, True, True, False, True, True, False, True, 
     False, False, True, True, True, True, False, False, False, 
     True, False], dtype=bool) 

logical_and関数は、2つのブール配列を結合します。

この条件が満たされている場合は、tの値を分離してください。

In [9]: ix = [y for y, u in zip(t, cond) if u] 

In [10]: ix 
Out[10]: [3, 14] 

vの値を確認してください。

In [11]: [v[i] for i in ix] 
Out[11]: [4.611, 4.438] 
+0

これは私の問題を解決するとは本当に思いませんか?これはちょうど3.5> v> 2.5のtの値を私に与えるでしょうか?私はv + 1> 4とv-1 <4のtの値が必要です。 – Nillo

+0

@Nillo私は*原則を説明していました。 「v + 1> 4」は「v> 3」であり、「v-1 <4」は「v <5」である。したがって効果的に '3

+0

ああそれはあなたがそれを理解する方法です!不明な点がありましたら申し訳ありません。データポイント「v + 1」と「v-1」のように、v + 1> 4とv-1 <4が必要です。 「v」は、点「v + 1」と「v-1」との間のデータ点であることを意味する。 – Nillo

関連する問題