2016-06-15 5 views
0

これは私の最初の投稿ですので、間違いを犯すのを許してください。サイクルの開始と終了を見つけ、配列から周波数を計算する

私がやっていることは、与えられた二重配列の読み取り値から周波数を計算することです。この配列は、各読みに対応する時間を持ちます。例えば

、読み取りは0.010.110.210.180.1-0.03-0.2-0.120ようなものというように、各読み取りは秒単位で対応する時間を有します。サイクルは正の読書からうまく起動しているとき

double start = read[0]; 
bool trough = false; 
double cycle = 0; // Time for one cycle 

for (int j = 1; j < read.Count; j++) 
{ 
    if (read[j] < start) 
    { 
     trough = true; 
    } 
    else if (trough) 
    { 
     cycle = seconds[j]; 
     break; 
    } 
} 

これは、これまでに動作しますが、サイクルの開始が負の読書のときに失敗します。

私が起動し、サイクルを見つけるために使用しているアプローチがあります。 サイクルでは、私は完全な正弦曲線を意味する..この二重の配列は、オシロスコープで見られるように、サインカーブの数でExcelにプロットされた場合に波形を形成します。私が見つけようとしているのは、 1つの正弦波の終わり。実際、startは配列の最初の値ですが、最初の正弦波の終わりを取得する方法は、私が失われているところです。 私の脳は明らかな誤り/解決策が完全に欠けているので、親切に助けてください。 すべて歓迎

+1

ようこそStackOverflow!特定の配列から見つけたい値をいくつか例を挙げて説明してください。 –

+0

はい、私は非常に説明していない場合はもちろん、申し訳ありません..サイクルでは、私は完全な正弦曲線を意味する..このようなダブルフォームの波形は、オシロスコープ..私が見つけようとしているのは、効率的に1つの正弦波の始まりと終わりを得る方法です – shadow2kn

+0

実際には最初は配列の最初の値ですが、最初の正弦波の終わりを得る方法はどこにあるのですか? – shadow2kn

答えて

0

正弦波は約0で始まり、例では0.21に増加しています。その後、それは-0.2に落ち、再び0に上がります。

だから、まずゼロより下に落ちる点を見つけて、再びゼロに達する瞬間を検出する必要があります。

あなたはこのようにそれを試すことができます。

int index = 0; 
while (read[index] >= 0) index++; // skip first half sine wave 
while (read[index] <= 0) index++; // skip second half 
double cycle = seconds[index-1]; // take seconds of the last reading of the wave 

更新:あなたの波が完全に正または負の範囲内とすることができるので、私たちは別のアプローチが必要です。

  • - (3 /2π波の半分、π/ 2)の最初の立ち上がり部(波の最初の4番目、0-π/ 2)
  • に落ちる部分を

    • を見つけてみましょう最後の立ち上がり部分(波の最後の4分の3 /2π - 2π)

    次の最大値ではなく、開始値に再び達したときに波が終了するため、最後はトリッキーです。

    int start = 0; // start of the wave 
    int index = start + 1; // start at 1 to compare to previous 
    while (read[index] >= read[index-1]) index++; // skip rising part 
    index++; // skip the last rising element 
    
    while (read[index] =< read[index-1]) index++; // skip falling part 
    index++; 
    
    // now step forward till we reach our start level again 
    while (read[index] < read[start]) index++; 
    
    // read your time 
    double cycle = seconds[index-1]; 
    
    // you can start the next wave here: 
    start = index; // and do the above in a loop if you need 
    
  • +0

    ありがとうございました。しかし、これはすべて正の範囲にある読み値に対応していません。 – shadow2kn

    +0

    @ shadow2kn私の答えを更新して、それが助けてくれることを願って、今オフラインです。 –

    +0

    あなたは本当に...それは働いた.. – shadow2kn

    関連する問題