Frage

Ich beginne eine Proof of Concept für eine Idee zu schaffen, die ich habe, und an diesem Punkt, ich brauche einige Hinweise, wie ich beginnen soll.

Ich brauche den Mikrofoneingang zu probieren, und Verfahren, die in Echtzeit Signal (man denkt Auto-Tune, aber die Arbeit live), im Gegensatz zu „Aufnahme“ für eine Weile.

Was ich tue, ist „Art“ ein „Mikrofon-Eingang zu MIDI-Konverter“, so muss es ganz schnell reagieren zu können.

Ich untersuchte Online ein wenig, und anscheinend ist der Weg zu gehen entweder Directsound oder WaveIn * API-Funktionen. Nun, nach dem, was ich lese, wird die WaveIn APIs lassen Sie mich einen Puffer von einer bestimmten Größe füllen, die für die Aufnahme und Nachbearbeitung in Ordnung ist, aber ich frage mich ... Wie mache ich die Verarbeitung in Echtzeit?

Verwenden I 10ms Puffer und halten ein Kreis 50ms oder 100ms Array mich, und ich bekomme eine Funktion, die die Analyse alle 10 ms auslöst? (Das hat Zugang zu dem neuesten 100ms Eingang, von denen nur 10 ms neu)

Bin ich etwas fehlt hier?

Auch, wie ist dies mit Directsound getan? Ist es mir keine verbesserten Fähigkeiten über den regulären Win32-APIs?

War es hilfreich?

Lösung

Sowohl Directsound und das Wave-API geben Sie schließlich Puffer mit Audio-Daten gefüllt, die Sie bearbeiten können. Die Größe dieser Puffer kann variiert werden, aber realistisch gesehen werden Sie Latenz auf weniger als 10 ms für nützliche Echtzeit-Verarbeitung halten müssen. Das bedeutet, die Verarbeitung von Daten innerhalb von 10 ms davon am Puffer ankommen, minus die Zeit zwischen den es bei der Audio-Hardware ankommen und in den Puffer bekommen, die auf den Fahrer ab. Aus diesem Grunde würde ich empfehlen, eine Zeit der Verarbeitung nicht mehr als 5 ms von Daten an.

Die architektonische Hauptunterschied zwischen den beiden ist, dass mit DirectSound- Sie einen Ringpuffer zuzuweisen, die dann durch den DirectSound- Audiotreiber gefüllt wird, während die Welle API eine Warteschlange von im Voraus zugewiesenen WAVEHDR Puffern erfolgt, die gefüllt sind, um die Anwendung zurückgegeben und dann recycelt. Es gibt verschiedene Benachrichtigungsmethoden für beide APIs wie Fenstermeldungen oder Ereignisse. Doch für Low-Latency-Verarbeitung ist es wahrscheinlich ratsam, einen dedizierten Streaming-Thread und wartet auf neue Daten zu erhalten, zu gelangen.

Aus verschiedenen Gründen würde ich Directsound über den Wave-API für die Entwicklung neuer empfehlen -. Es wird sicherlich einfacher, niedrige Latenz zu erreichen

Unabhängig davon, welche Methode Sie wählen, wird die Aufnahme zu tun, sobald Sie Ihre Daten müssen Sie einfach Ihren Verarbeitungsalgorithmus übergeben Sie und für die nächsten Puffer warten, bereit zu sein. Solange Sie schneller die Daten verarbeiten kann, als es kommt dann werden Sie Ihre (Pseudo-) Echtzeitanalyse haben.

Es gibt auch alternative APIs, die besser geeignet sein kann. Hier finden Sie aktuelle ASIO , Kernel Streaming (für XP - ich würde nicht stören) und, neu in Vista, die Core Audio APIs .

Andere Tipps

Hier ist ein Link zu einem Programm rel="nofollow (mit Quelle) in C ++, das tut Echtzeitfrequenzanalyse.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top