private void _capture_AudioCaptured(object sender, AudioCapturedEventArgs e) { try { Invoke((MethodInvoker)(() => Capture(e))); } catch (ObjectDisposedException exception) { } }
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(); }