gpt4 book ai didi

c++ - 实时数据的 STFT/滑动 FFT

转载 作者:太空宇宙 更新时间:2023-11-04 02:45:00 40 4
gpt4 key购买 nike

我最近接手了一个项目,我需要对传入的麦克风数据执行实时滑动 FFT 分析。我选择执行此操作的环境是 OpenGL 和 Cinder,并使用 C++。

这是我第一次接触音频编程,我有点困惑。

这就是我试图在我的 OpenGL 应用程序中实现的目标:

enter image description here

所以在每一帧中,都有一部分传入数据。在 for 循环(因此多次通过)中,当前数据的一个窗口将被消耗,并将对其执行 FFT 分析。对于 for 循环的下一次迭代,window 将通过数据等推进“hop-size”,直到到达数据末尾。

现在这个过程必须是连续的。但是正如您在上图中看到的那样,当我当前的应用程序框架结束并且下一帧的数据进来时,我无法从我离开上一帧的地方拾取(因为数据已经消失)。您可以在图中看到它,其中蓝色区域位于两个框架之间。

现在您可能会说,以一种永远不会发生但不可能发生的方式选择窗口大小/跳跃大小,因为这些参数应该在我的项目中留给用户配置。

也非常欢迎针对这种面向 C++11 的处理提出建议!

谢谢!

最佳答案

不确定我是否 100% 理解您的方案,但听起来您可能想要使用循环缓冲区。没有“标准”循环缓冲区,但是 there's one in Boost .

但是,如果您计划使用 2 个线程进行处理,则需要锁。例如,一个线程会等待音频输入,然后获取缓冲区锁,并将音频缓冲区中的内容复制到循环缓冲区中。如果缓冲区中至少有 k 可用,第二个线程将定期获取缓冲区锁并读取下一个 k 元素...

您需要适当调整缓冲区的大小,并确保处理数据的速度始终快于传入速率,以避免循环缓冲区中的损失...

不确定你为什么提到缓冲区是无锁的,这是否是一个要求,我会先尝试带锁的循环缓冲区,因为它在概念上看起来更简单,只有在必要时才使用无锁,因为在这种情况下,数据结构可能会更复杂(但也许“生产者-消费者”无锁队列会起作用)...

HTH.

关于c++ - 实时数据的 STFT/滑动 FFT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28391334/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com