我正在工作一个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个垃圾桶。并进一步处理这些数据,以获得0到255之间的一些值。
那么,我如何处理这个浮点*或字节*来获取这些有用的数据呢?或者我该怎么开始?
发布于 2016-01-27 00:02:29
该数据是交错的IEEE浮点,因此它在遍历数组时交替传输信道数据,每个示例的数据范围为-1到1。例如,单个信号只有一个通道,因此它根本不会交织数据;但是一个立体声信号有两个音频通道,因此:
dataInFloat[0]
是来自左侧通道的第一个数据样本,并且
dataInFloat[1]
是来自正确通道的数据的第一个示例。然后,
dataInFloat[2]
是来自左侧通道的第二个数据示例。他们就不停地来回走。你所关心的所有其他数据都是在windows.media.mediaproperties.audioencodingproperties中
因此,只要知道这一点,您(本质上)就可以通过查看每个样本的绝对值,直接从这些数据中获得信号的整体体积。你一定要在一段时间内把它平均下来。您甚至可以将EQ效应附加到不同的节点上,使分离的Low、Mid和High分析器节点分离,甚至永远不会进入FFT的内容。但这有什么乐趣呢?(其实还是挺有趣的)
然后,是的,为了得到你的复杂谐波数据,并做出一个真正甜美的视觉效果,你想要对它做一个FFT。人们喜欢将AForge用于学习场景,就像您的情景一样。使用情况见源/成像/ComplexImage.cs,实现见源/数学/FourierTransform.cs
然后,您可以轻松地获得您的经典bin数据,并做经典音乐可视化的东西,或获得更多的creative或其他什么!科技太棒了!
发布于 2016-09-22 16:12:28
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);
https://stackoverflow.com/questions/34706719
复制相似问题