在C#中实现FftPitchDetector

时间:2013-02-21 17:55:56

标签: c# fft naudio audio-processing

我已将FftPitchDetector.cs添加到我的项目中,但我不确定如何使用它。

我的代码:

private void sourceStream_DataAvailable(object sender, NAudio.Wave.WaveInEventArgs e)
        {

            if (waveWriter == null) return;

            byte[] buffer = e.Buffer;

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


            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(XXXXXX, XXXXXXXXXXX);**

           }

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

我应该把哪些参数放在 PitchDetect.DetectPitch(XXXXXX,XXXXXXXXXXX); ??

如何使用FftPitchDetector.cs获取输入频率?

谢谢!

1 个答案:

答案 0 :(得分:1)

我写了一篇随附的文章,解释了这段代码的工作原理,可以访问here。基本上,您传入的是一个样本数组,以及一个数字,表示该数组中有多少个样本(如果它与数组的长度不同)。它以Hz为单位返回频率。但是,请记住,此代码只是试图选择一个音符,以便它可以计算出自动调整效果的音调偏移量,因此它只查找某个范围内的值,并且可能实际上不会返回输入信号中最响亮的频率。