Получить частоту звука и его громкость Unity C#

388
11 апреля 2017, 07:42

Необходимо получить звук с микрофона, выводя его частоту и громкость в данный момент.

Есть пример на чистом С# 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?

READ ALSO
Вызвать метод формы1 после закрытия формы2

Вызвать метод формы1 после закрытия формы2

Есть 2 формы Form1 и Form2Вторая форма открывается с первой :

284
yield с буфером

yield с буфером

Допустим, из итератора извлекается что-то тяжелое или времязатратное

277
C# DDD доступ из Infrastructure к БД

C# DDD доступ из Infrastructure к БД

Всем привет! Вот такой у меня вопросПытаюсь осознать DDD и делаю web приложения на asp

263