Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# uwp听力图音频处理_C#_.net_Audio_Uwp_Windows 10 Iot Core - Fatal编程技术网

C# uwp听力图音频处理

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

我正在从事一个winodws物联网项目,该项目基于音频输入控制led条。现在我有了一些代码,可以将音频输入并使用AudiographAPI将其写入缓冲区,但我不知道如何将音频处理为一些有用的数据

到目前为止,我的代码是:

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],因此,如果您查看该数据绝对值的平均值,您将得到体积的粗略估计。(我也在用这些信息修改我上面的帖子)但你真的应该把它交出来