Example #1
0
 private void _capture_AudioCaptured(object sender, AudioCapturedEventArgs e)
 {
     try
     {
         Invoke((MethodInvoker)(() => Capture(e)));
     }
     catch (ObjectDisposedException exception)
     {
     }
 }
Example #2
0
        private void Capture(AudioCapturedEventArgs e)
        {
            DataUtils.Normalize(e.Left.Buffer);
            DataUtils.Normalize(e.Right.Buffer);

            var a      = new Complex32[e.Left.Buffer.Length];
            var b      = new Complex32[e.Right.Buffer.Length];
            var sp1    = new Complex32[a.Length];
            var sp2    = new Complex32[b.Length];
            var window = Window.Hamming(a.Length);


            // Составляем комплексный массив и умножаем на окно Хэмминга
            for (int i = 0; i < a.Length; i++)
            {
                a[i] = new Complex32(e.Left.Buffer[i] * (float)window[i], 0);
                b[i] = new Complex32(e.Left.Buffer[i] * (float)window[i], 0);
            }

            // Преобразование фурье
            Fourier.Forward(a);
            Fourier.Forward(b);
            Array.Copy(a, sp1, a.Length);
            Array.Copy(b, sp2, b.Length);

            // Поэлементно умножаем первое на сопряженное ко второму
            for (int i = 0; i < a.Length; i++)
            {
                a[i] = a[i] * b[i].Conjugate();
            }


            // Поэлементно делим на модуль самого себя
            //for (int i = 0; i < a.Length; i++)
            //    a[i] = Complex32.Divide(a[i], a[i].Magnitude);

            //Fourier.Inverse(a);

            // Поиск максимума

            /*int maxI = 0;
             * float max = a[0].Imaginary;
             * for (int i = 0; i < a.Length; i++)
             * {
             *  if (Math.Abs(a[i].Imaginary) > max)
             *  {
             *      maxI = i;
             *      max = Math.Abs(a[i].Imaginary);
             *  }
             * }*/

            sgraphWave.Clear();
            sgraphSpectrum.Clear();

            for (int i = 0; i < e.Left.Buffer.Length; i++)
            {
                sgraphWave.AddData(i, e.Left.Buffer[i], e.Right.Buffer[i]);
            }

            for (int i = 0; i < a.Length / 10; i++)
            {
                float hz = i * e.Left.Source.WaveFormat.SampleRate / (float)a.Length;
                //sgraphSpectrum.AddData(hz, sp1[i].Magnitude, sp2[i].Magnitude);
                sgraphSpectrum.AddData(hz, 0, a[i].Imaginary);
            }


            sgraphWave.UpdateGraph();
            sgraphSpectrum.UpdateGraph();
        }