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);