C# uwp听力图音频处理
我正在从事一个winodws物联网项目,该项目基于音频输入控制led条。现在我有了一些代码,可以将音频输入并使用AudiographAPI将其写入缓冲区,但我不知道如何将音频处理为一些有用的数据 到目前为止,我的代码是:C# uwp听力图音频处理,c#,.net,audio,uwp,windows-10-iot-core,C#,.net,Audio,Uwp,Windows 10 Iot Core,我正在从事一个winodws物联网项目,该项目基于音频输入控制led条。现在我有了一些代码,可以将音频输入并使用AudiographAPI将其写入缓冲区,但我不知道如何将音频处理为一些有用的数据 到目前为止,我的代码是: private async void MainPage_Loaded(object sender, RoutedEventArgs eventArgs) { try { // Initialize the led stri
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;
}
}
private async void主页\u已加载(对象发送方、RoutedEventTargets事件args)
{
尝试
{
//初始化led条
//等待这个。pixelStrip.Begin();
sampleAggregator.FftCalculated+=新事件处理程序(FftCalculated);
sampleAggregator.PerformFFT=true;
//创建图形
AudioGraphSettings设置=新的AudioGraphSettings(AudioRenderCategory.Media);
settings.DesiredSamplesPerQuantum=fftLength;
settings.DesiredRenderDeviceAudioProcessing=Windows.Media.AudioProcessing.Default;
settings.QuantumSizeSelectionMode=QuantumSizeSelectionMode.ClosestToDesired;
CreateAudioGraphResult=await AudioGraph.CreateAsync(设置);
if(result.Status!=AudioGraphCreationStatus.Success)
{
//无法创建图形
返回;
}
图=结果。图;
//使用默认音频输入设备创建设备输入节点
CreateAudioDeviceInputNodeResult设备InputNodeResult=await graph.CreateDeviceInputNodeAsync(MediaCategory.Other);
if(deviceInputNodeResult.Status!=音频设备DecreationStatus.Success)
{
返回;
}
deviceInputNode=deviceInputNodeResult.deviceInputNode;
frameOutputNode=graph.CreateFrameOutputNode();
frameOutputNode.Start();
graph.QuantumProcessed+=听力图\u QuantumProcessed;
//因为我们使用的是最低延迟设置,所以我们需要处理设备断开连接错误
graph.UnrecoverableErrorOccessed+=graph_UnrecoverableErrorOccessed;
graph.Start();
}
捕获(例外e)
{
Debug.WriteLine(例如ToString());
}
}
专用void听力图\u QuantumProcessed(听力图发送方,对象参数)
{
AudioFrame=frameOutputNode.GetFrame();
ProcessFrameOutput(帧);
}
不安全的私有void ProcessFrameOutput(音频帧)
{
使用(AudioBuffer=frame.LockBuffer(AudioBufferAccessMode.Write))
使用(IMemoryBufferReference reference=buffer.CreateReference())
{
字节*数据单位字节;
单位容量单位字节;
float*dataInFloat;
//从音频帧获取缓冲区
((IMemoryBufferByteAccess)引用).GetBuffer(输出dataInBytes,输出capacityInBytes);
dataInFloat=(浮点*)dataInBytes;
}
}
因此,我以缓冲区作为浮点结束。但是,我如何才能将其更改为有用的数据,从而可以创建频谱分析仪之类的东西呢
编辑:
也许我必须让这个问题对听力图不那么具体。我使用API获取音频输入。我从API得到的数据是一个字节*我可以把它转换成一个浮点*我怎样才能把它从字节*或浮点*转换成我可以用来创建一些颜色代码的其他数据
我想对浮点*做一些FFT分析,得到164个LED*3(rgb)=492个箱子。然后进一步处理这些数据,得到一些介于0和255之间的值
那么我如何处理这个浮点*或字节*来获得这个有用的数据呢?或者如何开始?该数据是交错的IEEE浮点,因此当您通过阵列时,它会交替通道数据,每个样本的数据范围为-1到1。 例如,一个单声道信号只有一个通道,因此它根本不会交错数据;但立体声信号有两个音频通道,因此:
dataInFloat[0]
是来自左通道的第一个数据样本,并且
dataInFloat[1]
是来自右通道的第一个数据样本。那么
dataInFloat[2]
是来自左通道的第二个数据样本。他们只是不停地来回走动。您最终关心的所有其他数据都在windows.media.mediaproperties.audioencodingproperties中
所以,只要知道这一点,你(本质上)就可以通过查看每个样本的绝对值,直接从数据中获得信号的总体积。你肯定会想在一段时间内将其平均化。您甚至可以将EQ效果附加到不同的节点上,并将低、中、高分析器节点分开,甚至永远不会涉及FFT内容。但这有什么意思?(实际上仍然很有趣)
然后,是的,为了得到复杂的谐波数据并制作一个真正的可视化工具,你需要对它进行FFT。人们喜欢使用学习场景,比如你的场景。有关用法,请参阅Sources/Imaging/ComplexImage.cs;有关实现,请参阅Sources/Math/FourierTransform.cs
然后你可以很容易地得到你的经典bin数据,并做经典音乐可视化的东西,或得到更多或任何东西!科技太棒了 dataInFloat=(float*)数据字节;
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);
浮动最大值=0;
对于(int i=0;i
谢谢!我还有一些问题。大多数情况下,我的缓冲区长度为3840,帧时间为0.01秒,因此这意味着(3840/sizeof(float))/2我的左右通道的长度为480个float。是这样吗?我的图的编码属性是3072000比特率,32比特/样本,48000采样率你是对的!请注意,数据的范围是[-1,+1],因此,如果您查看该数据绝对值的平均值,您将得到体积的粗略估计。(我也在用这些信息修改我上面的帖子)但你真的应该把它交出来