UWP для обработки звука AudioGraph

Я работаю над проектом winodws IoT, который управляет светодиодной полосой на основе аудиовхода. Теперь у меня есть код, который получает звук и записывает его в буфер с помощью AudioGraph API, но я не знаю, как я могу обработать звук для некоторых полезных данных.

мой код до сих пор:

private async void MainPage_Loaded(object sender, RoutedEventArgs eventArgs)
{
        try
        {
            // Initialize the led strip
            //await this.pixelStrip.Begin();

            sampleAggregator.FftCalculated += new EventHandler<FftEventArgs>(FftCalculated);
            sampleAggregator.PerformFFT = true;

            // Create graph
            AudioGraphSettings settings = new AudioGraphSettings(AudioRenderCategory.Media);
            settings.DesiredSamplesPerQuantum = fftLength;
            settings.DesiredRenderDeviceAudioProcessing = Windows.Media.AudioProcessing.Default;
            settings.QuantumSizeSelectionMode = QuantumSizeSelectionMode.ClosestToDesired;

            CreateAudioGraphResult result = await AudioGraph.CreateAsync(settings);
            if (result.Status != AudioGraphCreationStatus.Success)
            {
                // Cannot create graph
                return;
            }
            graph = result.Graph;

            // Create a device input node using the default audio input device
            CreateAudioDeviceInputNodeResult deviceInputNodeResult = await graph.CreateDeviceInputNodeAsync(MediaCategory.Other);

            if (deviceInputNodeResult.Status != AudioDeviceNodeCreationStatus.Success)
            {
                return;
            }

            deviceInputNode = deviceInputNodeResult.DeviceInputNode;

            frameOutputNode = graph.CreateFrameOutputNode();
            frameOutputNode.Start();
            graph.QuantumProcessed += AudioGraph_QuantumProcessed;

            // Because we are using lowest latency setting, we need to handle device disconnection errors
            graph.UnrecoverableErrorOccurred += Graph_UnrecoverableErrorOccurred;

            graph.Start();
        }
        catch (Exception e)
        {
            Debug.WriteLine(e.ToString());
        }
    }

    private void AudioGraph_QuantumProcessed(AudioGraph sender, object args)
    {
        AudioFrame frame = frameOutputNode.GetFrame();
        ProcessFrameOutput(frame);
    }

    unsafe private void ProcessFrameOutput(AudioFrame frame)
    {
        using (AudioBuffer buffer = frame.LockBuffer(AudioBufferAccessMode.Write))
        using (IMemoryBufferReference reference = buffer.CreateReference())
        {
            byte* dataInBytes;
            uint capacityInBytes;
            float* dataInFloat;

            // Get the buffer from the AudioFrame
            ((IMemoryBufferByteAccess)reference).GetBuffer(out dataInBytes, out capacityInBytes);

            dataInFloat = (float*)dataInBytes;


        }
    }

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

Edit:

может быть, я должен сделать этот вопрос менее специфичны для audiograph. Я использую API для получения аудиовхода. Данные, которые я получаю от API, - это байт* , и я могу привести его к float* как я могу изменить его с байта* или float* на некоторые другие данные, которые я могу использовать для создания некоторых цветовых кодов.

Я thaught о том, чтобы сделать некоторый анализ FFT на float*, чтобы получить 164 светодиода*3(rgb) = 492 бункера. И обрабатывать эти данные дальше, чтобы получить некоторые значения от 0 до 255.

Итак, как я могу обработать этот float* или byte*, чтобы получить эти полезные данные? Или с чего начать?

2 ответов


эти данные перемежаются IEEE float, поэтому он чередует данные канала по мере прохождения массива, а диапазон данных для каждого образца составляет от -1 до 1. Например, моносигнал имеет только один канал, поэтому он не будет чередовать данные вообще; но стереосигнал имеет два канала звука, и так:

dataInFloat[0]

является первым образцом данных из левого канала и

dataInFloat[1]

является первым образцом данных из правого канала. Затем:

dataInFloat[2]

is the второй выборка данных из левого канала. и они просто ходят туда-сюда. Все остальные данные, о которых вы будете заботиться, находятся в windows.сми.mediaproperties.audioencodingproperties

Итак, просто зная это, вы (по существу) можете сразу получить общий объем сигнала непосредственно из этих данных, посмотрев на абсолютное значение каждого образца. Вы определенно захотите усреднить его в течение некоторого времени. Вы даже можете просто прикрепить EQ эффекты для разных узлов и делают отдельные низкие, средние и высокие узлы анализатора и никогда даже не попадают в БПФ. НО ЧТО В ЭТОМ ВЕСЕЛОГО? (на самом деле все еще веселее)

и затем, Да, чтобы получить ваши сложные гармонические данные и сделать действительно сладкий визуализатор, вы хотите сделать FFT на нем. Людям нравится использовать AForge для обучения сценариев, как ваш. См. Источники / Изображения / ComplexImage.cs для использования, источники / Math / FourierTransform.cs для имплементации

вы может легко получить ваши классические данные БИН и сделать классический музыкальный визуализатор вещи или получить больше творческий или что-то еще! технология потрясающая!

  dataInFloat = (float*)dataInBytes;
  float max = 0;
   for (int i = 0; i < graph.SamplesPerQuantum; i++)
                {
                    max = Math.Max(Math.Abs(dataInFloat[i]), max);

                }

                finalLevel = max;
                Debug.WriteLine(max);