Код не определяет желаемую частоту звука звука - PullRequest
1 голос
/ 22 апреля 2019

Я пытаюсь написать код с помощью NAudio, который определяет желаемую частоту. Например, мой код должен быть в состоянии сказать, излучается ли звук с частотой 20100 Гц (да, ультразвуковой сигнал является основным требованием) или нет. По сути, я читаю все значения int из NAudio WaveInEvent из NAudio и применяю БПФ к фрагменту его (2018) значений. Я получаю индекс нужной частоты, а затем проверяю его в образце FFT.

Для БПФ я использую MathNet.Numerics.IntegralTransforms. Применение БПФ даст мне комплексные значения, к которым я применяю abs, а затем умножу на частоту дискретизации и разделю на размер данных, чтобы получить частоту.

Я получаю индекс по

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

Чтобы получить абсолютное значение комплексного числа БПФ, я использую

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

Код не определяет частоту. Вместо этого он обнаруживает другие частоты. Я использовал несколько способов генерации частоты, и она не работает.

...