运行FFTPitchDetector时发生IndexOutOfRangeException

本文关键字:IndexOutOfRangeException FFTPitchDetector 运行 | 更新日期: 2023-09-27 18:00:29

我在实现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);

在CCD_ 4中。我的代码有什么问题?

有没有C#吉他调谐器的开源代码?我希望把它外包到我的项目中。

运行FFTPitchDetector时发生IndexOutOfRangeException

问题是,在fftBuffer[]buffer[]中,您试图访问数组中不存在的索引。

因此,如果fftBuffer[]有4个项目,而n * 2总共有6个,那么您正在尝试访问不存在的fftBuffer[6]

因此,基本上,在尝试访问它们的值之前,您需要检查每个数组中有多少项。

您需要在代码中进行检查,例如:

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

首先要确保要用于每个数组的索引不大于数组中的项数。