Pracuję nad projektem IoT winodws, który kontroluje pasek led oparty na wejściu audio. Teraz mam trochę kodu, który pobiera dźwięk i zapisuje go do bufora z interfejsem API AudioGraph, ale nie wiem, jak mogę przetworzyć audio na jakieś użyteczne dane.uwp Przetwarzanie audio AudioGraph
mój kod do tej pory:
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;
}
}
Więc kończę z moim buforze jako pływaka. Ale jak mogę to zmienić na przydatne dane, które umożliwiają stworzenie czegoś takiego jak analizator widma?
Edit:
Może muszę zrobić to kwestia mniej specyficzne dla audiograph. Używam API, aby uzyskać moje wejście audio. Dane, które otrzymuję z API to bajt * i mogę rzucić go na float * Jak zmienić to z bajtu * lub float * na inne dane, których mogę użyć do utworzenia kodów kolorów.
Nauczyłem się wykonywać niektóre analizy FFT na float *, aby uzyskać 164 diody led * 3 (rgb) = 492 pojemników. Przetwarzaj te dane dalej, aby uzyskać wartości od 0 do 255.
Jak mogę przetworzyć ten float * lub bajt *, aby uzyskać te przydatne dane? Lub jak zacząć?
Możesz rzucić okiem na https://github.com/filoe/cscore, jest próbka dołączona (patrz zdjęcie poniżej) –