0

の実装でいくつかの問題に直面していますFFTPitchDetector。私が実際にやりたいのは、ギター入力からリアルタイムの周波数を取得することです。関数の使用方法がよくわかりませんFftPitchDetector.cs。何か案が?

private void sourceStream_DataAvailable(object sender, NAudio.Wave.WaveInEventArgs e)
{    
   if (waveWriter == null) return;

    byte[] buffer = e.Buffer;
    float[] floats = new float[buffer.Length];
    float sample32 = 0;
    int bytesRecorded = e.BytesRecorded;

    waveWriter.Write(buffer, 0, bytesRecorded);

    for (int index = 0; index < e.BytesRecorded; index += 2)
    {
        short sample = (short)((buffer[index + 1] << 8) |
                                buffer[index + 0]);
        sample32 = sample / 32768f;
        sampleAggregator.Add(sample32);
    }

    floats = bytesToFloats(buffer);

    FftPitchDetector PitchDetect = new FftPitchDetector(sample32);
    PitchDetect.DetectPitch(floats, bytesRecorded);

    Console.WriteLine("{0}",sample32);
}

private static float[] bytesToFloats(byte[] bytes)
{
    float[] floats = new float[bytes.Length / 2];

    for (int i = 0; i < bytes.Length; i += 2)
    {
        floats[i / 2] = bytes[i] | (bytes[i + 1] << 8);
    }

    return floats;
}

コードを実行すると、次IndexOutOfRangeException was unhandledの行を指すエラーが発生します

fftBuffer[n * 2] = buffer[n-inFrames] * window(n, frames);

fftPitchDetector.cs。私のコードの問題は何ですか?

C# Guitar Tuner のオープン ソース コードはありますか? 私はそれを私のプロジェクトにアウトソーシングしたいと考えています。

4

1 に答える 1

1

問題は、fftBuffer[]またはbuffer[]存在しない配列内のインデックスにアクセスしようとしているということです。

したがって、fftBuffer[]4 つの項目があり、合計 6 の場合、存在しないものn * 2にアクセスしようとしています。fftBuffer[6]

したがって、基本的に、値にアクセスする前に、各配列にいくつの項目があるかを確認する必要があります。

コードにチェックを入れる必要があります。次に例を示します。

if ((n * 2) < fftBuffer.length && (n - inFrames) < buffer.length) {
    fftBuffer[n * 2] = buffer[n-inFrames] * window(n, frames);
}

最初に、各配列に使用しようとしているインデックスが、配列の項目数を超えていないことを確認します。

于 2013-02-21T16:46:25.477 に答える