uwp AudioGraph音频处理

我正在开发一个基于音频输入控制LED灯条的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(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个LED * 3(rgb)= 492个箱子。 并进一步处理此数据以获得0到255之间的某些值。

那么如何处理这个float *或byte *来获取这个有用的数据呢? 或者我该如何开始?

该数据是交错的IEEE浮点数,因此当您逐步通过数组时它会交替显示通道数据,并且每个样本的数据范围从-1到1.例如,单声道信号只有一个通道,因此它不会交错数据; 但立体声信号有两个音频通道,因此:

 dataInFloat[0] 

是左声道和第一个数据样本

 dataInFloat[1] 

是来自正确渠道的第一个数据样本。 然后,

 dataInFloat[2] 

是来自左声道的第二个数据样本。 他们只是来回走动。 您最终关注的所有其他数据都在windows.media.mediaproperties.audioencodingproperties中

因此,只要知道这一点,您(基本上)就可以通过查看每个样本的绝对值,直接从该数据中获得信号的总体积。 你肯定想在一段时间内将其平均化。 您甚至可以将EQ效果附加到不同的节点,并制作单独的低,中,高分析器节点,甚至不会进入FFT内容。 但那有什么乐趣呢? (它实际上仍然很有趣)

然后,是的,为了获得复杂的谐波数据并制作出真正可爱的可视化器,您需要对其进行FFT。 人们喜欢使用AForge来学习和你一样的学习场景。 有关用途,请参阅Sources / Imaging / ComplexImage.cs,使用Sources / Math / FourierTransform.cs进行实现

然后,您可以轻松获取经典的bin数据并制作经典的音乐可视化工具或获得更多创意或其他任何内容! 技术真棒!

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