2013-02-21 4 views
0

Je rencontre des problèmes lors de l'implémentation FFTPitchDetector. Ce que je veux réellement faire est d'obtenir la fréquence en temps réel de la guitare, je ne sais pas comment utiliser les fonctions dans FftPitchDetector.cs. Une idée?IndexOutOfRangeException lors de l'exécution FFTPitchDetector

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; 
} 

Lorsque j'exécute le code, il y a une erreur IndexOutOfRangeException was unhandled qui pointe vers la ligne

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

dans fftPitchDetector.cs. Quel est le problème dans mon code?

Y at-il un code source libre de C# Guitar Tuner? Je souhaite l'externaliser dans mon projet.

Répondre

1

Le problème est que dans fftBuffer[] ou buffer[] vous essayez d'accéder à un index dans le tableau qui n'existe pas.

Donc si fftBuffer[] a 4 éléments et n * 2 totalise 6 alors vous essayez d'accéder à fftBuffer[6] qui n'existe pas.

Donc, fondamentalement, vous devez vérifier combien d'éléments sont dans chaque tableau avant d'essayer d'accéder à leurs valeurs.

Vous devrez placer des contrôles dans votre code, par exemple:

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

Vous devez d'abord vous assurer que les indices que vous allez utiliser pour chaque tableau n'est pas plus alors le nombre d'éléments du tableau.

+0

à partir du code ci-dessus pouvez-vous comprendre les problèmes? Je ne peux pas trouver lequel est le problème :( –

Questions connexes