Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中基于FFT的基音检测#_C#_Fft_Pitch - Fatal编程技术网

C# C语言中基于FFT的基音检测#

C# C语言中基于FFT的基音检测#,c#,fft,pitch,C#,Fft,Pitch,我正在做一个为铜管乐队调音的节目。我从麦克风开始录音 public void StartMicListening() { int audioDevNumber = 0; WaveInEvent wIN = new WaveInEvent(); wIN.DeviceNumber = audioDevNumber; wIN.WaveFormat = new NAudio.Wave.WaveFormat(RATE, 1);

我正在做一个为铜管乐队调音的节目。我从麦克风开始录音

public void StartMicListening()
    {
        int audioDevNumber = 0;
        WaveInEvent wIN = new WaveInEvent();
        wIN.DeviceNumber = audioDevNumber;
        wIN.WaveFormat = new NAudio.Wave.WaveFormat(RATE, 1);
        wIN.BufferMilliseconds = (int)((double)BUFFERSIZE / (double)RATE * 1000.0);
        wIN.DataAvailable += new EventHandler<WaveInEventArgs>(AudioDataAvailable);
        bwp = new BufferedWaveProvider(wIN.WaveFormat);
        bwp.BufferLength = BUFFERSIZE * 2;
        bwp.DiscardOnBufferOverflow = true;
        try
        {
            wIN.StartRecording();
        }
        catch
        {
            Console.WriteLine("Can't see device");
        }

        //Console.WriteLine("Recording");
    }
public void StartMicListening()
{
int audioDevNumber=0;
WaveInEvent wIN=新的WaveInEvent();
wIN.DeviceNumber=音频数据编号;
wIN.WaveFormat=新NAudio.Wave.WaveFormat(速率,1);
wIN.buffermillizes=(int)((双)缓冲大小/(双)速率*1000.0);
wIN.DataAvailable+=新事件处理程序(AudioDataAvailable);
bwp=新的BufferedWaveProvider(wIN.WaveFormat);
bwp.BufferLength=缓冲大小*2;
bwp.DiscardOnBufferOverflow=真;
尝试
{
wIN.StartRecording();
}
抓住
{
Console.WriteLine(“看不见设备”);
}
//控制台。写入线(“记录”);
}
接下来我是计算FFT

public void calculateFFT()
    {
        var audioBytes = new byte[BUFFERSIZE];
        bwp.Read(audioBytes, 0, BUFFERSIZE);
        int pointCount = audioBytes.Length / 2;
        double[] pcm = new double[pointCount];
        double[] fft = new double[pointCount];
        double[] fftReal = new double[pointCount/2];


        for (int i = 0; i < pointCount; i++)
        {
            // read the int16 from the two bytes
            Int16 val = BitConverter.ToInt16(audioBytes, i * 2);

            // store the value in Ys as a percent (+/- 100% = 200%)
            pcm[i] = (double)(val) / Math.Pow(2, 18) * 200.0;
        }
        fft = FFT(pcm);
        Array.Copy(fft, fftReal, fftReal.Length);

    }
public void calculateFFT()
{
var audioBytes=新字节[BUFFERSIZE];
读取(音频字节,0,缓冲区大小);
int pointCount=audioBytes.Length/2;
double[]pcm=新的double[pointCount];
double[]fft=新的double[pointCount];
double[]fftReal=新的double[pointCount/2];
对于(int i=0;i

当我用440 Hz音调的音调生成器()测试这段代码时,我从fftReal得到了最大值,它工作得很好。但当我把它和萨克斯管声音一起使用时,我从fftReal中得到最大值,我有时检测到440Hz,有时检测到880Hz,有时检测到1320Hz。880赫兹和1320赫兹是音调(440赫兹)的一小部分,但我必须只检测频谱的第一个音调(440赫兹)。有什么解决办法吗?Mayba你们中的一些人已经用C#做过了,可以和我分享。

基音检测比仅仅在复杂声音中找到基音或最大峰值的频率要复杂得多。音调和频率不是一回事!在编写更多代码之前,您可能想先阅读一下这个主题。除了搜索Stack Overflow和Google中的“音高检测”外,您可能还想搜索“Harmonic Product Spectrum”,这是一种流行的乐器音高检测算法等。您可能可以使用一个库来为您执行此操作,例如可以使用类似的方法