我开始为我的想法创建一个概念证明,在这一点上,我需要一些关于如何开始的指导。

我需要对麦克风输入进行采样,并实时处理该信号(想想Auto-Tune,但是现场工作),而不是“录音”。一段时间。

我正在做的是“有点”。 “麦克风输入到MIDI转换器”,所以它需要非常快速地响应。

我在线调查了一下,显然要走的路是DirectSound或WaveIn * API函数。现在,根据我读到的内容,WaveIn API将让我填充一定大小的缓冲区,这对于录制和后期处理来说很好,但我想知道......我该如何进行实时处理? / p>

我是否使用10ms缓冲区并自己保留一个50ms或100ms的圆形阵列,并且我得到一个每10ms触发一次分析的功能? (可以访问最新的100ms输入,其中只有10ms是新的)

我在这里错过了什么吗?

另外,DirectSound是如何完成的?它是否比常规的Win32 API提供了任何改进的功能?

有帮助吗?

解决方案

DirectSound和Wave API最终都会为您提供填充了可以处理的音频数据的缓冲区。这些缓冲区的大小可以变化,但实际上,您需要将延迟保持在10mS以下才能进行有用的实时处理。这意味着处理到达缓冲区的10mS内的数据,减去它到达音频硬件和到达缓冲区之间的时间,这取决于驱动程序。出于这个原因,我建议一次处理不超过5mS的数据。

两者之间的主要架构差异在于,使用DirectSound,您可以分配一个循环缓冲区,然后由DirectSound音频驱动程序填充,而Wave API将获取一个预先分配的WAVEHDR缓冲区队列,这些缓冲区已填充,返回给应用程序,然后回收。两种API都有各种通知方法,例如窗口消息或事件。但是,对于低延迟处理,建议维护专用的流线程并等待新数据到达。

出于各种原因,我建议使用WaveSound而不是Wave API进行新的开发 - 实现更低的延迟肯定会更容易。

无论选择哪种方法进行捕获,一旦获得数据,只需将其传递给处理算法并等待下一个缓冲区准备就绪。只要您能够比到达时更快地处理数据,那么您将进行(伪)实时分析。

还有其他可能更合适的API。看一下 ASIO ,Kernel Streaming(仅适用于XP - 我不会打扰)并且,Vista中的新功能,核心音频API

其他提示

以下是C ++中程序(带源代码)的链接实时频率分析。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top