我开始为我的想法创建一个概念证明,在这一点上,我需要一些关于如何开始的指导。
我需要对麦克风输入进行采样,并实时处理该信号(想想Auto-Tune,但是现场工作),而不是“录音”一段时间。
我正在做的是“某种”“MIDI转换器的麦克风输入”,因此需要快速响应。
我在线调查了一下,显然要走的路是DirectSound或WaveIn * API函数。现在,根据我读到的内容,WaveIn API将让我填充一定大小的缓冲区,这对于录制和后期处理来说很好,但我想知道......我该如何进行实时处理? / p>
我是否使用10ms缓冲区并自己保留一个50ms或100ms的圆形阵列,并且我得到一个每10ms触发一次分析的功能? (可以访问最新的100ms输入,其中只有10ms是新的)
我在这里错过了什么吗?
另外,DirectSound是如何完成的?它是否比常规的Win32 API提供了任何改进的功能?
答案 0 :(得分:8)
DirectSound和Wave API最终都会为您提供填充了可以处理的音频数据的缓冲区。这些缓冲区的大小可以变化,但实际上,您需要将延迟保持在10mS以下才能进行有用的实时处理。这意味着处理到达缓冲区的10mS内的数据,减去它到达音频硬件和到达缓冲区之间的时间,这取决于驱动程序。出于这个原因,我建议一次处理不超过5mS的数据。
两者之间的主要架构差异在于,使用DirectSound,您可以分配一个循环缓冲区,然后由DirectSound音频驱动程序填充,而Wave API将获取一个预先分配的WAVEHDR缓冲区队列,这些缓冲区已填充,返回给应用程序,然后回收。两种API都有各种通知方法,例如窗口消息或事件。但是,对于低延迟处理,建议维护专用的流线程并等待新数据到达。
出于各种原因,我建议使用WaveSound而不是Wave API进行新的开发 - 实现更低的延迟肯定会更容易。
无论选择哪种方法进行捕获,一旦获得数据,只需将其传递给处理算法并等待下一个缓冲区准备就绪。只要您能够比到达时更快地处理数据,那么您将进行(伪)实时分析。
还有其他可能更合适的API。看一下ASIO,Kernel Streaming(仅限XP - 我不打扰),以及Vista中的新内容Core Audio APIs。
答案 1 :(得分:1)
以下是C ++中program(带有来源)的链接,用于进行实时频率分析。