运行 FFTPitchDetector 时出现 IndexOutOfRangeException
Posted
技术标签:
【中文标题】运行 FFTPitchDetector 时出现 IndexOutOfRangeException【英文标题】:IndexOutOfRangeException while running FFTPitchDetector 【发布时间】:2013-02-21 16:39:15 【问题描述】:我在实施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 有开源代码吗?我希望将其外包到我的项目中。
【问题讨论】:
【参考方案1】:问题是在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);
您首先确保您将要用于每个数组的索引不大于数组的项目数。
【讨论】:
从上面的代码你能找出问题所在吗?我找不到哪一个是问题:(以上是关于运行 FFTPitchDetector 时出现 IndexOutOfRangeException的主要内容,如果未能解决你的问题,请参考以下文章
运行 Flutter Doctor 时出现 Flutter android 许可错误
运行 composer dump-autoload 时出现错误 255