Я работаю над проектом IoT winodws, который управляет светодиодной полосой на основе аудиовхода. Теперь у меня есть код, который получает аудио и записывает его в буфер с помощью API AudioGraph, но я не знаю, как я могу обрабатывать аудио для некоторых полезных данных.uwp AudioGraph обработка звука
мой код до сих пор:
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:
Может быть, я должен сделать этот вопрос менее специфичен для аудиографа. Я использую API для ввода своего аудиовхода. Данные, которые я получаю из API, являются байтом *, и я могу использовать его для float * Как я могу изменить его из байта * или float * на некоторые другие данные, которые я могу использовать для создания некоторых цветовых кодов.
Я попытался сделать некоторый анализ БПФ на поплавке *, чтобы получить 164 светодиода * 3 (rgb) = 492 бункера. И обработать эти данные дальше, чтобы получить значения от 0 до 255.
Итак, как я могу обработать этот float * или byte *, чтобы получить эти полезные данные? Или как мне начать?
Вы можете посмотреть на https://github.com/filoe/cscore, есть пример включен (см изображение вниз ниже) –