문제

나는 내가 가진 아이디어에 대한 개념 증명을 만들기 시작했고,이 시점에서 어떻게 시작 해야하는지에 대한 지침이 필요합니다.

마이크 입력을 샘플링하고 한동안 "녹음"과는 대조적으로 실시간으로 신호를 보내십시오 (자동 조정이지만 라이브로 작동)를 처리해야합니다.

내가하고있는 일은 "종류의"MIDI 변환기에 마이크 입력 "이므로 매우 빠르게 응답해야합니다.

나는 온라인으로 약간 조사했으며, 갈 길은 DirectSound 또는 Wavein* API 기능입니다. 이제 내가 읽은 내용에 따르면 Wavein API는 특정 크기의 버퍼를 채울 수있게 해줄 것이며, 이는 녹음 및 후 처리에 적합하지만 궁금합니다 ... 어떻게 실시간 처리를 수행합니까?

10ms 버퍼를 사용하고 원형 50ms 또는 100ms 어레이를 직접 유지하고 10ms마다 분석을 트리거하는 기능을 얻습니까? (최신 100ms의 입력에 액세스 할 수 있는데, 그 중 10ms 만 새로운 것)

내가 여기서 뭔가를 놓치고 있습니까?

또한 DirectSound로 어떻게 이루어 집니까? 일반 Win32 API에 비해 개선 된 기능을 제공합니까?

도움이 되었습니까?

해결책

DirectSound와 Wave API는 궁극적으로 처리 할 수있는 오디오 데이터로 채워진 버퍼를 제공합니다. 이러한 버퍼의 크기는 다양 할 수 있지만 실제로 유용한 실시간 처리를 위해 대기 시간을 10ms 미만으로 유지해야합니다. 이는 오디오 하드웨어에 도착하고 버퍼로 이동하는 시간을 빼고 버퍼에 도착하는 10ms 이내에 데이터를 처리하는 것을 의미합니다. 이는 드라이버에 따라 달라집니다. 이러한 이유로 한 번에 5ms 이상의 데이터를 처리하는 것이 좋습니다.

둘 사이의 주요 아키텍처 차이는 DirectSound를 사용하면 원형 버퍼를 할당 한 다음 DirectSound 오디오 드라이버에 의해 채워진 반면 Wave API는 채워진 사전 정리 된 WaveHDR 버퍼의 대기열을 가져와 앱으로 돌아온 다음 재활용한다는 것입니다. 창 메시지 나 이벤트와 같은 API에 대한 다양한 알림 방법이 있습니다. 그러나 낮은 격렬성 처리의 경우 전용 스트리밍 스레드를 유지하고 새로운 데이터가 도착할 때까지 기다리는 것이 좋습니다.

여러 가지 이유로 새로운 개발을 위해 Wave API를 통해 DirectSound를 권장합니다. 더 낮은 대기 시간을 달성하는 것이 더 쉽습니다.

캡처를 수행하는 방법이 있으면 데이터가 있으면 처리 알고리즘으로 전달하고 다음 버퍼가 준비되기를 기다립니다. 데이터를 더 빨리 처리 할 수있는 한 (Pseudo) 실시간 분석을 가질 수 있습니다.

더 적합 할 수있는 대체 API도 있습니다. 살펴보십시오 ASIO, 커널 스트리밍 (XP 만 - 나는 귀찮게하지 않을 것입니다). 핵심 오디오 API.

다른 팁

다음은 a에 대한 링크입니다 프로그램 실시간 주파수 분석을 수행하는 C ++의 (소스 포함).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top