uwp AudioGraph 音频处理
uwp AudioGraph audio processing
我正在开发一个 winodws IoT 项目,该项目基于音频输入控制 LED 灯带。现在我有一些代码可以获取音频并将其写入带有 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;
}
}
所以我以浮点数形式结束我的缓冲区。但是我怎样才能将其更改为有用的数据,从而可以创建类似频谱分析仪的东西?
编辑:
也许我必须让这个问题不那么针对录音。我使用 API 来获取我的音频输入。我从 API 获得的数据是一个字节*,我可以将它转换为一个浮点数* 我怎样才能将它从字节* 或浮点数* 更改为我可以用来创建一些颜色代码的其他数据.
我想对浮点数进行一些 FFT 分析* 以获得 164 个 leds*3(rgb) = 492 个 bin。并进一步处理这些数据以获得 0 到 255 之间的一些值。
那么我如何处理这个 float* 或 byte* 以获得有用的数据呢?或者我该如何开始?
该数据是交错的 IEEE 浮点数,因此它会在您遍历数组时交替显示通道数据,并且每个样本的数据范围是从 -1 到 1。
例如,单声道信号只有一个通道,因此根本不会交织数据;但是立体声信号有两个音频通道,所以:
dataInFloat[0]
是来自左声道的第一个数据样本并且
dataInFloat[1]
是右通道的第一个数据样本。那么,
dataInFloat[2]
是来自左声道的second数据样本。他们只是不停地来回走动。您最终会关心的所有其他数据都在 windows.media.mediaproperties.audioencodingproperties
中
所以,只要知道这一点,您(基本上)就可以通过查看每个样本的绝对值,立即直接从该数据中获得信号的总音量。您肯定希望在一段时间内对其进行平均。您甚至可以将 EQ 效果附加到不同的节点,并制作单独的低、中和高分析器节点,甚至永远不会进入 FFT 东西。但那有什么乐趣呢? (其实还是很好玩的)
然后,是的,要获取复杂的谐波数据并制作一个真正可爱的可视化工具,您需要对其进行 FFT。人们喜欢使用 AForge 来学习场景,就像您的场景一样。用法见 Sources/Imaging/ComplexImage.cs,实现见 Sources/Math/FourierTransform.cs
然后您可以轻松获取经典的 bin 数据并执行经典音乐可视化工具或获取更多 creative 或其他任何内容!技术真棒!
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);
我正在开发一个 winodws IoT 项目,该项目基于音频输入控制 LED 灯带。现在我有一些代码可以获取音频并将其写入带有 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;
}
}
所以我以浮点数形式结束我的缓冲区。但是我怎样才能将其更改为有用的数据,从而可以创建类似频谱分析仪的东西?
编辑:
也许我必须让这个问题不那么针对录音。我使用 API 来获取我的音频输入。我从 API 获得的数据是一个字节*,我可以将它转换为一个浮点数* 我怎样才能将它从字节* 或浮点数* 更改为我可以用来创建一些颜色代码的其他数据.
我想对浮点数进行一些 FFT 分析* 以获得 164 个 leds*3(rgb) = 492 个 bin。并进一步处理这些数据以获得 0 到 255 之间的一些值。
那么我如何处理这个 float* 或 byte* 以获得有用的数据呢?或者我该如何开始?
该数据是交错的 IEEE 浮点数,因此它会在您遍历数组时交替显示通道数据,并且每个样本的数据范围是从 -1 到 1。 例如,单声道信号只有一个通道,因此根本不会交织数据;但是立体声信号有两个音频通道,所以:
dataInFloat[0]
是来自左声道的第一个数据样本并且
dataInFloat[1]
是右通道的第一个数据样本。那么,
dataInFloat[2]
是来自左声道的second数据样本。他们只是不停地来回走动。您最终会关心的所有其他数据都在 windows.media.mediaproperties.audioencodingproperties
中所以,只要知道这一点,您(基本上)就可以通过查看每个样本的绝对值,立即直接从该数据中获得信号的总音量。您肯定希望在一段时间内对其进行平均。您甚至可以将 EQ 效果附加到不同的节点,并制作单独的低、中和高分析器节点,甚至永远不会进入 FFT 东西。但那有什么乐趣呢? (其实还是很好玩的)
然后,是的,要获取复杂的谐波数据并制作一个真正可爱的可视化工具,您需要对其进行 FFT。人们喜欢使用 AForge 来学习场景,就像您的场景一样。用法见 Sources/Imaging/ComplexImage.cs,实现见 Sources/Math/FourierTransform.cs
然后您可以轻松获取经典的 bin 数据并执行经典音乐可视化工具或获取更多 creative 或其他任何内容!技术真棒!
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);