0

C# の陰アルゴリズムで基本周波数をカウントする必要があります。

1 秒の長さ 250Hz の正弦波の振幅を含む配列 (data[44100]) があります。これが私のコードです:

int t = 0;                    //starting point of the window
int w = data.Length / 25;     //the end of the window so the size of the window is 40msec
int rmax = 0;                 //the maximum of the correlation function
int period = 0;               //the period of the sinus

for (int tau = 0; tau < w; tau++)
{ 
    int r = 0;
    for (int j = t + 1; j < (t + w); j++)
    {
       r = r + (data[j] * data[j + tau]);
    }     
    if (r > rmax)
    {
       rmax = r;
       period = tau;
    }
}

float time = (float)period/44100;
float freq = 1.0f / time;
System.Console.WriteLine(freq);

周波数として 250 を取得する必要がありますが、問題が発生しています。配列の値は良好です。Excel で確認したところ、期間は正常でした。誰か助けてくれませんか?

4

2 に答える 2

2

自己相関関数にゼロの遅れを含めており、信号はゼロの遅れでそれ自体と完全に相関しています。また、正弦波が次の自己相関ピークを持つ 1 周期の遅れに達する前に (tau < w) 停止します。

予想される期間の半分のタイムラグから始めて、予想される期間の 1.5 倍までステップアップしてみてください。

于 2012-09-30T19:26:57.807 に答える
1

コードとコメントの間に不一致があります。

1 秒 / 25 は、0.4 秒ではなく 0.04 秒になります。

于 2012-09-30T17:59:42.643 に答える