UWP AudioGraph обработка аудио
Я работаю над IoT-проектом winodws, который управляет светодиодной полосой на основе аудиовхода. Теперь у меня есть некоторый код, который получает аудио и записывает его в буфер с помощью 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;
}
}
Итак, я заканчиваю свой буфер как float. Но как я могу изменить это, чтобы использовать полезные данные, которые позволяют создать что-то вроде анализатора спектра?
Редактировать:
Может быть, я должен сделать этот вопрос менее конкретным для аудиографа. Я использую API для получения аудиовхода. Данные, которые я получаю от API, являются байтами *, и я могу преобразовать их в число с плавающей точкой * Как я могу изменить их с байта * или числа с плавающей точкой * на некоторые другие данные, которые я могу использовать для создания некоторых цветовых кодов.
Я подумал о том, чтобы провести некоторый FFT-анализ поплавка *, чтобы получить 164 светодиода * 3 (rgb) = 492 ячейки. И обработайте эти данные дальше, чтобы получить значения от 0 до 255.
Итак, как я могу обработать этот float * или байт *, чтобы получить эти полезные данные? Или как мне начать?