Sto lavorando a un progetto IoT winodws che controlla una striscia led basata su un ingresso audio. Ora ho un codice che riceve l'audio e lo scrive su un buffer con l'API AudioGraph, ma non so come posso elaborare l'audio con alcuni dati utili.uwp Elaborazione audio AudioGraph
mio codice finora:
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;
}
}
così finisco con il mio buffer come un galleggiante. Ma come posso cambiarlo in dati utili che rendono possibile creare qualcosa come un analizzatore di spettro?
Edit:
Forse devo fare questa domanda meno specifico per l'audiograph. Io uso un'API per ottenere il mio input audio. I dati che ottengo dall'API sono un byte * e posso lanciarlo su un float * Come posso cambiarlo dal byte * o dal float * con altri dati che posso usare per creare alcuni codici colore.
Ho pensato di fare qualche analisi FFT sul float * per ottenere 164 leds * 3 (rgb) = 492 bin. E elaborare ulteriormente questi dati per ottenere valori compresi tra 0 e 255.
Quindi, come posso elaborare questo float * o byte * per ottenere questi dati utili? O come inizio?
Si può dare un'occhiata a https://github.com/filoe/cscore, c'è un campione incluso (vedi immagine in basso) –