Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.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#_.net_Naudio - Fatal编程技术网

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

C# 代码未检测到所需的音频频率,c#,.net,naudio,C#,.net,Naudio,我正在尝试使用NAudio编写一个代码,它可以检测所需的频率。例如,我的代码应该能够说明是否发出频率为20100 Hz的声音(是的,超声波是基本要求)。基本上,我从NAudio的NAudio WaveInEvent读取所有int值,并对其中的一部分(2018年)值应用FFT。我得到所需频率的索引,然后在FFT样本中检查它 对于FFT,我使用的是MathNet.Numerics.IntegralTransforms。应用FFT会给我复杂的值,我应用abs,然后乘以采样率,除以数据大小得到frq 我

我正在尝试使用NAudio编写一个代码,它可以检测所需的频率。例如,我的代码应该能够说明是否发出频率为20100 Hz的声音(是的,超声波是基本要求)。基本上,我从NAudio的NAudio WaveInEvent读取所有int值,并对其中的一部分(2018年)值应用FFT。我得到所需频率的索引,然后在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数据吗?没有看到他们很难说什么不起作用。伊恩·默瑟(Ian Mercer)的观点非常正确。但即使对于352Hz这样的可听频率,代码也不起作用。如果他们有这样的过滤器,有办法解决吗。也就是说,有没有一种方法可以让我向声卡发送一个命令,不应用这些过滤器。当你说“对一块it(2018)值应用FFT”时,你的意思是对2018个样本进行FFT吗?样本量通常是2…Oh的整数幂。我正在申请2018年的FFt。我将把它设为2的幂并检查它。你是如何接收到这些超声波噪音的?你知道很多消费者的声卡在高频时会被切断,对吗?你能绘出源数据和FFT数据吗?没有看到他们很难说什么不起作用。伊恩·默瑟(Ian Mercer)的观点非常正确。但即使对于352Hz这样的可听频率,代码也不起作用。如果他们有这样的过滤器,有办法解决吗。也就是说,有没有一种方法可以让我向声卡发送一个命令,不应用这些过滤器。当你说“对一块it(2018)值应用FFT”时,你的意思是对2018个样本进行FFT吗?样本量通常是2…Oh的整数幂。我正在申请2018年的FFt。我将把它设为2的幂并检查它。
public double Soundabs(Complex num)
{
    return Math.Sqrt(num.Real * num.Real + num.Imaginary * num.Imaginary);
    //return Complex.Abs(num);
}