该代码未检测到所需的音频频率

时间:2019-04-22 20:25:02

标签: c# .net naudio

我正在尝试使用NAudio编写代码,以检测所需的频率。例如,我的代码应该能够说出是否发出20100 Hz频率的声音(是基本要求是超声波)。基本上,我正在从NAudio的NAudio WaveInEvent中读取所有int值,并将FFT应用于其中的一部分(2018)值。我得到所需频率的索引,然后在FFT样本中进行检查。

对于FFT,我使用的是MathNet.Numerics.IntegralTransforms。应用FFT将给我应用abs的复杂值,然后乘以采样率,再除以数据大小即可得出frq。

我通过

获得索引
private int getIndex(int freq) {
    return (int)Math.Round((freq/44100d)*2018d);
}
index = getIndex(20100);

接收代码

public void OnFramesArrivedEvent(object sender , EventArgs args) {
   Complex[] sound_data = new Complex[sound.Count];
   for (int i = 0; i< sound.Count; i++) {
       sound_data[i] = sound[i];
   }

   Fourier.Forward(sound_data);

   for (int i = index-1; i<index+3; i++ ) {
       try
       {
           int xx = (int)(((Soundabs(sound_data[i])) * 44100) / 2018);
           //if (Math.Abs(xx - 20100) < 500)
           //{
           //    Console.WriteLine(xx);
           //}
           Console.WriteLine(xx);
       }
       catch (IndexOutOfRangeException ie) {
           Console.WriteLine("------" + i);
       }

   }
   sound.Clear();
}

要获取FFT复数的绝对值,请使用

public double Soundabs(Complex num)
{
    return Math.Sqrt(num.Real * num.Real + num.Imaginary * num.Imaginary);
    //return Complex.Abs(num);
}

代码未检测到频率。相反,它正在检测其他频率。 我使用了多种方法来生成频率,但它不起作用。

0 个答案:

没有答案