Необходимо получить звук с микрофона, выводя его частоту и громкость в данный момент.
Есть пример на чистом С# https://habrahabr.ru/post/247385/ , но не для Unity. У него же свой ввод.
Код для C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Numerics;
namespace Rainbow
{
// Δ∂ωπ
public static class Filters
{
public const double SinglePi = Math.PI;
public const double DoublePi = 2*Math.PI;
public static Dictionary<double, double> GetJoinedSpectrum(
IList<Complex> spectrum0, IList<Complex> spectrum1,
double shiftsPerFrame, double sampleRate)
{
var frameSize = spectrum0.Count;
var frameTime = frameSize/sampleRate;
var shiftTime = frameTime/shiftsPerFrame;
var binToFrequancy = sampleRate/frameSize;
var dictionary = new Dictionary<double, double>();
for (var bin = 0; bin < frameSize; bin++)
{
var omegaExpected = DoublePi*(bin*binToFrequancy); // ω=2πf
var omegaActual = (spectrum1[bin].Phase - spectrum0[bin].Phase)/shiftTime; // ω=∂φ/∂t
var omegaDelta = Align(omegaActual - omegaExpected, DoublePi); // Δω=(∂ω + π)%2π - π
var binDelta = omegaDelta/(DoublePi*binToFrequancy);
var frequancyActual = (bin + binDelta)*binToFrequancy;
var magnitude = spectrum1[bin].Magnitude + spectrum0[bin].Magnitude;
dictionary.Add(frequancyActual, magnitude*(0.5 + Math.Abs(binDelta)));
}
return dictionary;
}
public static double Align(double angle, double period)
{
var qpd = (int) (angle/period);
if (qpd >= 0) qpd += qpd & 1;
else qpd -= qpd & 1;
angle -= period*qpd;
return angle;
}
}
}
И применение этого в чистом C#
var spectrum0 = Butterfly.DecimationInTime(frame0, true);
var spectrum1 = Butterfly.DecimationInTime(frame1, true);
for (var i = 0; i < frameSize; i++)
{
spectrum0[i] /= frameSize;
spectrum1[i] /= frameSize;
}
var spectrum = Filters.GetJoinedSpectrum(spectrum0, spectrum1, ShiftsPerFrame, Device.SampleRate);
Как применить это в Unity?
Сборка персонального компьютера от Artline: умный выбор для современных пользователей