2017-02-16 15 views
0

私はC++の自己相関法を使ってピッチトラッキングを実装していますが、自己相関を実行する実際のコード行を書くのは苦労しています。forループを使ったC++での反復自己相関処理の実装

私はあらかじめ記録された信号の振幅値の一定の数('値')を含む配列を持ち、これらの値の設定数(N)で自己相関関数を実行しています。

Iは元の配列を採取し、その時点= 0点N、点1 =点N-1などのように、それを反転している自己相関を行うために、この配列は、ここrevarray

は何と呼ばれています私は数学的にしたい:

(array[0] * revarray[0]) 
(array[0] * revarray[1]) + (array[1] * revarray[0]) 
(array[0] * revarray[2]) + (array[1] * revarray[1]) + (array[2] * revarray[0]) 
(array[0] * revarray[3]) + (array[1] * revarray[2]) + (array[2] * revarray[1]) + (array[3] * revarray[0]) 

...など。配列のすべてのサンプルに対して自己相関が実行されるまで、これは配列[900] - > array [1799]などに対して繰り返されます。

自己相関が行われた回数は、次のとおりです。ここで

値/ N =測定

は、私のコードのreleventセクションでは、私は私がしたいことを知って、これまで

for (k = 0; k = measurements; ++k){ 
    for (i = k*(N - 1), j = k*N; i >= 0; i--, j++){ 
     revarray[j] = array[i]; 
     for (a = k*N; a = k*(N - 1); ++a){ 
      autocor[a]=0; 
      for (b = k*N; b = k*(N - 1); ++b){ 
       autocor[a] += //**Here is where I'm confused**// 
      } 
     } 
    } 
} 

です反復的に新しい値をautocor [a]に追加し続けるが、私の問題は、追加する必要がある値が変化し続けることである。 、

for (i = (k*N); i = k*(N-1); ++i){ 
    autocor[i] += array[i] * revarray[i-1] 
} 

しかし、私は明らかに新しい値が前のautocorに追加されたときに[i]は、この前の値が不正確になりますように、この動作しません知っている:私はそうのように増加し、カウントを使用して試してみましたi = 0の場合、revarray [i-1]を使用して計算することは不可能です

提案がありますか?これとしばらくの間闘ってきました。 hereと表示されているように、1つのアレイ(1度にN個のサンプルを取っていない)で動作させることができましたが、逆配列を使用する方がはるかに効率的なアプローチだと思います。信号全体。

答えて

0

私にはそれほど明確ではありませんが、その配列に要素がある回数だけ反復を実行する必要があると仮定します。

またNは、アレイの大きさを意味すると仮定し、そう最後の要素のインデックスN-1です。

ループはそのように見えるでしょう:

for(size_t i = 0; i < N; ++i){ 
    autocorr[i] = 0; 
    for(size_t j = 0; j <= i; ++j){ 
     const size_t idxA = j 
        , idxR = i - j; // direct and reverse indices in the array 
     autocorr[i] += array[idxA] * array[idxR]; 
    } 
} 

基本的にはあなたのarray内の要素があるとして、あなたは何回と外側のループを実行し、それらの反復ごとに、あなたは現在までの短いループを実行します外側の配列の最後のインデックス

ここで行われるべきことは、計算を実行して現在の外側ループのインデックスのランニングサムを集計するためにarrayrevarrayのインデックスを適切に計算することです。

+0

自己相関関数の半分だけを使用して必要な値を計算することができます。自己相関が正常に機能すると、その値を反映するようにコードを調整します。私の価値観はa = k * Nから始まります。最後の要素がN-1であることを反映するためにループ内にa = k *(N-1)があります。 –

+0

絶対的な命を救うために絶対に私のコメントを投稿しました。これは私が何週間もやろうとしてきたことですが、ついにそれはうまくいきます、ありがとう!私はそれが実際にどれほど単純かを信じることができません –

+0

2レベル以上のネスティングになると、一時停止して正しいトラックにいるかどうかを考えなければなりません;-)ほとんどの問題は、シンプル。 – YePhIcK