Есть задача получать частоту звука с микрофона для дальнейших преобразований на C#. Подобное уже делал на Python с numpy, но тут как то не клеится...
private void write(byte[] angles, int byte_len)
{
Complex[] _fftBuffer = new Complex[byte_len];
var _m = (int)Math.Log(byte_len, 2.0);
for (var n=0; n < byte_len; n++)
{
var r = angles[n];
var i = 0;
_fftBuffer[n].X = (float)(r * FastFourierTransform.HammingWindow(n, byte_len));
_fftBuffer[n].Y = i;
}
FastFourierTransform.FFT(true, _m, _fftBuffer);
float[] fft_x = new float[_fftBuffer.Length];
for (var i=0; i<_fftBuffer.Length; i++)
{
fft_x[i] = Math.Abs(_fftBuffer[i].X);
}
int i_peak = fft_x.ToList().IndexOf(fft_x.Max());
for (var i = 0; i < _fftBuffer.Length; i++)
{
fft_x[i] = (float)Math.Log(Math.Abs(_fftBuffer[i].X));
}
///var i_peak = fft_x.Max();
var i_interp = parabolic(fft_x, i_peak);
float freq = byte_len * i_interp / angles.Length;
Console.WriteLine("Debug stop");
///this.port.Write(this.first_command, 0, 8);
///this.port.Write(this.get_comand(0.0f, 0.0f), 0, 32);
}
private float parabolic(float[] f, int peak)
{
var xv = 0.5f * (f[peak-1] - f[peak+1])/(f[peak-1]-2*f[peak] + f[peak+1]) + peak;
return xv;
}
Это что на С# сделал. Сделано так, ибо так же было на Python. В конечном итоге работает, но неправильно - частота получается одна и та же (+- пара герц), но по идее там должны быть абсолютно другие частоты - передаем данные с помощью звука.
Помогите разобраться, что в коде может быть не так?
Сборка персонального компьютера от Artline: умный выбор для современных пользователей